mybatis框架
共四天
第一天:mybatis入门
mybatis的概述
mybatis的环境搭建
mybatis入门案例
自定义mybatis框架(主要的目的是为了让大家了解mybatis中执行细节)
第二天:mybatis基本使用
mybatis的单表crud操作
mybatis的参数和返回值
mybatis的dao编写
mybatis配置的细节
几个标签的使用
第三天:mybatis的深入和多表
mybatis的连接池
mybatis的事务控制及设计的方法
mybatis的多表查询
一对多(多对一)
多对多
第四天:mybatis的缓存和注解开发
mybatis中的加载时机(查询的时机)
mybatis中的一级缓存和二级缓存
mybatis的注解开发
单表CRUD
多表查询
-----------------------------------------------------------
1、什么是框架?
它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题
使用框架的好处:
框架封装了很多的细节,使开发者可以使用极简的方式实现功能,大大提高开发效率
2、三层架构
表现层:
是用于展示数据的
业务层:
是处理业务需求
持久层:
是和数据库交互的
3、持久层技术解决方案
JDBC技术:
Connection
PreparedStatement
ResultSet
Spring的JdbcTemplate:
Spring中对jdbc的简单封装
Apache的DBUtils:
它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装
以上这些都不是框架
JDBC是规范
Spring的JdbcTemplate和Apache的DBUtils都只是工具类
4、mybatis的概述
mybatis是一个持久层框架,用java编写的
它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程
它使用了ORM思想实现了结果集的封装
ORM:
Object Relational Mappging对象关系映射
简单的说:
就是把数据库表和实体类及实体类的属性对应起来
让我们可以操作实体类就实现操作数据库表
user User
id userId
user_name userName
今天我们需要做到
实体类中的属性和数据库表的字段名称保持一致
user User
id id
user_name user_name
5、mybatis的入门
mybatis的环境搭建
第一步:创建maven工程并导入坐标
第二步:创建实体类和dao的接口
第三步:创建Mybatis的主配置文件
SqlMapConifg.xml
第四步:创建映射配置文件
IUserDao.xml
环境搭建的注意事项:
第一个:创建IUserDao.xml和IUserDao.java时名称是为了和我们之前的知识保持一致
在Mybatis中它把持久层的操作接口名称和映射文件也叫做Mapper
所以IUserDao和IUserMapper是一样的
第二个:在idea中创建目录的时候,它和包是不一样的
包在创建时com.itheima.dao它是三级结构
目录在创建时com.itheima.dao是一级目录
第三个:mybatis的映射配置文件位置必须和dao接口的包结构相同
第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
第五个:映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
mybatis的入门案例
第一步:读取配置文件
第二步:创建SqlSessionFactory工厂
第三步:创建SqlSession
第四步:创建Dao接口的代理对象
第五步:执行dao中的方法
第六步:释放资源
注意事项:
不要忘记在映射配置中告知mybatis要封装到哪个实体类中
配置的方式:指定实体类的全限定类名
mybatis基于注解的入门案例:
把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句
同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名
明确:
我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式
不管使用XML还是注解配置
但是Mybatis它是支持写dao实现类的
6、自定义Mybatis的分析
mybatis在使用代理dao的方式实现增删改查时做什么事呢?
只有两件事:
第一:创建代理对象
第二:在代理对象中调用selectList
自定义mybatis能通过入门案例看到类
class Resources
class SqlSessionFactoryBuilder
interface SqlSessionFactory
interface SqlSession
1 第一天
1.1 mybatis环境搭建
- 创建user数据表;
CREATE
- 导入坐标;
<dependencies>
1.2 创建工程
- 创建实体类:创建com.itheima.domain.User类;
package
- Dao接口:创建com.itheima.dao.IUserDao接口;
package
- 主配置文件:resources下创建SqlMapConfig.xml;
<?xml version="1.0" encoding="UTF-8" ?>
- 映射配置文件:resources下创建com.itheima.dao.IUserDao.xml;
<?xml version="1.0" encoding="UTF-8"?>
1.3 入门案例
- test/java下:创建com.itheima.test.MybatisTest类;
package
1.4 注解
- 可以删除IUserDao.xml文件;
- 将SqlMapConfig.xml中内容改为;
<mappers>
- IUserDao接口中改为;
public
1.5 执行查询所有分析
![4d807860bb06a3a7ed04ce548951a550.png](https://i-blog.csdnimg.cn/blog_migrate/c26e72932983a9bf9989c76e2df8dead.jpeg)
1.6 创建对象分析
![5cf187ad7ddf789c7a0f1c4f37a5d2a9.png](https://i-blog.csdnimg.cn/blog_migrate/1509374ea3e7a2084fc1d10698cd81ae.jpeg)
1、回顾mybatis自定义和环境搭建+完善自定义Mybatis的注解开发
2、Mybatis基于代理Dao的CRUD操作 重点内容
3、CRUD中可能遇到的问题:参数的传递以及返回值的封装
4、介绍Mybatis基于传统dao方式的使用(自己编写dao的实现类) 了解的内容
5、mybatis主配置文件中的常用配置
properties标签
typeAliases标签 ---解释Integer的写法
mappers标签的子标签:package
-----------------------------------------
OGNL表达式:
Object Graphic Navigation Language
对象 图 导航 语言
它是通过对象的取值方法来获取数据,在写法上把get给省略了
比如:我们获取用户的名称
类中的写法:user.getUsername()
OGNL表达式写法:user.username
mybatis中为什么能直接写username而不用user.呢?
因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名
2 第二天
2.1 自定义mybatis开发流程图
![c7b4eb84c3656bf1bba27c14fdbf68bc.png](https://i-blog.csdnimg.cn/blog_migrate/fa10453d9150585e26bb86b0ec12281a.jpeg)
2.2 插入操作
- IUserDao接口中定义方法;
void
- IUserDao.xml中定义;
<insert
- 测试——初始化操作;
private
- 测试插入;
@Test
2.3 更新和删除
- IUserDao接口中定义方法;
void
- IUserDao.xml中定义;
<update
- 测试更新和删除;
@Test
2.4 查询一个和模糊查询
- IUserDao接口中定义方法;
User
- IUserDao.xml中定义;
<select
- 测试查询一个和模糊查询;
@Test
2.5 查询返回一行一列
- IUserDao接口中定义方法;
int
- IUserDao.xml中定义;
<select
- 测试;
public
2.6 获取新增数据的id
<insert
2.7 参数深入
- 可以传递简单类型;
- 可以传递pojo对象,使用OGNL表示式解析对象字段;
- 可以传递pojo包装对象;
- 根据QueryVo中查询条件查询;
List
- 定义QueryVo对象;
package
- 根据queryVo条件查询用户;
<select
- 测试;
@Test
2.8 结果类型封装
- 数据库中字段名称和实体类属性名不一样;
- mysql数据库在windows系统下不区分大小写;
- 最简单方式:起别名;
<select
- resultMap;
<resultMap
2.9 配置properties文件
- jdbc.properties文件;
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eesy_mybatis
jdbc.username=root
jdbc.password=123456
- SqlMapConfig.xml修改为;
<properties
2.10 typeAliases和package标签
<typeAliases>
1、mybatis中的连接池以及事务控制 原理部分了解,应用部分会用
mybatis中连接池使用及分析
mybatis事务控制的分析
2、mybatis基于XML配置的动态SQL语句使用 会用即可
mappers配置文件中的几个标签:
<if>
<where>
<foreach>
<sql>
3、mybatis中的多表操作 掌握应用
一对多
一对一
多对多
--------------------------------------------------------------------------------
1、连接池:
我们在实际开发中都会使用连接池
因为它可以减少我们获取连接所消耗的时间
2、mybatis中的连接池
mybatis连接池提供了3种方式的配置
配置的位置
主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式
type属性的取值
POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
UNPOOLED 采用传统的获取连接的方式,虽然也实现javax.sql.DataSource接口,但是并没有使用池的思想
JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样
注意:如果不是web或者maven的war工程,是不能使用的
我们课程中使用的是tomcat服务器,采用连接池就是dbcp连接池
3、mybatis中的事务
什么是事务
事务的四大特性ACID
不考虑隔离性会产生的3个问题
解决办法:四种隔离级别
它是通过sqlsession对象的commit方法和rollback方法实现事务的提交和回滚
4、mybatis中的多表查询
表之间的关系有几种:
一对多
多对一
一对一
多对多
举例:
用户和订单就是一对多
订单和用户就是多对一
一个用户可以下多个订单
多个订单属于同一个用户
人和身份证号就是一对一
一个人只能有一个身份证号
一个身份证号只能属于一个人
老师和学生之间就是多对多
一个学生可以被多个老师教过
一个老师可以教多个学生
特例:
如果拿出每一个订单,他都只能属于一个用户
所以Mybatis就把多对一看成了一对一
mybatis中的多表查询:
示例:用户和账户
一个用户可以有多个账户
一个账户只能属于一个用户(多个账户也可以属于同一个用户)
步骤:
1、建立两张表:用户表,账户表
让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
2、建立两个实体类:用户实体类和账户实体类
让用户和账户的实体类能体现出来一对多的关系
3、建立两个配置文件
用户的配置文件
账户的配置文件
4、实现配置:
当我们查询用户时,可以同时得到用户下所包含的账户信息
当我们查询账户时,可以同时得到账户的所属用户信息
示例:用户和角色
一个用户可以有多个角色
一个角色可以赋予多个用户
步骤:
1、建立两张表:用户表,角色表
让用户表和角色表具有多对多的关系,需要使用中间表,中间表中包含各自的主键,在中间表中是外键
2、建立两个实体类:用户实体类和角色实体类
让用户和角色的实体类能体现出来多对多的关系
各自包含对方一个集合引用
3、建立两个配置文件
用户的配置文件
角色的配置文件
4、实现配置:
当我们查询用户时,可以同时得到用户所包含的角色信息
当我们查询角色时,可以同时得到角色的所赋予的用户信息
3 第三天
3.1 连接池
- 连接池就是用于存储连接的容器,容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到同一个连接;
- 连接池先进先出。
![0bd67fc2be0413a679db39ea17bc467a.png](https://i-blog.csdnimg.cn/blog_migrate/b1a2a0bb3fb61cdcfaf47a3ad3d64537.jpeg)
3.2 事务
- 自动提交:将openSession内参数设置为true自动提交,不要这样使用;
sqlSession
3.3 动态sql中if标签
- IUserDao接口中定义方法;
// 查询的条件:有可能有用户名,有可能有性别,也有可能有地址,还有可能是都有
- IUserDao.xml文件;
<!-- 根据条件查询 -->
- 测试;
@Test
3.4 where标签
<select
- 使用where;
<select
3.5 foreach标签
- 在QueryVo中增加属性;
private
- IUserDao接口;
// 根据queryvo中提供的id集合,查询用户信息
- IUserDao.xml;
<sql
- 测试;
@Test
3.6 多表查询
- 创建账户表;
CREATE
- 创建User实体类;
package
- 创建IUserDao接口;
package
- 创建Account实体类;
package
- 创建IAccountDao接口;
package
- 创建AccountUser实体类;
package
- 创建IAccountDao.xml;
<?xml version="1.0" encoding="UTF-8"?>
- 创建IUserDao.xml;
<?xml version="1.0" encoding="UTF-8"?>
- 测试AccountTest;
package
- 以上通过再写一个实体类完成两个类的封装方法用的不多。
3.7 多对多查询
- 角色表;
CREATE
- 用户角色表;
CREATE
- Role实体类;
package
- IRoleDao接口;
package
- IRoleDao.xml;
<?xml version="1.0" encoding="UTF-8"?>
- RoleTest类;
package
1、Mybatis中的延迟加载
问题:在一对多中,当我们有一个用户,它有100个账户
在查询用户的时候,要不要把关联的账户查出来
在查询账户的时候,要不要把关联的用户查出来
在查询用户时,用户下的账户信息应该是什么时候使用什么时候查询的
在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来
什么是延迟加载
在真正使用数据时才发起查询,不用的时候不查询,按需加载(懒加载)
什么是立即加载
不管用不用,只要一调用方法,马上发起查询
在对应的四种表关系中:一对多,多对一,一对一,多对多
一对多,多对多:通常情况下我们都是采用延迟加载
多对一,一对一:通常情况下我们都是采用立即加载
2、Mybatis中的缓存
什么是缓存
存在于内存中的临时数据
为什么使用缓存
减少和数据库的交互次数,提高执行效率
什么样的数据能使用缓存,什么样的数据不能使用
适用于缓存:
经常查询并且不经常改变的
数据的正确与否对最终结果影响不大的
不适用于缓存:
经常改变的数据
数据的正确与否对最终结果影响很大的
例如:商品的库存,银行的汇率,股市的牌价
Mybatis中的一级缓存和二级缓存
一级缓存:
它指的是Mybatis中SqlSession对象的缓存
当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中
该区域的结构是一个Map,当我们再次查询同样的数据,mybatis会先去sqlsession中
查询是否有,有的话直接拿出来用
当SqlSession对象消失时,mybatis的一级缓存也就消失了
二级缓存:
它指的是Mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存
二级缓存的使用步骤:
第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)
第三步:让当前的操作支持二级缓存(在select标签中配置)
4 第四天
4.1 延迟加载
- IAccountDao.xml;
<!-- 一对一的关系映射:配置封装user的内容
- SqlMapConfig.xml;
<!-- 配置参数 -->
4.2 缓存
- SqlMapConfig.xml;
<settings>
- IUserDao.xml;
<cache/>