Mybatis用法

文章详细介绍了MyBatis的核心原理,包括加载配置文件、映射文件的结构,以及执行器的角色。配置文件涉及properties、settings、typeAliases等元素,映射文件用于封装SQL语句,动态SQL提供了条件控制。文章还讨论了MyBatis的缓存机制,包括一级缓存和二级缓存的配置与自定义。
摘要由CSDN通过智能技术生成

我们可以根据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数据与数据库类型和名称不一致怎么解决?

  1. 可以通过resultMap映射来匹配。
  2. 可以通过起别名来队友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"/> 

自定义配置完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值