课程推荐:Java开发工程师--学习猿地--送7个上线商业项目
MyBatis 笔记
一、解决的问题(原生 JDBC 存在)
数据库配置消息 存在硬编码问题 - 配置文档(不常变动)频繁创建、释放数据库连接,造成资源浪费 - 连接池SQL语句、参数设置、获取结果集 存在硬编码问题 - 配置文档(常变动)手动封装结果集,较为繁琐 - 反射、内省
注: 常变动 与 不常变动 的配置文档要分开存放
二、名词解释
反射: 在程序运行时,可以动态获取到某个对象所有的属性及方法,且能进行调用。
// 目标类Object target = new Object();// Class 定义Class<?> clazz = Class.forName("类全限定路径");// -------- 属性 ---------// 属性定义Field declaredField = clazz.getDeclaredField("属性名称");// 该属性允许暴力访问declaredField.setAccessible(true);//݇ 反射获取属性值Object value = declaredField.get(target);// -------- 方法 ---------// 方法定义Method method = clazz.getMethod("方法名", args); // 方法调用method.invoke(target, args); 复制代码
内省: 获取指定类,指定属性的 读、写 方法。
// 目标类Object target = new Object();// Class 定义Class<?> clazz = Class.forName("类全限定路径");// 属性描述器PropertyDescriptor propertyDescriptor = new PropertyDescriptor("属性名", clazz);// ----------- 写方法 ----------// 获得写方法Method writeMethod = propertyDescriptor.getWriteMethod();// 调用写方法writeMethod.invoke(target, "值");// ----------- 读方法 ----------// 获得读方法Method readMethod = propertyDescriptor.getReadMethod();// 调用读方法Object value = readMethod.invoke(target);复制代码
ORM: Object/Relation Mapping - 对象关系映射 - 通过操作 POJO 对象,达到操作数据库的目的JDBC: Java Database Connectivity - Java数据库连接规范
三、动态 SQL
where : 加上 where 1=1if : test 条件为true,拼接此 SQL 语句foreach
collection : 要遍历的元素集合 array - 数组,list - 集合open : 开头close : 结尾item : 遍历出来元素的别名seperator : 分割占位符
sql : SQL 抽取,使用 include 重复利用
select from User where id=#{id} and username=#{username} select from User #{id} 复制代码
四、复杂映射
如果表字段有相同名称,需要进行重命名
- 一对一
方式 1 :
select * from orders o, user u where o.uid=u.id 复制代码
方式 2 :
复制代码 - 一对多
select *,o.id oid from user u left join orders o on u.id=o.uid 复制代码 - 多对多 (两个一对多)
select u.,r.,r.id rid from user u left join user_role ur on u.id = ur.user_id inner join role r on ur.role_id=r.id 复制代码
五、缓存
- 一级缓存 (默认开启)
SqlSession 级别的缓存,仅在同一个连接内有效
缓存刷新
中途运行 commit 操作 (增、删、改)手动刷新 SqlSession.clearCache()
- 二级缓存 (默认不开启,通常与Redis集成实现)
Mapper 级别的缓存,多个 SqlSession,在使用同一个 Mapper 内有效。
当SqlSession运行close()方法并且一级缓存有内容时,才会将一级缓存的内容存到二级缓存中
多表查找不会触发二级缓存
当对 Mapper 进行 commit 操作 (增、删、改),刷新缓存
使用 useCache = false 属性,可以禁用特定 SQL 的二级缓存
六、插件
允许拦截的类
Executor 运行器 : 负责增、删、改、查的行为。StatementHandler SQL语法构建器 : 完成SQL的预编译。ParameterHandler 参数处理器 : 设置参数。ResultHandler 结果集处理器 : 负责处理返回结果集。
作者:Java劝退师
链接:https://juejin.im/post/6892770902019473422
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
© 著作权归作者所有
发表评论