我们可以根据mybatis官方中文文档来学习:https://mybatis.org/mybatis-3/zh/index.html
1.mybatis原理
关于图解的详细说明:
加载配置文件:配置文件命名需要遵循规范,配置文件配置了一些mybatis的重要信息。
加载映射文件:配置了数据库的语句,在配置文件中加载。
构建SqlSessionFactory工厂:根据配置文件的信息创建会话工厂。
创建Sqlession会话:工厂创建SqlSession对象,该对象包含了执行sql语句的所有方法。
exectutor执行器:mybatis底层为了执行这些语句会创建一个执行器接口,该接口将sqlsession传递的参数动态的执行并返回结果,并负责查询缓存维护。
MapperStatement参数:exectutor执行器的执行方法里有一个mapperstatement参数,能够将映射结果封装,并传递sql语句的id,参数信息。
输入输出映射信息:相当于JDBC里面的preparedstatement的操作和处理查询结果集的操作。
2.加载配置文件
首先先在idea的设置里面为配置文件和映射文件设置模板,以便以后直接在新建文件里面选择模板。打开设置>>>编辑器>>>文件和代码模板>>>点击+号将复制的文件前缀复制进去>>>应用>>>确认即可完成,如下图
我们可以在新建文件里面看到导入的文件模板
配置文件模板
文件模板里的配置文件有严格的顺序,按如下顺序来(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)
<configuration>
<properties resource="资源路径"/>
<settings>
<setting name="" value=""/>
</settings>
<typeAliases>
<package name="填写包名"/>
<typeAlias alias="填写别名" type="填写引用的类名"/>
</typeAliases>
<typeHandlers>
<package name="填写实现类型别名类的包路径"/>
</typeHandlers>
<environments default="mybatis">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url0}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="msg">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="填写数据库驱动"/>
<property name="url" value="填写数据库路径"/>
<property name="username" value="填写用户名"/>
<property name="password" value="填写数据库密码"/>
</dataSource>
</environment>
<environment id="mybatis">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url2}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="org.example.Dao"/>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
</configuration>
1.properties获取外部资源文件,通过外部资源文件动态改变配置文件的值。
2.settings修改mybatis的运动行为。
3.typeAlias来对文件路径起别名,使得从其他文件引用可以只写文件名,简化操作。
4.typeHandlers来对映射结果对应的java类型进行配置,可以继承BaseTypeHandler类来对映射结果进行数据匹配,应对较复杂的数据类型。
5.environments配置数据库连接环境,支持多环境配置,但只可选用一个环境运行,应对项目在不同的环境下运行。
6.transactionManager事务管理器支持jdbc||managed,正常使用jdbc管理器,managed不支持回滚和提交事务,不改变数据库信息。
7.dataSource类型有pooled||unpooled||jndi
- pooled:开启连接池,响应迅速,只加载一次实例
- unpooled:每次使用每次都要加载数据,不过能保证数据安全,加载慢。
8.mapper加载映射文件
注意:使用name和class导入必须要求映射文件名和接口名保持一致,并且都在同一个包下面。
对于mybatis的配置文件更多信息请看官方文档。
3.映射文件
作用:要执行的sql语句都封装在映射文件中,映射文件能够节省大部分jdbc代码,解耦合。
sql引用
语法:
<sql id="user"> ${alias}.id/id,${alias}.username/username</sql>
引用sql字段,提示:sql语句可以不设置别名,如果不设置别名则引用时可以不写property代码。
<include refid="users"><property name="alias" value="t1"/></include>
映射文件结构:如下语句,一个映射文件对应一个接口
<mapper namespace="org.example.Dao.Orders">
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.Dao.Orders">
<resultMap id="user" type="tb_User">
<result property="username" column="username"/>
<result property="address" column="address"/>
</resultMap>
<resultMap id="Orders" type="tb_Orders">
<id property="id" column="id"/>
<result property="number" column="number"/>
<result property="userid" column="user_id"/>
<association property="tbUser" column="user_id" select="org.example.Dao.User.selectId">
<result property="username" column="username"/>
<result property="address" column="address"/>
</association>
</resultMap>
<select id="selectId" resultType="tb_Orders">
select * from mybatis.tb_orders
<where>
user_id=#{user_id}
</where>
</select>
<select id="select" resultMap="Orders">
select * from mybatis.tb_orders
</select>
<select id="selectIds" resultType="tb_Orders">
select * from mybatis.tb_orders
<where>
id=#{id}
</where>
</select>
</mapper>
动态sql
作用:能对传入参数进行条件控制。
if,set,choose,otherwise,when,where,trim,foreach
这些动态sql可以自行去mybatis查看用法,其中trim可以代替其他动态sql语句使用,其好处是可以去除一些不必要的特殊符号对sql语句的影响。
java数据与数据库类型和名称不一致怎么解决?
- 可以通过resultMap映射来匹配。
- 可以通过起别名来队友java的属性。
这两种方法都在执行sql语句时进行配置
进行多表连接时怎么办?
而对于联表查询和操作可以通过association或者collection来引用到其他映射文件进行操作,也可以在本文件中处理。
注意:association只能处理一对一的关系,即一个表的列只能对应另一个表的一个列,而collection对应一对多和多对多的关系,故而映射结果返回的是一个集合类型。
缓存
一级缓存:mybatis默认开启了一级缓存,一级缓存只在调用同一个方法中生效,再次调用该方法不执行sql语句,从缓存中取,而对数据执行增删改操作后缓存失效,也就是所有缓存被清除。
二级缓存:
如何开启二级缓存?
第一步:
在配置文件中的settings里面进行设置
<setting name="cacheEnabled" value="true|false"/>
true开启缓存
一般与
<setting name="localCacheScope" value="SESSION或STATEMENT"/>
session设置在整个session范围内缓存有效
联合使用。
第二步:
在映射文件中对结果集进行缓存
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
eviction(清除策略):
- FIFO:先进先出,谁先缓存谁就先清除。
- LRU:最近最少使用的缓存移除。
- WEAK:基于垃圾回收机制和弱引用规则清除。
- SOFT:基于垃圾回收机制和软引用规则清除。
size:缓存可以缓存的条数。
readOnly:如果为false则实行增删改不清除缓存。
flushInterval:每隔多少毫秒刷新缓存。
如何自定义缓存
1.在pom.xml中导入包
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<scope>test</scope>
</dependency>
2.在类的根路径下新建echcache.xml⽂件,并提供以下配置信息。
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<!--磁盘存储:将缓存中暂时不使⽤的对象,转移到硬盘,类似于Windows系统的虚拟内存-->
<diskStore path="e:/ehcache"/>
<!--defaultCache:默认的管理策略-->
<!--eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有
效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断-->
<!--maxElementsInMemory:在内存中缓存的element的最⼤数⽬-->
<!--overflowToDisk:如果内存中数据超过内存限制,是否要缓存到磁盘上-->
<!--diskPersistent:是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false-
->
<!--timeToIdleSeconds:对象空闲时间(单位:秒),指对象在多⻓时间没有被访问就会失
效。只对eternal为false的有效。默认值0,表示⼀直可以访问-->
<!--timeToLiveSeconds:对象存活时间(单位:秒),指对象从创建到失效所需要的时间。
只对eternal为false的有效。默认值0,表示⼀直可以访问-->
<!--memoryStoreEvictionPolicy:缓存的3 种清空策略-->
<!--FIFO:first in first out (先进先出)-->
<!--LFU:Less Frequently Used (最少使⽤).意思是⼀直以来最少被使⽤的。缓存的元
素有⼀个hit 属性,hit 值最⼩的将会被清出缓存-->
<!--LRU:Least Recently Used(最近最少使⽤). (ehcache 默认值).缓存的元素有⼀
个时间戳,当缓存容量满了,⽽⼜需要腾出地⽅来缓存新的元素的时候,那么现有缓存元素中时间戳
离当前时间最远的元素将被清出缓存-->
<defaultCache eternal="false" maxElementsInMemory="1000" overflowToDis
k="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStor
eEvictionPolicy="LRU"/>
</ehcache>
3.修改SqlMapper.xml⽂件中的<cache/>标签,添加type属性。
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
自定义配置完成