Mybatis入门详解

本文介绍了如何使用IntelliJIDEA搭建一个基于Maven的Mybatis项目,包括删除默认的src目录,添加必要的依赖,创建mybatis-config.xml配置文件,构建SqlSessionFactory,编写实体类、DAO接口和mapper.xml文件,以及测试和日志配置。还详细讲解了Mybatis的核心配置元素,如设置、类型别名、环境、映射器,以及一级和二级缓存的配置和清除策略。
摘要由CSDN通过智能技术生成
  1. 参考资料

1.1mybatis中文帮助文档: https://mybatis.org/mybatis-3/zh/index.html
1.2 maven仓库: https://mvnrepository.com/
  1. 搭建项目测试

2.1 idea新建一个空的maven项目,删掉src目录,看起来干净些。Pom文件导入需要的Mybatis、Mysql、Junit、Log4j的坐标依赖。
2.2 新建一个子项目,开始操作:
step1:resources文件下新增mybatis-config.xml配置文件
<!-- mybatis核心配置文件 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
step2:从XML中构建SqlSessionFactory
step3:编写数据库操作组合套餐:实体类+dao接口+mapper.xml
<!-- SQL语句映射 -->
<?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="接口类全路径">
  <select id="接口类中对应的方法名" resultType="返回的对象类的全路径">
    ** SQl语句 **
  </select>
</mapper>

写完了记得在mybatis-config.xml里配置mapper

step4:测试验证
step5:加上日志

运行测试打印日志

  1. 生命周期和作用域

关键对象的生命周期和作用域:作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。

SqlSessionFactoryBuilder
  • 一旦创建了 SqlSessionFactory,就不再需要它了

  • 局部变量

SqlSessionFactory
  • 可以想象成类似数据库连接池

  • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例

  • 因此 SqlSessionFactory 的最佳作用域是应用作用域

  • 最简单的就是使用单例模式或者静态单例模式

SqlSession
  • 连接到连接池的一个请求

  • SqlSession 的实例不是线程安全的,因此不能被共享,所以它的最佳的作用域是请求或方法作用域

  • 用完之后需要赶紧关闭,否则资源被占用

  1. 配置说明

配置项有强制的顺序要求:

<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
4.1 属性(properties):同一个属性内部外部都有配置的时候,优先读取的内部配置会被覆盖。

外部配置:

最终password的取值是123456.

4.2 设置(Settings)[常用的]:

延迟加载的全局开关。当开启时,所有关联对象都会延迟加载:可用值true|false

<setting name="lazyLoadingEnabled" value="true"/> 

开启全局缓存:可用值true|false

<setting name="cacheEnabled" value="true"/>

日志配置:key和value的值必须和提供的可用值完全一致。

可用值SLF4J | LOG4J(3.5.9 起废弃) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

<settingname="logImpl"value="LOG4J"/>
4.3 类型别名(typeAliases):仅用于 XML 配置,意在降低冗余的全限定类名书写
    <typeAliases>
        <typeAliastype="com.jerry.model.User"alias="user"/>
        <!-- 可以指定包路径,扫描全部,默认别名为类名小写 -->
        <!--<package name="com.jerry.model"/>-->
    </typeAliases>
4.4 环境(environments):可以配置多个,但只有default指定的生效。
<environmentsdefault="development">
        <environmentid="development">
            <transactionManagertype="JDBC"/>
            <dataSourcetype="POOLED">
                <propertyname="driver"value="${driver}"/>
                <propertyname="url"value="${url}"/>
                <propertyname="username"value="${username}"/>
                <propertyname="password"value="${password}"/>
            </dataSource>
        </environment>
    </environments>

需要注意的是transactionManager(事务管理器)的值有JDBC和MANAGED,后者不常用是因为默认会关闭连接。而大多数时候使用容器是不希望出现关闭连接的情况的。

4.5 映射器(mappers):使用相对于类路径的资源引用,或完全限定资源定位符,或类名和包名等。
    <mappers>
        <mapperresource="com/jerry/dao/UserMapper.xml"></mapper>
        <mapperresource="com/jerry/dao/PersonMapper.xml"></mapper>
    </mappers>

5. Mybatis的缓存

  • 简介

  • 什么是缓存

存在内存中的临时数据;将用户经常查询的数据放在缓存(内存)中,用户查询就不用从硬盘(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。

  • 为什么用缓存

减少和数据库的交互次数,减少系统开销,提高系统效率。

  • 什么样的数据使用缓存

经常查询并且不经常改变的数据。

  • Mybatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大地提升查询效率。

  • Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存。

  • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)

  • 二级缓存需要手动开启和配置,是基于namespace级别的缓存。

Mapper的namespace下开启二级缓存

<mapper namespace="com.jerry.dao.UserDao">
    <!-- 二级缓存配置 -->
    <cache/> 
    <select id="getUserById" resultType="user" useCache="true">
        select * from user where id = #{id}
    </select>
</mapper>

mybatis-config.xml中显示地告知开启了二级缓存,虽然默认是开启的.(至少算个好的习惯)

<settings>
    <!-- 显示地告知开启了二级缓存 -->
    <setting name="cacheEnabled" value="true"/>
</settings>

注意:使用二级缓存需要将实体类序列化,不然后会报错:

org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: com.jerry.model.User

  • Mybatis中缓存的清除策略

  • LRU-最近最少使用:移除最长时间不被使用的对象(常用)

  • FIFO-先进先出:按对象进入缓存的顺序来移除它们(常用)

  • SOFT-软引用:基于垃圾回收器状态和软引用规则移除对象

  • WEAK-弱引用:更积极地基于垃圾回收器状态和弱引用规则移除对象

  • 缓存失效的场景

  • 查询不同的数据:查1查2然后查1 ->第一次的1不走缓存, 2不走缓存,第二次的1走缓存

  • 增删改操作,可能会改变原来的数据,所以必定会刷新缓存

  • 查询不同的Mapper.xml

  • 单次SqlSession连接中手动清理缓存:sqlSession.clearCache();

  • 缓存图解:

如果这篇博客帮到了你,那么它的存在就有意义。不妨点个赞分享一下,Thanks.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值