MyBatis:一个半自动映射的框架,之所以称它为半自动,是因为它需要手工匹配提供POJO,SQL和映射关系。
MyBatis的核心组件:
Mybatis提供两种模式去创建SqlSessionFactory:
这里先配置一个简易的XML,包括获取数据库连接实例的数据源(DataSource)、决定事务范围和控制方式的事务管理器(TransactionManager)和映射器(SQL Mapper).
说明:
SqlSession是一个接口类,在MyBatis中SqlSession接口的实现类有两个,分别是DefaultSqlSession和SqlSessionManager。
SqlSession的用途主要有两种:
(1)获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。
(2)直接通过命名信息去执行SQL返回结果。
映射器是由Java接口和XML文件(或注解)共同组成的,作用:
(1)定义参数类型
(2)描述缓存
(3)描述SQL语句
(4)定义查询结果和POJO的映射关系
映射器的实现方式有两种:
它由一个Java接口和一个XML文件构成。
(1)给出Java接口
正确理解SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和Mapper的生命周期。
它的作用就是一个构造器,一旦我们构建了SqlSessionFactory,它的作用就已经完结,失去了存在的意义,这时我们就应该毫不犹豫的废弃它,将它回收。所以它的生命周期只存在于方法的局部,它的作用就是生成SqlSessionFactroy对象。
SqlSessionFactory的作用是创建SqlSession,相当于JDBC中的Connection对象。每次应用程序需要访问数据库,我们就要通过SqlSessionFactory创建SqlSession,所以SqlSessionFactory应该在MyBatis应用的整个生命周期中。
它的生命周期应该是在请求数据库处理事务的过程中。
Mapper是一个接口,而没有任何实现类,它的作用是发送SQL,然后返回我们需要的结果,或者执行SQL而修改数据库的数据,因此它应该在一个SqlSession事务方法之内。
MyBatis配置XML文件的层次结构是不能够颠倒顺序的,如果颠倒顺序,MyBatis在解析XML文件的时候就会出现异常。
properties是一个配置属性的元素,让我们能在配置文件的上下文中使用它。
MyBatis提供3种配置方式:
property子元素
properties配置文件
程序参数传递
类的全限定名过长,可以用别名简短的去指代它。
MyBatis的别名分为系统定义别名和自定义别名两类。
MyBatis在预处理语句(PreparedStatement)中设置一个参数时,或者从结果集(ResultSet)中取出一个值时,都会用注册了的typeHandler进行处理。
typeHandler在MyBatis分为系统定义和用户自定义。
typeHandler常用的配置为Java类型(javaType)、JDBC类型(jdbcType)。
作用就是将参数从javaType转化为jdbcType,或者从数据库取出结果时把jdbcType转化为javaType。
看MyBatis系统内部定义的一系列typeHandler,org.apache.ibatis.type.TypeHndlerRegistry源码
Java类型和JDBC类型对照表
举个例子:StringTypeHandler在MyBatis中的源码
/**
* Copyright 2009-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ibatis.type;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @author Clinton Begin
*/
public class StringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
throws SQLException {
ps.setString(i, parameter);
}
@Override
public String getNullableResult(ResultSet rs, String columnName)
throws SQLException {
return rs.getString(columnName);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
return rs.getString(columnIndex);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
return cs.getString(columnIndex);
}
}
StringTypeHandler继承了BaseTypeHandler。而BaseTypeHandler实现了接口typeHandler,并且自己定义了4个抽象方法。
setParameter是PreparedStatement对象设置参数,它允许我们自己填写变换规则。
getResult则分为ResultSet用列名(columnName)或者使用下标(columnIndex)来获取结果数据。其中还包括了用Call安不了Statement(存储过程)获取结果及数据的方法。
当Mybatis在构建一个结果返回的时候,都会使用ObjectFactory(对象工厂)去构建POJO,在Mybatis中可以定制自己的对象工厂。一般来说我们默认使用ObjectFactory。大多数情况下使用系统默认的即可。
插件比较复杂,小编还没有去了解。
配置环境可以注册多个数据源(dataSource),每一个数据源分为两大部分:数据源的配置和数据库事务的配置。
映射器是Mybatis最复杂、最核心的组件。
引入映射器的方法很多,主要分为: