《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置

MyBatis入门与配置

MyBatis:一个半自动映射的框架,之所以称它为半自动,是因为它需要手工匹配提供POJO,SQL和映射关系。

1. MyBatis的基本构成

MyBatis的核心组件:

  • SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口)
  • SqlSessionFactory:依靠工厂来生成SqlSession(会话)
  • SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper接口
  • SQL Mapper:他是MyBats新设计的组件,它是一个Java接口和XML文件(注解)构成的,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果
    《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第1张图片

1.1.构建SqlSessionFactory

Mybatis提供两种模式去创建SqlSessionFactory:

  • XML配置(推荐)
  • 代码
    《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第2张图片

1.1.1. 使用XML方式构建

这里先配置一个简易的XML,包括获取数据库连接实例的数据源(DataSource)、决定事务范围和控制方式的事务管理器(TransactionManager)和映射器(SQL Mapper).
《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第3张图片
说明:

  • 配置环境内容,它默认使用id是development的环境配置,包含以下两方面内容
    (1)采用JDBC的事务管理模式
    (2)数据库的连接信息
  • 配置映射器
    这里引入了一个XML,它的作用是提供SQL和SQL对POJO的映射规则定义,它 包含了映射器里面的信息。MyBatis将解析这个XML,来为我们生成映射器。
    现在用代码实现创建的SqlSessionFactory
    《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第4张图片
    先创建了一个XML文件输入流,用SqlSessionFactoryBuilder读取XML的信息来创建SqlSessionFactory的对象。

1.2.创建SqlSession

SqlSession是一个接口类,在MyBatis中SqlSession接口的实现类有两个,分别是DefaultSqlSession和SqlSessionManager。

《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第5张图片

SqlSession的用途主要有两种:
(1)获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。
(2)直接通过命名信息去执行SQL返回结果。

1.3.映射器

映射器是由Java接口和XML文件(或注解)共同组成的,作用:
(1)定义参数类型
(2)描述缓存
(3)描述SQL语句
(4)定义查询结果和POJO的映射关系

映射器的实现方式有两种:

  • XML(推荐)
  • 代码

1.3.1.XML文件配置方式实现Mapper

它由一个Java接口和一个XML文件构成。

(1)给出Java接口

《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第6张图片
(2)给出映射XML文件
《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第7张图片

2.生命周期

正确理解SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和Mapper的生命周期。

2.1.SqlSessionFactoryBuilder

它的作用就是一个构造器,一旦我们构建了SqlSessionFactory,它的作用就已经完结,失去了存在的意义,这时我们就应该毫不犹豫的废弃它,将它回收。所以它的生命周期只存在于方法的局部,它的作用就是生成SqlSessionFactroy对象。

2.2.SqlSessionFactory

SqlSessionFactory的作用是创建SqlSession,相当于JDBC中的Connection对象。每次应用程序需要访问数据库,我们就要通过SqlSessionFactory创建SqlSession,所以SqlSessionFactory应该在MyBatis应用的整个生命周期中。

2.3.SqlSession

它的生命周期应该是在请求数据库处理事务的过程中。

2.4.Mapper

Mapper是一个接口,而没有任何实现类,它的作用是发送SQL,然后返回我们需要的结果,或者执行SQL而修改数据库的数据,因此它应该在一个SqlSession事务方法之内。

3.配置

MyBatis配置XML文件的层次结构是不能够颠倒顺序的,如果颠倒顺序,MyBatis在解析XML文件的时候就会出现异常。

《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第8张图片

3.1.properties元素

properties是一个配置属性的元素,让我们能在配置文件的上下文中使用它。
MyBatis提供3种配置方式:
property子元素
properties配置文件
程序参数传递

3.2.设置

《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第9张图片

3.3.别名

类的全限定名过长,可以用别名简短的去指代它。
MyBatis的别名分为系统定义别名和自定义别名两类。

3.4.typeHandler类型处理器

MyBatis在预处理语句(PreparedStatement)中设置一个参数时,或者从结果集(ResultSet)中取出一个值时,都会用注册了的typeHandler进行处理。
typeHandler在MyBatis分为系统定义和用户自定义。

typeHandler常用的配置为Java类型(javaType)、JDBC类型(jdbcType)。
作用就是将参数从javaType转化为jdbcType,或者从数据库取出结果时把jdbcType转化为javaType。

3.4.1.系统定义的typeHandler

看MyBatis系统内部定义的一系列typeHandler,org.apache.ibatis.type.TypeHndlerRegistry源码

《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第10张图片
Java类型和JDBC类型对照表
《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第11张图片
《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第12张图片
举个例子: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(存储过程)获取结果及数据的方法。

3.5.ObjectFactory

当Mybatis在构建一个结果返回的时候,都会使用ObjectFactory(对象工厂)去构建POJO,在Mybatis中可以定制自己的对象工厂。一般来说我们默认使用ObjectFactory。大多数情况下使用系统默认的即可。

3.6.插件

插件比较复杂,小编还没有去了解。

3.7.environments配置环境

配置环境可以注册多个数据源(dataSource),每一个数据源分为两大部分:数据源的配置和数据库事务的配置。

《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第13张图片

3.8.引入映射器的方法

映射器是Mybatis最复杂、最核心的组件。

引入映射器的方法很多,主要分为:

  1. 用文件路径引入映射器
    在这里插入图片描述
  2. 用包名引入映射器
    在这里插入图片描述
  3. 用类注册引入映射器
    《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第14张图片
  4. 用userMapper.xml引入映射器
    《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置_第15张图片

你可能感兴趣的:(mybatis)