MyBatis入门

简介

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

文件

MyBatis配置文件:配置全局设置,数据库连接信息等
SQL Mapper文件:需要执行的SQL语句

使用

  • 添加maven依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>x.x.x</version>
    </dependency>
  • 配置MyBatis

  • 获取SqlSessionFactory

    1
    2
    3
    String resource = "org/mybatis/example/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  • 获取SqlSession(需要关闭)

    1
    SqlSession session = sqlSessionFactory.openSession();
  • 获取Mapper

    1
    Mapper mapper = session.getMapper(Mapper.class);

Mybatis配置文件

properties标签

properties配置,可以引入外部配置也可以在标签内设置
详见:MyBatisXML:properties

settings标签

全局设置,配置MyBatis的行为
详见:MyBatisXML:settings

typeAliases标签

指定类的别名
详见:MyBatisXML:typeAliases

typeHanglers标签

类型处理器,用于SQL执行时以及结果返回时
详见:MyBatisXML:typeHandlers

objectFactory标签

对象工厂,用于创建持久化对象
详见:MyBatisXML:objectFactory

plugins标签

插件,类似于AOP、Filter、Intercept
详见:MybatisXML:plugins

environments标签

数据库连接配置,可以区分不同的环境
详见:MyBatisXML:environments

databaseIdProvider标签

MyBatis 可以根据不同的数据库厂商执行不同的语句
详见:MyBatisXML:databaseIdProvider

mapper标签

SQL映射文件
详见:MyBatisXML:mappers

Mapper文件

namespace属性:命名空间,值为对应接口的完全限定名

主要标签

  • resultMap – 返回值映射关系
  • sql – 可被其他语句引用的可重用语句块
  • insert – 映射插入语句
  • update – 映射更新语句
  • delete – 映射删除语句
  • select – 映射查询语句

select标签

查询语句

常用属性

属性 描述
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType 将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
resultType 从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。

详见:Mapper:select

insert,update,delete标签

插入,更新,删除

常用属性

属性 描述
id 命名空间中的唯一标识符,可被用来代表这条语句。
parameterType 将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。

详见:Mapper:insert,update,delete

Parameters

当参数名和对应接口中的参数名相同时可以在接口中省略@Param,且MyBatis会根据参数名智能匹配自定义数据类型的成员变量
详见:Mapper:Parameters

Result Maps

若数据库中字段名与Java中实体类中成员变量名完全吻合,MyBatis可以智能匹配并注入结果,若不吻合,则需要开发者自定以Result Map,以实现数据库查询结果到实体类的映射
详见:Mapper:Result Maps

注解配置Mapper

对于注解配置MyBatis,不推荐使用,注解写在Java源代码中,失去了原有的灵活性,若是需要修改,必须修改源文件,增加了风险,已经确定不会改变的可以使用注解配置
详见:MyBatis:Java Api

Spring集成MyBatis

  • 添加maven依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>x.x.x</version>
    </dependency>
  • 配置数据源dataSource

  • 配置SqlSessionFactoryBean

    1
    2
    3
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    </bean>

    详见:MyBatis-Spring:SqlSessionFactoryBean

  • 配置自动包扫描MapperScannerConfigurer

    1
    2
    3
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
    </bean>

    详见:MyBatis-Spring:MapperScannerConfigurer

  • 配置事务

    1
    2
    3
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
    </bean>

    详见:MyBatis-Spring:Transactions

SpringBoot集成MyBatis

详见:MyBatis:Spring Boot Starter

添加依赖

1
2
3
4
5
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>

配置MyBatis

  • 传统xml方式
    在application.properties中添加:mybatis.config-location,值为MyBatis配置xml文件位置
  • SpringBoot方式
    在application.properties中添加:
    mybatis.configuration.*,基本属性配置
    mybatis.type-handlers-package,类型处理器所在包
  • 扫描Dao(即mapper)包
    使用注解 @MapperScan(package path)

动态SQL

详见:Mybatis:DynamicSQL

if标签:

若属性test中表达式为true则拼接

choose,when,otherwise标签

类似于Java的Switch

trim,where,set标签

trim 自定义拼接
where,set MyBatis提供的自定义拼接,可以去除头部多余的 “AND|OR”,及尾部 “,”

foreach标签

循环处理,可以指定开始符与结束符(栗:’(‘ | ‘)’ )

Multi-db vendor support - 多数据库支持

需配置databaseIdProvider

typeHandle

  • 继承:
    BaseTypeHandler

  • 重写:
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
    public String getNullableResult(ResultSet rs, String columnName)
    public String getNullableResult(ResultSet rs, int columnIndex)
    public String getNullableResult(CallableStatement cs, int columnIndex)

plugins

MyBatis 允许使用插件来拦截的方法调用包括:
* Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
* ParameterHandler (getParameterObject, setParameters)
* ResultSetHandler (handleResultSets, handleOutputParameters)
* StatementHandler (prepare, parameterize, batch, update, query)

添加注解

1
2
3
4
5
@Intercepts({@Signature(
type= Executor.class, //想要拦截的类
method = "update", //想要拦截的方法
args = {MappedStatement.class,Object.class}
)})

实现:

Interceptor

重写:

public Object intercept(Invocation invocation) 
public Object plugin(Object target) 
public void setProperties(Properties properties)