Atraso e cache de Mybatis com base em anotações e XML

Snippet SQL para gravação simplificada no SQL Mybatis dinâmico

O sql repetido pode ser extraído no Sql, use include reference ao usar e, finalmente, atinja a finalidade de reutilização do sql.

  1. Definir trechos de código
<!-- 抽取重复的语句代码片段 --> <sql id="defaultSql">
select * from user
</sql>
  1. Citando trechos de código
<!-- 配置查询所有操作 -->
 <select id="findAll" resultType="user"> <include refid="defaultSql"></include>
</select>
<!-- 根据 id 查询 --> <select id="findById" resultType="UsEr" parameterType="int">

<include refid="defaultSql"></include>
where id = #{uid}
</select>

declaração SQL dinâmica

<select id="findByUser" resultType="user" parameterType="user">
select * from user where 1=1
<if test="username!=null and username != '' ">
and username like #{username}
</if> 
<if test="address != null">
and address like #{address}
</if>
</select>

Nota: O atributo de teste do rótulo é o nome do atributo do objeto.Se for um objeto da classe de empacotamento, use a expressão OGNL # {user.username}.

Para simplificar a montagem condicional de onde 1 = 1 acima, podemos usar a tag where para simplificar o desenvolvimento.

<!-- 根据用户信息查询 --> <select id="findByUser" resultType="user" parameterType="user"> 
<include refid="defaultSql"></include> 
<where>
 <if test="username!=null and username != '' ">
and username like #{username}
</if>
 <if test="address != null">
and address like #{address}
</if>
</where>
</select>

Ao executar consultas de intervalo, é necessário adicionar dinamicamente os valores em uma coleção como parâmetros.

<!-- 查询所有用户在 id 的集合之中 -->
 <select id="findInIds" resultType="user" parameterType="queryvo">
<!-- select * from user where id in (1,2,3,4,5); -->
 <include refid="defaultSql"></include> 
 <where> 
 <if test="ids != null and ids.size() > 0">
  <foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>

<foreach>标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符

Carregamento lento Carregamento
lento: o carregamento
é realizado apenas quando são necessários dados e os dados não são carregados quando não são necessários. O carregamento lento também é chamado de carregamento
lento.Vantagens: primeira consulta a partir de uma única tabela e, em seguida, a partir da tabela associada, quando necessário, melhorando bastante o desempenho do banco de dados, porque consultar uma única tabela é mais rápido que várias tabelas relacionadas à consulta.
Desvantagens:
como a consulta ao banco de dados será realizada apenas quando os dados forem necessários, portanto, ao consultar uma grande quantidade de dados, porque o trabalho da consulta também consome tempo, isso pode levar o usuário a esperar mais, resultando em um declínio na experiência do usuário.

O uso da associação para implementar o carregamento lento
é apenas para consultar o objeto Account e colocá-lo na coleção List. Não há objeto User envolvido, portanto, não há consulta para emitir uma instrução SQL para consultar o objeto User associado à conta.

<mapper namespace="com.itheima.dao.IAccountDao">
<!-- 建立对应关系 --> <resultMap type="account" id="accountMap"> 
<id column="aid" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
<!-- 它是用于指定从表方的引用实体属性的 --> 
<association property="user" javaType="user" select="com.itheima.dao.IUserDao.findById" column="uid">
</association>
</resultMap> 

<select id="findAll" resultMap="accountMap">
select * from account
</select>
</mapper>
select: 填写我们要调用的 select 映射的 id 
column : 填写我们要传递给 select 映射的参数

O atraso de ativação deve ser definido no arquivo SqlMapConfig.xml

<settings> <setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>//可省略
</settings>

Usar coleção para carregamento lento

<resultMap type="user" id="userMap">
 <id column="id" property="id"></id> <result column="username" property="username"/>
<result column="address" property="address"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<!-- collection 是用于建立一对多中集合属性的对应关系
ofType 用于指定集合元素的数据类型
select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)
column 是用于指定使用哪个字段的值作为条件查询--> 
<collection property="accounts" ofType="account" select="com.itheima.dao.IAccountDao.findByUid" column="id">
</collection>
</resultMap>
<!-- 配置查询所有操作 --> <select id="findAll" resultMap="userMap">
select * from user
</select>

Cache de primeiro nível
Mybatis Se o sqlSession executar operações de confirmação (executar inserções, atualizações e exclusões), o cache de primeiro nível no SqlSession é limpo.O objetivo é manter as informações mais recentes armazenadas no cache e evitar leituras sujas.
sqlSession.close () fulsh () clearCache (); pode limpar o cache

