引言
介绍: 数据持久层框架(DAO将数据持久化到数据库),实现DAO层的代码。对JDBC代码的封装。
特点:
封装通用功能,简化代码,提高开发效率(获得conn,绑定参数,发送sql,处理异常,处理结果集)
sql放在配置文件中,提高sql可维护性。
自带连接池功能
自带缓存(提高查询效率)
搭建环境
导入MyBatis相关jar包(注意还要oracle数据库的驱动jar包)
引入配置文件(mybatis-config.xml)(放在src目录下)
初始化mybatis-config.xml文件的配置
搭建环境所需文件:https://gitee.com/sixiaojie/codes/u82xe47s63ofjycnbrv0q22
书写DAO接口
.xxxMapper.xml文件作为DAO的实现类
在mybatis-config中注册XxxMapper.xml文件
调用Mybatis实现类中的方法:
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
PersonDAO personDao = sessoin.getMapper(PersonDAO.class);
person.XXX();
session.commit();
session.close();
is.close();
工具类:https://gitee.com/sixiaojie/codes/c0k45udvsxzr1lyot3e7f69
如何使用MyBatis充当DAO实现类
需求: 使用MyBatis实现DAO的方式,添加一个person信息 ?
1.写DAO接口
2.书写Mapper文件(DAO的实现类)[sql+参数]
属性:
id: 实现的接口的方法名
parameterType: 参数类型(实体的全类名)
sql语中绑定参数: #
3.注册管理mapper文件[在mybatis-config中配置]
MyBatis使用的API
单表操作
修改
书写PersonDAO接口,声明修改的方法
在Mapper通过标签实现方法
注册mapper文件。[一个接口,对应一个mapper文件,注册一次]
删除
定义dao接口的方法
书写mapper文件标签
注册mapper文件。
限定参数绑定的名字
定义接口方法
Mapper文件
查询
查询单个
书写DAO接口方法
mapper文件实现该方法(sql 参数 对查询结果映射实体对象)
核心: sql 参数
映射核心思想:
如果查询结果的列名和要封装的实体的属性名一样,将查询结果自动封装实体对象。
注册mapper文件
ResultType的作用
作用: 映射查询结果的列封装成实体的属性
要求: 查询结果的列名必须和实体的属性名一致
表列名和实体属性名不一致
通过sql 的as关键字,其别名方式,使查询结果的列名和实体的属性名一致。
查询多个
只需要明确单行数据映射的实体类型,
MyBatis会自动讲每个数据封装的每个实体放入list集合中。
书写DAO接口方法
书写mapper文件中的标签
注册mapper文件
多个参数(基本,包装,String)
方案一:
方案二:
绑定参数通过#
MyBatis的Mapper文件的sql书写 >或者
问题: 会发生转义
解决: 替换成转义字符
实体简化(别名)
简化实体的权限定名的书写
方案:
Mybatis参数绑定的底层原理
插入优化
JDBC的实现思路
MyBatis插入数据绑定id
查询关系映射
需求: 将查询结果映射成实体对象。[MyBatis自动完成]
方案1:
方案二:
关联关系操作
一对多
实例需求: 员工(多)和部门(1)
(站在员工): 一个员工对应一个部门(1对1)
(站在部门): 一个部门对应多个员工(1对多)
表设计
核心思想:
表示表与表之间的关系。
1个员工对应1个部门,1个部门对应多个员工
实体设计
DAO(MyBatis如何查询两张表信息)
使用ResultMap映射1对1的关系。
特点: 如果关系属性是1----
需求2:
ReusultMap映射集合关系属性
1对1关系
库表设计
表示1对1的关系
实体设计
DAO设计
需求: 根据学生id查看学生信息(名字,年龄,手机号,使用的电脑编号,电脑名称)?
DAO接口设计
Mapper文件
多对多
需求:
库表设计
设计原则:
实体设计
DAO设计
MyBatis高级特性
动态sql复用sql语句
案例: 复用sql的列名:
(Where+if)动态sql简化查询
封装查询参数
DAO的简化
Mapper的selectwhere条件设计
where标签+if标签
调用DAO:
update+if 动态修改
动态sql删除
DAO接口的方法
Mapper文件
trim
缓存
现有数据查询的问题?
数据库的数据,来源于数据库的物理硬盘(150M/s~450M/s),速度慢?
数据获取,每次都要经过DB-->Tomcat的网络传输。,网络传输IO,降低速度?
解决思路
内存,读取速度(10000M/s),速度快于物理硬盘。
将数据临时存放在tomcat本地,再次获取数据,无需通过网络从DB传输给java。
缓存
缓存核心架构:
一级缓存
概念: SqlSession级别的缓存
核心思想:
特点:
每个sqlSession会有独立的缓存空间。
SqlSession查询数据,默认放入缓存中。
第二次查询,sqlSession直接从缓存中获得数据,不会发送sql语句。
生命周期: 一个事务过程。【sqlSession.commit().一级缓存就会被清空】
应用
没什么用
二级缓存
工作机制:
二级缓存的使用步骤
二级缓存MyBatis默认自动开启了
被缓存的数据对象类型要可序列化
在使用二级缓存的查询sql所在的Mapper中添加
缓存的使用
深入二级缓存
缓存实现原理
MyBatis二级缓存划分规则:
MyBatis缓存的源码实现?
每个namesapce对应的缓存源码实现?
缓存的应用场景
原则:该数据的查询次数远远多于修改的次数
比如:
注意:
Ehcache缓存整合
简介
Ehcache集成MyBatis(替换mybatis自带的缓存)
配置文件[了解]
领取专属 10元无门槛券
私享最新 技术干货