MyBatis(3)

自作多情 提交于 2020-03-17 03:29:32

1.MyBatis的逆向工程

MyBatis逆向工程可以根据表创建对应的POJO类、Mapper接口、SQL映射文件。MyBatis是通过MyBatis Generator【MyBatis生成器:简称MBG】来实现逆向工程的。
MyBatis逆向工程缺点:只能处理单表!

2.MyBatis基于注解的增删改查

MyBatis支持基于xml的SQL语句,也支持基于注解的SQL语句。
基于xml标签

  • Insert:往数据表中插入数据
  • Select:从数据表中查询数据
  • Delete:删除数据表的数据
  • Update:更新数据表中的数据

关联查询

  • resultMap标签
  • result标签:普通字段映射
  • association标签:处理对一的关联关系
  • collection标签:处理对多的关联关系

常用注解:

  • @insert: 代替insert标签
  • @Select:代替原来select标签
  • @delete:代替原来的delete标签
  • @update:代替原来的update标签

关联查询

  • @results:代替原来的resultMap标签
  • @Result:代替result标签
  • @one:代替原来的association标签
  • @Many:代替原来的collection标签

关联查询:
X对一的关联关系【2种解决方案】
需求:在查询员工信息的时候,顺带着将员工所属的部门信息也查询出来。
第一种方式:

@Select("SELECT e.`eid`,e.`ename`,d.`did`,d.`dname` FROM employee e LEFT JOIN dept d ON e.dd =d.`did` WHERE e.eid= #{eid}")
@Results({
	@Result(column="eid",property="eid"),
	@Result(column="ename",property="ename"),
	@Result(column="did",property="dept.did"),
	@Result(column="dname",property="dept.deptName")
})
public Employee getEmployeeWithDeptByEid(Integer eid);

第二种方式:分步查询

@Select("SELECT eid,ename,dd FROM employee  WHERE eid= #{eid}")
@Results({
	@Result(column="eid",property="eid"),
	@Result(column="ename",property="ename"),
	
	@Result(column="dd",one=@One(select="getDeptByDid"),property="dept")
})
public Employee getEmployeeWithDeptByEid(Integer eid);


@Select("SELECT did,dname deptName FROM dept WHERE did = #{did}")
public Dept getDeptByDid(Integer did);

x 对多的关联映射【1种解决方案】
需求:在查询部门信息的时候,同时将该部门下所有的员工信息查询出来
第一种:分步查询
DeptMapper接口:

@Select("SELECT did,dname FROM dept  WHERE did = #{did}")
	@Results({
		@Result(column="did",property="did"),
		@Result(column="dname",property="deptName"),
		@Result(column="did",property="emps",many=@Many(select="com.offcn.dao.EmployeeMapper.getEmployeeByDid"))
	})
	public Dept getDeptWithEmpsByDid(Integer did);

EmployeeMapper接口

@Select("SELECT eid,ename FROM employee  WHERE dd =#{did}")
	Employee getEmployeeByDid(Integer did);

3.MyBatis的缓存

缓存是为了加快查询效率的,MyBatis自带了缓存机制。MyBatis里面有一级缓存和二级缓存。
一级缓存:SqlSession缓存:,默认是开启
二级缓存:Mapper【namespace】级别,默认是关闭的,需要手动开启。

3.1一级缓存

在这里插入图片描述

  • MyBatis一级缓存失效的四种情况:
    • 1.SqlSession对象不同
    • 2.SqlSession对象相同,查询条件不同
    • 3.SqlSession对象相同,查询条件也相同,在两次查询之间进行了增删改操作
    • 4.SqlSession对象相同,查询条件也相同,在两次查询之间手动清理了缓存

3.2二级缓存

在这里插入图片描述
MyBatis的二级缓存使用有四个条件:
1.在mybatis的全局配置文件中开启全局二级缓存

 <!-- 开启全局二级缓存 -->
  <setting name="cacheEnabled " value="true"/>

2.在mapper接口对应的sql映射文件中加一个cache标签

3.放入到二级缓存中的pojo对象必须实现序列化接口

4.必须是在一级缓存关闭的情况下,一级缓存中的数据才会跑到二级缓存中。
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!