Consultamos duas vezes, mas apenas uma operação de banco de dados foi realizada no final.Este é
o cache de primeiro nível fornecido por Mybatis . Devido à existência do cache de primeiro nível, a segunda consulta de registros com o mesmo ID não emitiu uma instrução sql para consultar dados do banco de dados, mas do cache de primeiro nível.
Cache de segundo nível Mybatis O cache de
segundo nível armazena dados não é um objeto.Quando usamos o cache de segundo nível, a classe em cache deve implementar a interface java.io.Serializable, que pode usar serialização para salvar objetos.
O cache de segundo nível é um cache no nível do mapeador.Várias SqlSessions operam na mesma instrução SQL mapeada pelo mesmo Mapeador.Múltiplas SqlSessions podem compartilhar o cache de segundo nível.O cache do segundo nível é através de SqlSessions.

O sqlSession1 consulta as informações do usuário e as informações do usuário armazenam os dados da consulta no cache secundário.
Se o SqlSession3 executar o SQL no mesmo mapa do mapeador e confirmar, os dados na área de cache de segundo nível no mapa do mapeador serão limpos.
O sqlSession2, para consultar as mesmas informações do usuário que o sqlSession1, irá primeiro ao cache para descobrir se há dados, se houver dados diretamente do cache.

Abrir o cache
1. Abra o cache secundário no arquivo SqlMapConfig.xml

<settings>
<!-- 开启二级缓存的支持 --> 
<setting name="cacheEnabled" value="true"/>
</settings>
因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为false 代表不开启二级缓存

2. Configure o arquivo de mapeamento do Mapper relacionado

<cache>标签表示当前这个 mapper 映射将使用二级缓存,区分的标准就看 mapper 的 namespace 值。

<?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.itheima.dao.IUserDao">
<!-- 开启二级缓存的支持 -->
<cache></cache>
</mapper>

3. Configure o atributo useCache na instrução

<!-- 根据 id 查询 --> <select id="findById" resultType="user" parameterType="int" useCache="true">
select * from user where id = #{uid}
</select> 将 UserDao.xml 映射文件中的<select>标签中设置 useCache=”true”代表当前这个 statement 要使用二级缓存,如果不使用二级缓存可以设置为 false。
注意:针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。

O uso das anotações
@Insert: implementar nova
@Update: atualizar atualização
@Delete: implementar excluir
@Selecionar: implementar consulta
@Result: implementar encapsulamento de conjunto de resultados
@Results: pode ser usado com @Result para encapsular vários conjuntos de resultados
@ResultMap: Implementação Consulte o pacote definido por
@Results @One: implemente o encapsulamento de conjunto de resultados um a um
@Many: implemente o encapsulamento de um a muitos conjuntos de resultados
@SelectProvider: implemente o mapeamento dinâmico de SQL
@CacheNamespace: implemente o uso do cache secundário anotado

@Results 注解
代替的是标签<resultMap>
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
@Results({@Result(),@Result()})或@Results(@Result())

@Resutl 注解
代替了 <id>标签和<result>标签
@Result 中 属性介绍:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))

@One 注解(一对一)
代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
select 指定用来多表查询的 sqlmapper 
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。。
使用格式:
@Result(column=" ",property="",one=@One(select="") fetchType=FetchType.LAZY)

@Many 注解(多对一)
代替了<Collection>标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义;
使用格式:
@Result(property="",column="",many=@Many(select="") fetchType=FetchType.LAZY)

Anotação @ResultMap:

@Select("select * from user")
@Results(id="userMap",
value= {
@Result(id=true,column="id",property="userId"),
@Result(column="username",property="userName"),
@Result(column="sex",property="userSex"),
@Result(column="address",property="userAddress"),
@Result(column="birthday",property="userBirthday")
})
List<User> findAll();
/**
* 根据 id 查询一个用户
* @param userId
* @return
*/
@Select("select * from user where id = #{uid} ")
@ResultMap("userMap")
User findById(Integer userId);

A configuração do cache de segundo nível na nota
1. Ative o suporte ao cache de segundo nível no SqlMapConfig

<!-- 配置二级缓存 --> <settings>
<!-- 开启二级缓存的支持 --> <setting name="cacheEnabled" value="true"/>
</settings>
  1. Use anotações para configurar o cache de segundo nível na interface da camada de persistência
@CacheNamespace(blocking=true)
public interface IUserDao {}
Publicado 43 artigos originais · elogiou 2 · visitas 996

Acho que você gosta

Origin blog.csdn.net/study_azhuo/article/details/105436852
Recomendado
Clasificación