Mybatis

Posted 白糖℃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis相关的知识,希望对你有一定的参考价值。

Mybatis

介绍

MyBatis是Apache的一个Java开源项目,原名为IBatis,后因项目托管平台的迁移更名为MyBatis。MyBatis是一款支持动态SQL语句的持久层框架,目的让开发人员精力集中在SQL上。

MyBatis特点:

  1. 采用配置文件动态管理SQL语句

  2. 含有输入映射、输出映射机制

  3. 数据库连接池配置的持久层框架

整体架构

MyBatis由数据源配置文件、SQL映射配置文件、会话工厂、会话、执行器以及底层封装对象组成。

数据源配置文件

数据库的数据源是配置在SqlMapConfig.xml(文件名可更改)配置文件中,其中配置了数据库驱动、数据库连接地址、数据库用户名和密码、事务管理等参数,还可以配置连接池的连接数和空闲时间等详细参数。

SqlMapConfig.xml(最初级的配置)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
       <environment id="development">
      <!--使用JDBC事务管理-->
           <transactionManager type="JDBC"/>
           <!--数据库连接池-->
           <dataSource type="POOLED">
          <property name="driver" value="org.git.mm.mybatis.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/mybatisTest?characterEncoding=utf-8"/>
               <property name="username" value="root"/>
               <property name="password" value="root"/>
           </dataSource>
       </environment>
   </environments>
</configuration>

SQL映射配置文件

MyBatis将SQL配置在独立的配置文件Mapper.xml中,在这个配置文件中可以配置任何类型的SQL语句。对应SQL语句执行所需的参数,以及查询语句返回的结果集对象,都可以在配置文件中配置。配置文件,完成了对SQL语句以及输入输出参数的映射配置。

Mapper.xml(部分配置)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<mapper namespace="test">
<select id="findUserById" parameterType="int" resultType="cn.com.mybatis.model.User">
  SELECT * FROM USER WHERE id = #{id}
   </select>
</mapper>

//parameterType指定了输入参数的类型
//resultType指定了输出结果映射的Java对象类型,参数信息是一个JavaBean,会将结果参数配置表示将单条记录映射成一个Java对象
//"#{}"是占位符,会创建预处理语句属性,用于安全地设置对应的值。
//"${}"是拼接符,在加载SQL语句"${}"的字符串内容时,不会改变或转义该字符串

Mapper.xml文件路径
<mappers>
<mapper resource="sqlmap/UserMapper.xml" />
</mappers>

会话工厂与会话

MyBatis处理这些配置信息的核心对象就是"会话工厂"与"会话"。

SqlSessionFactory类会根据Resources资源信息加载对象,获取开发人员在项目中配置的数据库连接池配置文件SqlMapConfig.xml的信息,从而产生一种可以与数据库交互的会话实例类-SqlSession.

运行流程

SqlSessionFactory会话工厂会通过Resource资源信息加载对象获取SqlMapConfig.xml配置文件信息,然后产生可以与数据库进行交互的会话实例类SqlSession。会话实例类SqlSession可以根据Mapper配置文件中的SQL配置,去执行相应的增删查改操作。而在SqlSession类内部,是通过执行器Executor(分为基本执行器和缓存执行器)对数据库进行操作。执行器Executor与数据库交互,依靠的是底层封装对象Mappered Statement,它封装了从Mapper文件中读取的信息(包括SQL语句、输入参数、输出结果类型)。通过Executor与底层封装对象Mappered Statement的结合,就实现了与数据库进行交互的功能。

配置文件详解

SqlMapConfig

包含了数据库连接信息和Mapper映射文件的加载路径、全局参数以及类型别名等一系列MyBatis的核心配置信息。

配置名称配置含义配置简介
configuration 包裹所有配置标签 整个配置文件的顶级标签
properties 属性 可以引入外部配置,也可以自己配置
setting 全局配置参数 用来配置一些改变运行时行为的信息,例:延迟机制、延迟加载等
typeAliases 类型别名 设置一些别名来代替Java的长类型声明
typeHandlers 类型处理器 将SQL中返回的数据库类型转换为相应的Java类型的处理器配置
objectFactory 对象工厂 实例化目标类的工厂类配置
plugins 插件 修改MyBatis的核心行为
environments 环境集合属性对象 数据库环境信息的集合
environment 环境子属性对象 数据库环境配置的详细配置
tranasctionManager 事务管理 指定MyBatis的事务管理器
dataSource 数据源 type指定连接类型,property指定数据库连接池的其他信息
mappers 映射器 配置SQL映射文件的位置。

prooerties

可以供整个配置文件中的其他配置使用,properties标签可以引入一个可动态变换的外部配置。在properties标签内部放property标签,来配置子元素信息。通过property标签的name属性取得相应的value值。

properties标签配置样例

//避免了数据库信息的"硬编码"
<propreties resource="org/mybatis/test/db.properties">
<property name="username" value="root"></property>
   <property name="password" value="root"></property>
</propreties>

db.property文件配置样例
driver=com.mybatis.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8
username=root
password=root

<dataSource type="POOLED">
<property name="deriver" value="${driver}"></property>
   <property name="url" value="${url}"></property>
   <property name="username" value="${username}"></property>
   <property name="password" value="${password}"></property>
</dataSource>

setting

setting配置缓存、延迟加载、结果集控制、执行器、分页设置、命名规则等控制性参数,与MyBatis的运行性能息息相关。

属性名含义默认值
cacheEnabled 是否使用缓存 true
lazyLoadingEnabled 是否开启延迟加载 false
aggressiveLazyLoading 是否按需加载属性 false
defaultScriptingLanguage 动态SQL默认语言 org.agache.ibatis.scriping.xmltags.XMLLanguageDriver
完整的setting配置样例

