Notes d'étude Java-Day76 MyBatis Framework (trois)
Un, tapez alias
Les alias de type peuvent définir un nom abrégé pour un type Java. Il n'est utilisé que pour la configuration XML et vise à réduire l'écriture redondante de noms de classe pleinement qualifiés. A <typeAliases>
placer dans le fichier de configuration mybatis <configuration>
. Après la configuration, les marchandises peuvent être utilisées à la place de n'importe quel endroit où com.etc.entity.Goods est utilisé.
<typeAliases>
<typeAlias type="com.etc.entity.Goods" alias="Goods"/>
<typeAlias type="com.etc.entity.GoodsType" alias="GoodsType"/>
</typeAliases>
Deuxièmement, la différence entre # et $ dans MyBatis
élément | # | $ |
---|---|---|
Correspondance de type | # : Sera pré-compilé et correspondance de type |
$ : Pas de correspondance de type de données |
Remplacer ou épisser | # : Utilisé pour la substitution de variables |
$ : Essentiellement l'épissage de chaîne |
Scènes | La transmission de variables doit être utilisée # , et son utilisation #{} équivaut à utiliser la forme d'espace réservé de PrepareStatement, ce qui améliore l'efficacité. Peut empêcher l'injection SQL et d'autres problèmes. # La méthode est généralement utilisée pour transmettre la valeur ou la requête ajoutée ou modifiée, supprimer la valeur de l'identifiant de la condition where |
$ C'est juste un simple épissage de chaîne. Faites particulièrement attention à l'injection SQL. Correspondant à la partie non variable, il ne peut être utilisé $ . $ La méthode est généralement utilisée pour transmettre des objets de base de données, tels que groupe par champs, ordre par champs, noms de table, noms de champ, etc. Si vous ne pouvez pas utiliser d'espaces réservés, vous devez utiliser $ {} |
Trois, cache MyBatis
MyBatis intègre un puissant mécanisme de cache de requêtes transactionnelles, qui peut être facilement configuré et personnalisé. Par défaut, seul le cache de session local est activé, qui ne met en cache les données que dans une session. Pour activer le cache global de deuxième niveau, il vous suffit d'ajouter une ligne à votre fichier de mappage SQL <cache>
.
1. Cache de niveau 1
Le cache de premier niveau (cache local) est un cache de niveau session, qui est activé par défaut. Si une session effectue une opération de requête, elle placera le résultat de l’opération de requête dans le cache de premier niveau. Si la même opération de requête est effectuée par la session dans un court laps de temps, elle sera directement extraite du premier. cache de niveau au lieu de Aller à la base de données pour obtenir les données. Il doit s'agir d'une opération dans le cadre de la même session pour obtenir les données dans le cache de premier niveau.
Voici deux cas de cache de premier niveau:
- Cas 1: la même session, le même mappeur.
- Cas 2: la même session, différents mappeurs.
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. Cache de niveau 2
Seules les opérations dans le cadre de différentes sessions peuvent obtenir les données dans le cache secondaire. Le cache secondaire n'est pas activé par défaut.
Étapes pour activer le cache secondaire:
(1) ajout d'une ligne dans le fichier de mappage <cache/>
pour activer le cache L2 global.
<cache/>
L'effet de la déclaration est le suivant:
- Les résultats de toutes les instructions select dans le fichier d'instructions de mappage seront mis en cache.
- Toutes les instructions d'insertion, de mise à jour et de suppression dans le fichier d'instructions mappé actualiseront le cache.
- Le cache utilisera l'algorithme le moins récemment utilisé (LRU, le moins récemment utilisé) pour effacer le cache inutile.
- Le cache n'est pas actualisé régulièrement (c'est-à-dire qu'il n'y a pas d'intervalle d'actualisation).
- Le cache contiendra 1024 références à des listes ou des objets (quelle que soit la méthode de requête renvoyée).
- Le cache est considéré comme un cache de lecture / écriture, ce qui signifie que l'objet acquis n'est pas partagé et peut être modifié en toute sécurité par l'appelant sans interférer avec les modifications potentielles apportées par d'autres appelants ou threads.
<?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) La classe d'entité implémente l'interface de sérialisation.
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) utilisation session.commit();
soumise à une session.
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);
}
}