mapper映射包含两部分:
1.执行sql语句
2.封装结果的实体类类型
然后把这两个信息组合起来,以map存储
key是namespace+id
value是mapper对象(包含String的sql、entity)
代理对象的生成:
类加载器:它使用和被代理对象相同的类加载器
代理对象实现的接口和被代理对象一样
如何代理:他就是增强的方法,我们要提供,这里是一个InvocationHandler的接口
我们需要写一个该接口的实现类,在实现类中调用selectList方法
Mapper映射配置中sql语句的书写是无关大小写的
Mybatis动态sql查询
mybatis操作
1-1
1-n
m-n:多对多查询时,不同表中相同的字段名需要起别名,否则封装时会出问题
JNDI:
java naming and directory interface是SUN公司推出的一套规范,属于javaEE技术
是模仿windows系统的注册表,功能:在服务器中注册数据源
查询的时机:
延时加载
在真正使用数据时才发起查询 ,也叫按需加载、懒加载
立即加载
管用不用,马上发起查询
其实加载机制是根据关系来查询的,有四种关系:
一对一,多对一:通常立即加载
一对多,多对多:通常延迟加载
Mybatis的缓存
为什么使用缓存
减少与数据库之间的交互次数,提高执行效率
什么样的数据需要使用缓存
适用于缓存:经常查询且不经常修改
数据的正确与否对最终结果影响不大的
一级缓存:
存储于SqlSession对象的缓存,将查询到的数据存到sqlSession中的
一块区域,这个区域的结构是Map,当sqlSession消失时一级缓存就会消失
SqlSession除了关闭之外可以清空缓存之外,还可以通过一个方法clearCache
一级缓存何时触发:
一级缓存是sqlSession范围的缓存,当调用sqlSession的添加,修改,删除,commit(),close()等方法
时,就会清除一级缓存
二级缓存:
存储于SqlSessionFactory对象中的缓存,是由一个SqlSessionFactory创建的SqlSession对象共享其缓存
二级缓存的使用(实体类要实现序列化接口):
第一步:让mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)
第三步:让当前的操作支持二级缓存(在select标签中配置)
结果:根据id查询的同一个的对象是false,是因为二级缓存中存的是数据,只是做了重新赋值而已
在Mybatis中针对CRUD的注解一共有四个:
@Select @Update @Insert @Delete
在使用注解开发时不能存在xml映射文件
结果集映射使用@Results和@Result组合,关联查询使用@One或者@Many,fetchType是加载类型的设置
结果集有id属性,示范@ResultMap(value = "accountMap")
解决查询结果的封装问题,问题来源:实体类属性名和数据库字段名不同
@CacheNamespace(blocking = true)用来开启二级缓存
关联:
@Result(property = "accounts",column = "id",many =
@Many(select = "com.kali.dao.IAccountDao.findByUid",
fetchType = FetchType.LAZY))
#和$的区别,#的数据会自动添加"",$取的数据不加
Mybatis(个人笔记)
最新推荐文章于 2022-08-23 11:30:08 发布