Java研究ノート-Day76MyBatisフレームワーク(3)
1つは、エイリアスを入力します
型エイリアスは、Java型の省略名を設定できます。これはXML構成にのみ使用され、完全修飾クラス名の冗長な書き込みを減らすことを目的としています。するために、<typeAliases>
MyBatisの設定ファイルに配置<configuration>
。構成後、com.etc.entity.Goodsが使用される場所の代わりにGoodsを使用できます。
<typeAliases>
<typeAlias type="com.etc.entity.Goods" alias="Goods"/>
<typeAlias type="com.etc.entity.GoodsType" alias="GoodsType"/>
</typeAliases>
第二に、MyBatisの#と$の違い
素子 | # | $ |
---|---|---|
タイプマッチ | # :プリコンパイルされ、タイプマッチングされます |
$ :データ型が一致しません |
交換またはスプライス | # :変数の置換に使用 |
$ :本質的にストリングスプライシング |
シーン | 変数の送信を使用する必要があります# 。これを使用#{} することは、PrepareStatementのプレースホルダー形式を使用することと同等であり、効率が向上します。SQLインジェクションやその他の問題を防ぐことができます。# このメソッドは通常、追加、変更された値またはクエリを渡し、where条件ID値を削除するために使用されます |
$ 単純な文字列のスプライシングです。SQLインジェクションには特に注意してください。非可変部分に対応して、使用することしかできません$ 。$ このメソッドは通常、group byフィールド、order byフィールド、テーブル名、フィールド名などのデータベースオブジェクトを渡すために使用されます。プレースホルダーを使用できない場合は、$ {}を使用する必要があります。 |
3、MyBatisキャッシュ
MyBatisには強力なトランザクションクエリキャッシュメカニズムが組み込まれており、簡単に構成およびカスタマイズできます。デフォルトでは、ローカルセッションキャッシュのみが有効になっており、1つのセッションのデータのみがキャッシュされます。グローバルな第2レベルのキャッシュを有効にするには、SQLマッピングファイルに行を追加するだけです<cache>
。
1.レベル1キャッシュ
第1レベルのキャッシュ(ローカルキャッシュ)はセッションレベルのキャッシュであり、デフォルトで有効になっています。セッションがクエリ操作を実行すると、クエリ操作の結果が第1レベルのキャッシュに格納されます。同じクエリ操作がセッションによって短時間で実行された場合、最初のキャッシュから直接取得されます。データベースに移動してデータを取得する代わりに、レベルキャッシュ。第1レベルのキャッシュ内のデータを取得するには、同じセッションのスコープ内の操作である必要があります。
以下は、第1レベルのキャッシュの2つのケースです。
- ケース1:同じセッション、同じマッパー。
- ケース2:同じセッション、異なるマッパー。
package com.etc.test;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.etc.dao.GoodsMapper;
import com.etc.entity.Goods;
public class TestGoodsSelectCache {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
GoodsMapper mapper = session.getMapper(GoodsMapper.class);
Goods goods = mapper.selectGoodsById(1);
// 一级缓存
System.out.println("*********一级缓存(同一个session,同一个mapper)***********");
Goods goods1 = mapper.selectGoodsById(1);
System.out.println(goods);
System.out.println(goods1);
System.out.println("*********一级缓存(同一个session,不同mapper)***********");
// 一级缓存
GoodsMapper mapper2 = session.getMapper(GoodsMapper.class);
Goods goods2 = mapper2.selectGoodsById(1);
System.out.println(goods2);
}
}
2.レベル2キャッシュ
異なるセッションのスコープ内の操作のみが、セカンダリキャッシュのデータを取得できます。セカンダリキャッシュはデフォルトでは有効になっていません。
セカンダリキャッシュを有効にする手順:
(1)マッピングファイル<cache/>
に行を追加して、グローバルL2キャッシュを有効にします。
<cache/>
ステートメントの効果は次のとおりです。
- マッピングステートメントファイル内のすべてのselectステートメントの結果がキャッシュされます。
- マップされたステートメントファイル内のすべての挿入、更新、および削除ステートメントは、キャッシュを更新します。
- キャッシュは、最も使用頻度の低いアルゴリズム(LRU、最近使用されていないアルゴリズム)アルゴリズムを使用して、不要なキャッシュをクリアします。
- キャッシュは定期的に更新されません(つまり、更新間隔はありません)。
- キャッシュは、リストまたはオブジェクトへの1024の参照を保持します(どのクエリメソッドが返されるかに関係なく)。
- キャッシュは読み取り/書き込みキャッシュと見なされます。つまり、取得したオブジェクトは共有されず、他の呼び出し元またはスレッドによる変更の可能性を妨げることなく、呼び出し元が安全に変更できます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.etc.dao.GoodsMapper">
<resultMap id="GoodsResultMap" type="Goods">
<id column="goodsid" property="goodsid" />
<result column="goodsname" property="goodsname" />
<result column="goodsprice" property="goodsprice" />
<result column="goodsinfo" property="goodsinfo" />
<result column="goodscount" property="goodscount" />
<result column="cover" property="cover" />
<result column="typeid" property="typeid" />
<result column="shopid" property="shopid" />
<result column="goodsstate" property="goodsstate" />
<!-- 关联一个GoodsType对象 -->
<association property="goodstype" column="typeid" javaType="GoodsType">
<id column="typeid" property="typeid" />
<result column="typename" property="typename" />
<result column="typeinfo" property="typeinfo" />
</association>
</resultMap>
<select id="selectGoodsById" resultMap="GoodsResultMap">
select * from tbl_goods
inner join tbl_goodstype on tbl_goods.typeid=tbl_goodstype.typeid
where tbl_goods.goodsid=#{
goodsid}
</select>
<cache></cache>
</mapper>
(2)エンティティクラスはシリアル化インターフェイスを実装します。
package com.etc.entity;
import java.io.Serializable;
public class Goods implements Serializable {
private int goodsid;
private String goodsname;
private Double goodsprice;
private String goodsinfo;
private int goodscount;
private String cover;
private int typeid;
private int shopid;
private int goodsstate;
private GoodsType goodstype;
public Goods(int goodsid, String goodsname, Double goodsprice, String goodsinfo, int goodscount,
String cover, int typeid, int shopid, int goodsstate, Goods goods) {
super();
this.goodsid = goodsid;
this.goodsname = goodsname;
this.goodsprice = goodsprice;
this.goodsinfo = goodsinfo;
this.goodscount = goodscount;
this.cover = cover;
this.typeid = typeid;
this.shopid = shopid;
this.goodsstate = goodsstate;
}
public Goods() {
super();
}
public GoodsType getGoodstype() {
return goodstype;
}
public void setGoodstype(GoodsType goodstype) {
this.goodstype = goodstype;
}
public int getGoodsid() {
return goodsid;
}
public void setGoodsid(int goodsid) {
this.goodsid = goodsid;
}
public String getGoodsname() {
return goodsname;
}
public void setGoodsname(String goodsname) {
this.goodsname = goodsname == null ? null : goodsname.trim();
}
public Double getGoodsprice() {
return goodsprice;
}
public void setGoodsprice(Double goodsprice) {
this.goodsprice = goodsprice;
}
public String getGoodsinfo() {
return goodsinfo;
}
public void setGoodsinfo(String goodsinfo) {
this.goodsinfo = goodsinfo == null ? null : goodsinfo.trim();
}
public int getGoodscount() {
return goodscount;
}
public void setGoodscount(int goodscount) {
this.goodscount = goodscount;
}
public String getCover() {
return cover;
}
public void setCover(String cover) {
this.cover = cover == null ? null : cover.trim();
}
public int getTypeid() {
return typeid;
}
public void setTypeid(int typeid) {
this.typeid = typeid;
}
public int getShopid() {
return shopid;
}
public void setShopid(int shopid) {
this.shopid = shopid;
}
public int getGoodsstate() {
return goodsstate;
}
public void setGoodsstate(int goodsstate) {
this.goodsstate = goodsstate;
}
@Override
public String toString() {
return "Goods [goodsid=" + goodsid + ", goodsname=" + goodsname + ", goodsprice=" + goodsprice + ", goodsinfo="
+ goodsinfo + ", goodscount=" + goodscount + ", cover=" + cover + ", typeid=" + typeid + ", shopid="
+ shopid + ", goodsstate=" + goodsstate + ", goodstype=" + goodstype + "]";
}
}
(3)session.commit();
セッションに提出された使用。
package com.etc.test;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.etc.dao.GoodsMapper;
import com.etc.entity.Goods;
public class TestGoodsSelectCache {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
GoodsMapper mapper = session.getMapper(GoodsMapper.class);
Goods goods = mapper.selectGoodsById(1);
System.out.println(goods);
session.commit();//让二级缓存生效
// 二级缓存
System.out.println("*********二级缓存(不同的session)***********");
SqlSession session2 = sqlSessionFactory.openSession();
GoodsMapper mapper2 = session2.getMapper(GoodsMapper.class);
Goods goods2 = mapper.selectGoodsById(1);
System.out.println(goods2);
}
}