<settings>
<setting name="cacheEnabled" value="true"></setting>
   <setting name="lazyLoadingEnabled" value="true"></setting>
   <setting name="multipleResultSetsEnable" value="true"></setting>
   <setting name="useColumnLabel" value="true"></setting>
   <setting name="useGeneratedKeys" value="false"></setting>
   <setting name="autoMappingBehavior" value="PARTIAL"></setting>
   <setting name="autoMappingUnknownCoolumnBehavior" value="WARNING"></setting>
   <setting name="defaultExecutorType" value="SIMPLE"></setting>
   <setting name="defaultStatementTimeout" value="25"></setting>
   <setting name="defaultFetchSize" value="100"></setting>
   <setting name="safeRowBoundsEnabled" value="false"></setting>
   <setting name="mapUnderscoreToCamelCase" value="false"></setting>
   <setting name="localCacheScope" value="SESSION"></setting>
   <setting name="jdbcTypeForNull" value="OTHER"></setting>
   <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"></setting>
</settings>

typeAliases

常使用paramterType、resultType之类的参数设置SQL语句的输入/输出参数,一般参数都是一个Java类型的数据,有基本数据类型或封装类型,但是一般都要声明该类型的全路径名称。

配置示例

<typeAliases>
<typeAlias name="com.mybatis.po"></typeAlias>
</typeAliases>

在SQL映射配置文件中可以使用别名来指定输入/输出参数的类型

<select id="findUserByUsername" parameterType="str" resultType="user">
SELECT * FROM USER WHERE username LIKE \'%${value}%\'
</select>

别名可以使用@Alias注解来实现,在需指定别名的类声明头添加即可

typeHandlers

将从数据库获取的值以合适的方式转换为Java类型,或者将Java类型的参数转换为数据库对应的类型。使用typeHandlers配置一个自己的类型处理器分为三步:1.编写类型处理器类 2.在MyBatis全局配置文件中配置该类型处理器 3.在SQL映射配置文件中使用

objectFactory

实例化查询结果对应的目标类,有两种方式将查询结果的值映射到对应的目标类,一是通过目标类的默认构造方法,另外一种通过目标类的有参构造方法。想改写默认的对象工厂,可以继承DefaultObjectFactory来创建自己的对象工厂。

plugins

可以很好地对方法的调用进行监控,而且还可以修改或重写方法的行为逻辑,主要是对某种方法进行拦截调用的机制。实现plugin只需继承Interceptor接口,并且指定需要拦截的方法的签名信息即可。

environments

放置有关数据库连接数据的配置标签,所有与外部数据库进行交互的数据都配置在该标签中。每一个environment,代表多个数据库环境的配置信息,都包含事务管理器和数据源信息。事务管理器有两种类型:JDBC和MANAGED,JDBC相当于直接使用JDBC的提交和回滚。设置为MANAGED,则不提交和回滚连接,而是由容器来管理事务的生命周期,默认是关闭状态。

Mybatis有三种内建的数据源类型:UNPOOLED、POOLED、JNDI。UNPLOOED设置每次请求时打开和关闭连接;POOLED设置一个管理数据库连接的资源池,用来合理控制数据库的连接和关闭次数;JNDI配置连接外部数据源的信息

DataSource配置信息

属性名称作用
driver JDBC驱动名称,可以使用"."为驱动添加其他属性
url 数据库连接地址
username 数据库连接用户名
password 数据库连接密码
defaultTransactionIsolationLevel 默认连接事务的隔离级别

MyBatis要兼容各个数据库厂商的SQL语言规则,还需在全局中配置“databaseIdProvider”参数。

mappers

用来配置需要加载的SQL映射配置文件的路径的,mappers的子标签mapper都是一个独立的Mapper映射配置文件的路径,可以使用相对路径、绝对路径、接口信息、接口所在的包。

Mapper

主要用来配置SQL映射语句的,根据不同的SQL语句性质,使用不同的标签来包裹。

标签名称作用
insert 插入语句
update 更新语句
delete 删除语句
select 查询语句
resultMap 将数据库结果集取出的数据映射到实体对象的相应字段中
Mapper自动映射

如果SQL语句查询的结果中有列名与该Java包装类中的属性名一致,则该字段就会被映射到该属性上。自动映射有三种模式:NONE、PARTIAL、FULL。NONE表示不启用自动映射;PARTIAL表示只对非嵌套的resultMap进行自动映射;FULL表示对所有的resultMap都进行自动映射,默认为PARTIAL,对于FULL模式,不管resultMap是嵌套还是非嵌套都会自动映射,慎重使用防止数据混乱。

缓存结构

MyBatis提供一级缓存和二级缓存的机制。一级缓存是SqlSession级别的缓存。二级缓存是Mapper级别的缓存,多个SqlSession类的实例对象操作同一个Mapper配置文件中的SQL语句,多个SqlSession类的实例对象可以共用二级缓存,二级缓存是跨SqlSession的。

要开启二级缓存,需要在MyBatis的全局配置文件SqlMapConfig.xml中配置setting属性,name值为"cacheEnabled",value的值为"true"。还需要在mapper.xml中添加一个cache标签即可。

二级缓存的特点:

  1. 缓存以namespace为单位,不同的namespace下的操作互不影响

  2. 增、删、改操作会清空namespace下的全部缓存

  3. 通常使用MyBatis Generator(逆向工程)生成的代码中,各个表都是独立的,每个表都有自己的namespace。

以上是关于Mybatis的主要内容,如果未能解决你的问题,请参考以下文章

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

mybatis动态sql之利用sql标签抽取可重用的sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段