2021-11-11Mybatis 3

Lombok

1.在idea中下载Lombok 插件
2.导入依赖

 <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

在这里插入图片描述
@Data 无参构造器 get set tostring hashcode equals
@AllArgsConstructor 有参构造器
@NoArgsConstructor。无参构造器

一对多 多对一

association 联系对象。 javaType 用来指定实体类中属性的类型
collection 集合. ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!
创建实体类
建立mapper接口
建立mapper.xml文件
在核心配置文件中配置mapper
测试
多对一
按照查询嵌套处理
建立mapper.xml文件

<mapper>
			<resultMap id="map">
			     <id column = "id" property="id"></id>
			     <result column = "name" property="name"></result>
			      <result column = "pwd" property="pwd"></result>
			      <association property="teacher" column = "tid" javaType="Teacher" select="getTeacher"/>
			</resultMap>
			<select id = "getStudent"  resultMap="map">
               select * from student
			</select>
			<select id = "getTeacher"  resultType="teacher">
               select * from teacher where id = #{id}
			</select>
</mapper>

按照结果嵌套查询

<mapper>
			<resultMap id="map">
			     <id column = "sid" property="id"></id>
			     <result column = "sname" property="name"></result>
			     **javaType指定属性的类型**
			      <association  property="teacher" javaType="Teacher" />
			          <result column = "tname" property="name"></result>
			</resultMap>
			<select id = "getStudent2"  resultMap="map">
               select s.id sid,s.name sname,t.name tname from student s,teacher t
               where s.tid=t.tid
			</select>
</mapper>

一对多
实体类
@Data
public class Teacher {

private int id;
private String name;
private List<Student> students;

}

mapper
按照结果嵌套处理

<mapper namespace="com.zxw.dao.UserMapper">
   <resultMap id="map" type="com.zxw.pojo.Teacher">
       <result column="tid" property="id"/>
       <result column="tname" property="name"/>
       **collection集合中的泛型信息 使用ofType获取**
       <collection property="students" ofType="Student">
           <result column="sid" property="id" />
           <result column="sname" property="name"/>
       </collection>
   </resultMap>
    <select id="getStudent" resultMap="map">
       select s.is sid,s.name sname,t.name tname,t.id tid from teacher s,student t where s.tid = t.tid and t.id =#{tid}
   </select>
</mapper>

按照查询嵌套处理

<mapper namespace="com.zxw.dao.UserMapper">
   <resultMap id="map" type="com.zxw.pojo.Teacher">
       <collection property="studens" javaType="ArrayList" ofType="Student" select="getstudentbyid" column="tid"/>
   </resultMap>
    <select id="getteacher" resultMap="map">
       select * from teacher where id = #{tid}
   </select>
    <select id="getstudentbyid" resultType="Student">
        select * from student where tid = #{tid}
    </select>
</mapper>

动态sql

在这里插入图片描述

在sql层执行一个逻辑代码
根据不同的条件获得不同的sql语句
if
choose(when otherwise)
trim.(where set)
foreach

UUID在这里插入图片描述
if
在这里插入图片描述
choose when otherwise
在这里插入图片描述
相当于 switch 只选择一个条件执行
当满足第一个条件时就执行第一条不会管后面的 otherwise。当以上条件都不满足时 执行什么
在这里插入图片描述

trim. where set
where 元素只会在至少有一个子元素的条件返回sql子句的情况下去插入 where子句 开头为and or where标签会把它去掉什么参数都没有 就会把where去掉
set元素会动态前置set关键字,同时也会删掉无关的逗号。多个属性
在这里插入图片描述
trim prefix=“where” 前缀 prefixOverrides=“AND |or” 移除prefixOverrides中指定的内容 添加 prefix指定的内容。如果前缀中有and、空格、|、 or就去掉 在前缀添加where suffix suffixOverrides 后缀同理

foreach
select * from user where 1=1 and (id=2 or id=3 or id=4)
在这里插入图片描述
在这里插入图片描述

sql片段
将公共的部分抽取出来,方便复用,用sql标签抽取,用include标签引用
最好基于单表来定义sql片段
不要存在where标签

在这里插入图片描述

缓存

经常查询且不改变的数据可以使用缓存
mybatis缓存

一级缓存
本地会话缓存
sqlsession级别
开启日志
测试在一个session中查询两次相同记录
查看日志输出

缓存失效的情况:
查询不同的记录
增删改可能会改变原来的数据所以必定会刷新缓存
查询不同的mapper.xml
手动清理缓存。sqSession.clearCache();
一级缓存默认是开启的 只在一次sqlsession中有效,也就是拿到连接到关闭连接这个区间段
二级缓存
在这里插入图片描述

1.开启全局缓存
在配置文件mybatis-config.xml中

使用缓存
在mapper.xml中添加 cache标签
在这里插入图片描述
测试
需要将实体类序列化
否则就会报错

只要开启了二级缓存,在同一个mapper下就有效
所有的数据都会放在一级缓存中
只有当回话提交或者关闭的时候才会提交到二级缓存
存放缓存顺序: 数据库 一级缓存 二级缓存
查询缓存顺序: 二级缓存 一级缓存 数据库

自定义缓存

实现cache接口
ehcache.xml
ehcache 分布式缓存
redis数据库来做缓存
要先导包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值