Mybatis开发的重点知识
Posted hysss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis开发的重点知识相关的知识,希望对你有一定的参考价值。
一、Mybatis入门
1.为什么需要ORM框架
- 传统的jdbc代码量大
- 业务,技术代码耦合度高
- 连接资源需要手动关闭
2.mybatis的三要素
SQL、映射规则、POJO
3.核心类分析
- SqlSessionFactoryBuilder(创建者模式):读取配置创建SqlSessionFactory;方法级别生命周期
- SqlSessionFactory:创建SqlSession,工厂单例模式;整个程序的生命周期
- Sqlsession:代表一次数据库会话连接,一般调用Mapper访问数据库 ;线程不安全,需要保证线程独享;方法级别的生命周期
- SqlMapper:由一个Java接口和xml组成,包括SQL语句和结果集映射;方法级别的生命周期
二、resultType还是resultMap
1.resultType
当使用resultType做SQL的返回结果时对于SQL语句查询的字段必须在POJO种有相同的的字段对应,resultType中的内容就是POJO的权限名
2.resultMap
resultMap是Mybatis中最强大元素,场景:1.自定义转化规则;2.复杂的SQL联合查询
用谁比较好?
强制使用resultMap,降低与DO之间的耦合,方便维护
三.怎么传多个参数
三种方式:
1.Map方式:杜绝使用,可读性差,维护性,扩展性差
2.注解方式:少于5个参数使用
3.Java Bean方式:大于5个参数使用
四.怎样通过Mybatis进行批量操作
1.foreach标签,进行动态SQL的拼装
2.使用Batch类型的Excutor
1 @Test 2 // 批量更新 3 public void testBatchExcutor() 4 // 2.获取sqlSession 5 SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, true); 6 // 3.获取对应mapper 7 TUserMapper mapper = sqlSession.getMapper(TUserMapper.class); 8 9 User user1 = new User(); 10 user1.setUsername(xx); 11 System.out.println(mapper.insertSelective(user)); 12 13 User user2 = new User(); 14 user2.setUsername(xx); 15 System.out.println(mapper.updateIfAndSetOper(user1)); 16 17 sqlSession.commit(); 18
五.关联查询
1.超过三个表禁止JOIN。需要JOIN的表数据类型必须绝对一致;多表关联查询时要保证被关联的字段有索引
2.不得使用外键与级联,一切外键概念应该在应用层解决
3.字段允许适当的荣冗余,以提高查询性能,但必须考虑数据一致性
关联元素:association用于表示一对一关系,collection用于表示一对多关系
开发技巧:
1.resultMap可以通过使用extends实现继承关系,简化很多配置工作量(resultMap里面属性extends)
2.关联的表查询的类添加前缀是编程的好习惯(就是别名)
3.通过添加完整的命名空间,可以引用其他xml文件的resultMap(表关联association、collection)
association的属性
fetchType :数据加载方式,可选值为 lazy 和 eager,分别为延迟加载和积极加载 ,这个配置会覆盖全局的 lazyLoadingEnabled 配置(这个就时解决了一个“N+1”的问题)
六.缓存
一级缓存
- 一级缓存默认会启用,关闭:在select标签上配置flushCache=“true”;一级缓存存在于 的生命周期中
- 在同一个 SqlSession 中查询时, MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map对象中。如果同一个 SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当 Map 缓存对象中己经存在该键值时,则会返回缓存中的对象
- 任何的 INSERT 、UPDATE 、 DELETE 操作都会清空一级缓存
二级缓存
- 二级缓存也叫应用缓存,存在于 SqlSessionFactory 的生命周期中,可以理解成跨sqlSession
- 缓存是以namespace为单位的,不同namespace下的操作互不影响
- 在MyBatis的核心配置文件中 cacheEnabled参数是二级缓存的全局开关,默认值是 true,如果把这个参数设置为 false,即使有后面的二级缓存配置,也不会生效
- 二级缓存也可以两个namespace公用一个cache,在cache标签中加ref
开发建议:使用二级缓存容易出现脏读,建议避免使用二级缓存
调用过程解读:
- 每次与数据库的连接都会优先从缓存中获取数据
- 先查二级缓存,再查一级缓存
- 二级缓存以namespace为单位的,是SqlSession共享的,容易出现脏读,建议避免使用二级缓存
- 一级缓存是SqlSession独享的,建议开启;
以上是关于Mybatis开发的重点知识的主要内容,如果未能解决你的问题,请参考以下文章
框架 day65 Mybatis入门(基础知识:框架原理,入门[curd],开发dao层,全局与映射配置)
Mybatis学习---MyBatis知识原始Dao开发和mapper代理开发