码迷,mamicode.com
首页 > 其他好文 > 详细

Mybatis开发的重点知识

时间:2019-09-03 16:28:57      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:开关   命名   col   线程   ima   int   led   mic   names   

一、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

 

开发建议:使用二级缓存容易出现脏读,建议避免使用二级缓存

 

技术图片

 

调用过程解读:

  1. 每次与数据库的连接都会优先从缓存中获取数据
  2. 先查二级缓存,再查一级缓存
  3. 二级缓存以namespace为单位的,是SqlSession共享的,容易出现脏读,建议避免使用二级缓存
  4. 一级缓存是SqlSession独享的,建议开启;

 

 

 

Mybatis开发的重点知识

标签:开关   命名   col   线程   ima   int   led   mic   names   

原文地址:https://www.cnblogs.com/hysss/p/11450504.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!