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.
- Definir trechos de código
<!-- 抽取重复的语句代码片段 --> <sql id="defaultSql">
select * from user
</sql>
- 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>
- Use anotações para configurar o cache de segundo nível na interface da camada de persistência
@CacheNamespace(blocking=true)
public interface IUserDao {}