目录
一、什么是Mybatis
Mybatis是一个基于java的持久层框架,它主要用来解决原生JDBC代码冗余、重复,频繁申请释放连接资源等问题,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。并采用ORM思想,可以自动对Bean对象进行映射封装。此外,它还可以将Sql语句配置到xml文件中,实现持久操作与编码的松耦合。
1.优秀的持久层开源框架
2.MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射
二、Mybatis工作原理
mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory,然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。如下图所示:
MyBatis的工作原理如下图所示:
上面中流程就是MyBatis内部核心流程,每一步流程的详细说明如下文所述:
(1)读取MyBatis的配置文件。mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息。
(2)加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
(3)构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。
(4)创建会话对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
(5)Executor执行器。MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
(6)MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
(7)输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
(8)输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
如何掌握MyBatis的工作原理
关于MyBatis的工作原理,网上的文章是汗牛充栋,但是站长觉得,要结合JDBC来理解MyBatis的工作原理往往才能更透彻。我们知道,JDBC有四个核心对象:
(1)DriverManager,用于注册数据库连接
(2)Connection,与数据库连接对象
(3)Statement/PrepareStatement,操作数据库SQL语句的对象
(4)ResultSet,结果集或一张虚拟表
而MyBatis也有四大核心对象:
(1)SqlSession对象,该对象中包含了执行SQL语句的所有方法【1】。类似于JDBC里面的Connection 【2】。
(2)Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
(4)ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。
三、第一个Mybatis程序
搭建数据库
新建项目
-
创建一个普通的maven项目
-
删除src目录 (就可以把此工程当做父工程了,然后创建子工程)
-
编写 pom.xml 导入第三方的依赖(jar)
junit 数据库驱动包(mysql,oracle) mybatis
4.创建Module
5.编写mybatis工具类
创建一个模块
编写mybatis的核心配置文件 mybatis-config.xml
数据连接信息 db.properties
编写mybatis工具类
编写代码
实体类
Dao接口
接口实现类
junit测试
四、映射文件
1、核心配置
mybatis-config.xml
MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
类型:MANAGED 和 JDBC
dataSource(数据源)
类型:POOLED(有连接池)、UNPOOLED(无连接池)、JNDI(正常连接)
池:用完可以回收,使web响应更加快
databaseIdProvider(数据库厂商标识)
mappers(映射器)
2、环境配置(environments)
MyBatis可以配置成使用多种环境
记住:尽管可以配置多个环境,但每个SqlSessFactory实例只能选择一种环境。
学会使用配置多套运行环境!
Mybatis默认的事物管理器就是JDBC,连接池:POOLED
3、属性(properties)
我们可以通过properties属性来实现引用配置文件
这些属性都是可以外部且可动态替换的,既可以在典型的Java属性文件中配置,亦可以通过properties元素的子元素来传递。【db.prooerties】
在核心配置文件中映入
编写属性配置文件db.properties
类型别名(typeAliases)
环境配置(environments)和 环境变量(environment)
映射器(mappers)
五、MyBatis动态SQL
1、动态sql是什么?
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
2、Mybatis 动态 sql 是做什么的?
Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。
3、Mybatis的动态sql标签有哪些?
1、<if> 标签:条件判断
2、<where> + <if> 标签
where、if 同时使用可以进行查询、模糊查询
3、<set> + <if> 标签
Set、if 同时使用可以用来修改
4.choose(when,otherwise)语句
有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句
5、<trim> 格式化的标记
trim 标记是一个格式化的标记,可以完成 set 或者是 where 标记的功能
用 trim 改写上面第二点的 if+where 语句:
- prefix:前缀
- prefixoverride:去掉第一个 and 或者是 or
用 trim 改写上面第三点的 if+set 语句:
- suffix:后缀
- suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)
trim+if 同时使用可以添加:
6、<foreach> 标签
foreach是用来对集合的遍历,这个和 Java 中的功能很类似。通常处理 Sql 中的 in 语句。
7、<sql>:可重用语句
在实际开发中会遇到许多相同的SQL,比如根据某个条件筛选,这个筛选很多地方都能用到,我们可以将其抽取出来成为一个公用的部分,这样修改也方便,一旦出现了错误,只需要改这一处便能处处生效了,此时就用到了 <sql> 这个标签了。<include> 用于引用 <sql> 标签定义的常量
六、MyBatis映射关联查询
1、一对一映射
2、一对多映射
3、多对多映射
七、一级缓存和二级缓存
1、一级缓存
一级缓存也叫本地缓存: SqlSession
- 与数据库同义词会话期间查询到的数据会放在本地缓存中;
- 以后如果需要直接到本地缓存中拿,没必要再去查询数据库;
失效的情况:
1.查询条件不同
2.增删改操作
3.查询不同的Mapper.xml,不是同一个Sqlsession对象
4.手动清除缓存(clearCache)
2、二级缓存
二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
基于namespace级别的缓存,一个名称空间,对应一个二级缓存
工作机制:
1、一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
2、如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭· 了,会话关闭了,一级缓存中的数据被保护到二级缓存中
3、新的会话查询信息,就可以从二级缓存中获取内容;
4、不同的mapper查出的数据会放在自己对应的缓存(map)中
特点:查出的数据都会被默认先放在一级缓存中 只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中 只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据)
第一步在mybatis的全局配置文件中配置Setting属性,设置名为cacheEnabled的属性值为true即可
第二步:在具体需要二级缓存的mapeer映射文件中开启二级缓存,值需要在相应的映射文件中添加一个cache标签即可