mybatis笔记
发布日期:2022-02-28 20:48:42
浏览次数:43
分类:技术文章
本文共 4287 字,大约阅读时间需要 14 分钟。
Mybatis 任务一
一 框架简介
1.1 三层架构
- 持久层:主要完成与数据库相关的操作,即对数据库的增删改查。
- 因为数据库访问的对象一般称为Data Access Object(简称DAO),所以有人把持久层叫做DAO层
- 业务层:主要根据功能需求完成业务逻辑的定义和实现。 因为它主要是为上层提供服务的,所以有人把业务层叫做Service层或Business层。
- 表现层:主要完成与最终软件使用用户的交互,需要有交互界面(UI)。因此,有人把表现层称之为web层或View层。
- 三层架构之间调用关系为:表现层调用业务层,业务层调用持久层。 各层之间必然要进行数据交互,我们一般使用java实体对象来传递数据。
1.2 框架
1.2.1 什么是框架?
- 框架就是一套规范,既然是规范,你使用这个框架就要遵守这个框架所规定的约束。 框架可以理解为半成品软件,框架做好以后,接下来在它基础上进行开发
1.2.2 为什么使用框架?
- 框架为我们封装好了一些冗余,且重用率低的代码。并且使用反射与动态代理机制,将代码实现了通 用性,让 开发人员把精力专注在核心的业务代码实现上。
1.2.3 常见的框架
- 持久层框架:专注于解决数据持久化的框架。常用的有mybatis、hibernate、spring jdbc等等。
- 表现层框架:专注于解决与用户交互的框架。常见的有struts2、spring mvc等等。
- 全栈框架: 能在各层都给出解决方案的框架。比较著名的就是spring。
1.4 ORM思想
- ORM(Object Relational Mapping)对象关系映射
- O(对象模型):实体对象,即我们在程序中根据数据库表结构建立的一个个实体javaBean
- R(关系型数据库的数据结构):关系数据库领域的Relational(建立的数据库表)
- M(映射):从R(数据库)到O(对象模型)的映射,可通过XML文件映射
步骤分析
- 创建数据库及user表
- 创建maven工程,导入依赖(MySQL驱动、mybatis、junit)
- 编写User实体类
- 编写UserMapper.xml映射配置文件(ORM思想)
- 编写SqlMapConfig.xml核心配置文件 数据库环境配置 映射关系配置的引入(引入映射配置文件的路径)
- 编写测试代码 // 1.加载核心配置文件 // 2.获取sqlSessionFactory工厂对象 // 3.获取sqlSession会话对象 // 4.执行sql // 5.打印结果 // 6.释源
6.2 MyBatis常用配置解析
environments标签
properties标签
typeAliases标签
- 为了简化映射文件 Java 类型设置,mybatis框架为我们设置好的一些常用的类型的别名:
mappers标签
核心配置文件常用配置
Mybatis 任务二:复杂映射&配置文件深入
1.1 ResutlMap属性
- resultType 如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中
- ResutlMap 如果实体的属性名与表中字段名不一致,可以使用ResutlMap实现手动封装到实体类中
1.2 多条件查询(三种)
方式一
- 使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数
方式二
- 使用注解,引入 @Param() 注解获取参数
方式三(推荐)
- 使用pojo对象传递参数
${} 与 #{} 区别【笔试题】
#{} :表示一个占位符号
-
通过 #{} 可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。
-
#{} 可以接收简单类型值或pojo属性值。
-
如果parameterType传输单个简单类型值, #{} 括号中名称随便写。
${} :表示拼接sql串 -
通过 ${} 可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,会出现sql注入问题。
-
${} 可以接收简单类型值或pojo属性值。
-
如果parameterType传输单个简单类型值, ${} 括号中只能是value。补充:TextSqlNode.java 源码可以证明
Mybatis映射文件深入
- useGeneratedKeys,只适用于主键自增的数据库,mysql和sqlserver支持,oracle不行。
- selectKey 适用范围广,支持所有类型数据库
- keyColumn=“id” 指定主键列名
- keyProperty=“id” 指定主键封装到实体的id属性中
- resultType=“int” 指定主键类型 order=“AFTER” 设置在sql语句执行前(后),执行此语句
动态SQL
- 动态 SQL 之,根据id和username查询,但是不确定两个都有值。
- 动态 SQL 之,动态更新user表数据,如果该属性有值就更新,没有值不做处理。
- 动态 SQL 之,foreach主要是用来做数据的循环遍历’
MyBatis映射文件配置
<select>
:查询 <insert>
:插入 <update>
:修改 <delete>
:删除 <selectKey>
:返回主键
<where>
:where条件 <if>
:if判断 <foreach>
:for循环 <set>
:set设置 <sql>
:sql片段抽取 Mybatis核心配置文件深入
plugins标签
- MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封 装,使用简单的方式即可获得分页的相关数据
开发步骤:
①导入通用PageHelper的坐标 ②在mybatis核心配置文件中配置PageHelper插件 ③测试分页数据获取3.2知识小结
MyBatis核心配置文件常用标签:
1、properties标签:该标签可以加载外部的properties文件 2、typeAliases标签:设置类型别名 3、environments标签:数据源环境配置标签 4、plugins标签:配置MyBatis的插件Mybatis多表查询
一对一查询模型
- 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
- 一对一查询的需求:查询所有订单,与此同时查询出每个订单所属的用户
- 一对一(多对一)
使用association标签关联:
- property=“user” 封装实体的属性名 ’
- javaType=“user” 封装实体的属性类型
一对多查询模型
- 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
- 一对多查询的需求:查询所有用户,与此同时查询出该用户具有的订单
一对多使用collection标签关联 :
- property=“orderList” 封装到集合的属性名
- ofType=“order” 封装集合的泛型类型
多对多查询的模型
- 用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
- 多对多查询的需求:查询所有用户同时查询出该用户的所有角色
4.5 小结MyBatis多表配置方式
- 多对一(一对一)配置:使用+做配置
- 一对多配置:使用+做配置
- 多对多配置:使用+做配置
- 多对多的配置跟一对多很相似,难度在于SQL语句的编写。
MyBatis嵌套查询
- 嵌套查询就是将原来多表查询中的联合查询语句拆成单个表的查询,再使用mybatis的语法嵌套在一起。
5.5 小结
- 一对一配置:使用+做配置,通过column条件,执行select查询
- 一对多配置:使用+做配置,通过column条件,执行select查询
- 多对多配置:使用+做配置,通过column条件,执行select查询
- 优点:简化多表查询操作
- 缺点:执行多次sql语句,浪费数据库性能
加载策略及注解开发
什么是延迟加载?
- 实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的订单信息。此时就是我们所说的延迟加载。
延迟加载
- 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。
- 优点:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表 速度快。
- 缺点:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时 间,所以可能造成用户等待时间变长,造成用户体验下降。
局部延迟加载
- 在association和collection标签中都有一个fetchType属性,通过修改它的值,可以修改局部的加载策略
- fetchType=“lazy” 懒加载策略
- fetchType=“eager” 立即加载策略
设置触发延迟加载的方法
- 在配置了延迟加载策略后,发现即使没有调用关联对象的任何方法,但是在你调用当前对象的 equals、clone、hashCode、toString方法时也会触发关联对象的查询。
全局延迟加载
- 在Mybatis的核心配置文件中可以使用setting标签修改全局的加载策略。
- 局部的加载策略优先级高于全局的加载策略。
MyBatis缓存
MyBatis缓存
- 经常查询一些不经常发生变化的数据,使用缓存来提高查询效率。
一级缓存
-
一级缓存是SqlSession级别的缓存,是默认开启的
-
一级缓存是SqlSession范围的缓存,执行SqlSession的C(增加)U(更新)D(删除)操作,或者调
用clearCache()、commit()、close()方法,都会清空缓存。 -
调用sqlSession清除缓存的方法 : sqlSession.clearCache();
二级缓存
- 二级缓存是namspace级别(跨sqlSession)的缓存,是默认不开启的
- 二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个Mapper映射的sql语句,多个 SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
注意问题(脏读)
- mybatis的二级缓存因为是namespace级别,所以在进行多表查询时会产生脏读问题
MyBatis注解
MyBatis注解的增删改查
基于注解的二级缓存
转载地址:https://blog.csdn.net/weixin_53381980/article/details/118763946 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月10日 17时35分45秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
基于java的SSM框架的教务关系系统的设计与实现
2019-04-30
别再问我什么是A/B测试了!
2019-04-30
如何用同期群分析模型提升留存?(Tableau实战)
2019-04-30
爱了,吹爆这个高颜值的流程图工具!
2019-04-30
一个数据项目
2019-04-30
基于JAVA_JSP电子书下载系统
2019-04-30
基于java出租车计价器设计与实现
2019-04-30
十二时辰篇:这该死的 996
2019-04-30
2021最新 上海互联网公司排名
2019-04-30
字节vs快手!取消大小周之战
2019-04-30
送一个闲置显示器!
2019-04-30
Oracle 行转列 pivot函数基本用法
2019-04-30
Oracle字符串分隔符替换(替换奇数个或偶数个)
2019-04-30
Oracle 利用 UTL_SMTP 包发送邮件
2019-04-30
Oracle 的循环中的异常捕捉和处理
2019-04-30
Oracle通过pivot和unpivot配合实现行列转换
2019-04-30
给Oracle数据库换一个1522端口的监听
2019-04-30
Excel表格数据生成ECharts图表
2019-04-30
阿里云短信服务python版,pyinstaller打包运行时缺少文件
2019-04-30