Notas de estudio de Java-Day76 marco MyBatis (tres)



Uno, escriba alias


Los alias de tipo pueden establecer un nombre abreviado para un tipo de Java. Solo se utiliza para la configuración XML y está destinado a reducir la escritura redundante de nombres de clases totalmente calificados. Se <typeAliases>colocará en el archivo de configuración de mybatis <configuration>. Después de la configuración, Goods se puede utilizar en lugar de cualquier lugar donde se utilice com.etc.entity.Goods.

  <typeAliases>
  	<typeAlias type="com.etc.entity.Goods" alias="Goods"/>
  	<typeAlias type="com.etc.entity.GoodsType" alias="GoodsType"/>
  </typeAliases>

En segundo lugar, la diferencia entre # y $ en MyBatis

elemento # PS
Coincidencia de tipo #: Estará precompilado y con coincidencia de tipos. $: Sin coincidencia de tipos de datos
Reemplazar o empalmar #: Se utiliza para la sustitución de variables $: Esencialmente empalme de cuerdas
Escenas Se debe usar la transmisión de variables #, y usarla #{}equivale a usar la forma de marcador de posición de PrepareStatement, que mejora la eficiencia. Puede prevenir la inyección de SQL y otros problemas. #El método se usa generalmente para pasar el valor agregado, modificado o la consulta, eliminar el valor de id de condición where $Es solo un simple empalme de cadenas. Tenga especial cuidado con la inyección SQL. Correspondiente a la parte no variable, solo se puede usar $. $El método se usa generalmente para pasar objetos de base de datos, como agrupar por campos, ordenar por campos, nombres de tablas, nombres de campos, etc. Si no puede usar marcadores de posición, debe usar $ {}

Tres, caché MyBatis


MyBatis tiene incorporado un poderoso mecanismo de caché de consultas transaccionales, que se puede configurar y personalizar fácilmente. De forma predeterminada, solo está habilitada la caché de sesión local, que solo almacena en caché los datos en una sesión. Para habilitar la caché global de segundo nivel, solo necesita agregar una línea a su archivo de mapeo SQL <cache>.

1. Caché de nivel 1


La caché de primer nivel (caché local) es una caché de nivel de sesión, que está habilitada de forma predeterminada. Si una sesión realiza una operación de consulta, colocará el resultado de la operación de consulta en la caché de primer nivel. Si la sesión realiza la misma operación de consulta en un período corto de tiempo, se recuperará directamente del primer nivel. nivel de caché en lugar de Ir a la base de datos para obtener los datos. Debe ser una operación dentro del alcance de la misma sesión para obtener los datos en la caché de primer nivel.

Los siguientes son dos casos de caché de primer nivel:

  • Caso 1: La misma sesión, el mismo Mapper.
  • Caso 2: La misma sesión, diferentes Mappers.
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);
	}
}

Inserte la descripción de la imagen aquí

2. Caché de nivel 2


Solo las operaciones dentro del alcance de diferentes sesiones pueden obtener los datos en la caché secundaria. La caché secundaria no está habilitada de forma predeterminada.
  

Pasos para habilitar la caché secundaria:

(1) agregar una línea en el archivo de mapeo <cache/>para habilitar la caché L2 global.

<cache/>El efecto de la declaración es el siguiente:

  • Los resultados de todas las sentencias de selección en el archivo de sentencias de mapeo se almacenarán en caché.
  • Todas las declaraciones de inserción, actualización y eliminación en el archivo de declaración asignado actualizarán la memoria caché.
  • La caché utilizará el algoritmo menos utilizado recientemente (LRU, Least Recent Used) para borrar la caché innecesaria.
  • La caché no se actualiza con regularidad (es decir, no hay intervalo de actualización).
  • La caché contendrá 1024 referencias a listas u objetos (independientemente del método de consulta que devuelva).
  • La caché se considera una caché de lectura / escritura, lo que significa que el objeto adquirido no se comparte y la persona que llama puede modificarlo de forma segura sin interferir con las posibles modificaciones realizadas por otras personas que llaman o subprocesos.
<?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 clase de entidad implementa la interfaz de serialización.

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) uso session.commit();enviado a una sesión.

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);
	}
}

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_42141141/article/details/114379589
Recomendado
Clasificación