菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
0
0

MyBatis 知识脑图 - ORM持久层框架

原创
05/13 14:22
阅读数 291

课程推荐:Java开发工程师--学习猿地--送7个上线商业项目

file

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. 一对一
    方式 1 :
    select * from orders o, user u where o.uid=u.id 复制代码
    方式 2 :
    复制代码
  2. 一对多
    select *,o.id oid from user u left join orders o on u.id=o.uid 复制代码
  3. 多对多 (两个一对多)

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 复制代码
五、缓存

  1. 一级缓存 (默认开启)
    SqlSession 级别的缓存,仅在同一个连接内有效
    缓存刷新

中途运行 commit 操作 (增、删、改)手动刷新 SqlSession.clearCache()

  1. 二级缓存 (默认不开启,通常与Redis集成实现)
    Mapper 级别的缓存,多个 SqlSession,在使用同一个 Mapper 内有效。

当SqlSession运行close()方法并且一级缓存有内容时,才会将一级缓存的内容存到二级缓存中
多表查找不会触发二级缓存
当对 Mapper 进行 commit 操作 (增、删、改),刷新缓存
使用 useCache = false 属性,可以禁用特定 SQL 的二级缓存

六、插件
允许拦截的类

Executor 运行器 : 负责增、删、改、查的行为。StatementHandler SQL语法构建器 : 完成SQL的预编译。ParameterHandler 参数处理器 : 设置参数。ResultHandler 结果集处理器 : 负责处理返回结果集。

作者:Java劝退师
链接:https://juejin.im/post/6892770902019473422
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

发表评论

0/200
0 点赞
0 评论
收藏
为你推荐 换一批