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

Posted Leida_wanglin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置相关的知识,希望对你有一定的参考价值。

MyBatis入门与配置

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

1. MyBatis的基本构成

MyBatis的核心组件:

  • SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口)
  • SqlSessionFactory:依靠工厂来生成SqlSession(会话)
  • SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper接口
  • SQL Mapper:他是MyBats新设计的组件,它是一个Java接口和XML文件(注解)构成的,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果

1.1.构建SqlSessionFactory

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

  • XML配置(推荐)
  • 代码

1.1.1. 使用XML方式构建

这里先配置一个简易的XML,包括获取数据库连接实例的数据源(DataSource)、决定事务范围和控制方式的事务管理器(TransactionManager)和映射器(SQL Mapper).

说明:

  • 配置环境内容,它默认使用id是development的环境配置,包含以下两方面内容
    (1)采用JDBC的事务管理模式
    (2)数据库的连接信息
  • 配置映射器
    这里引入了一个XML,它的作用是提供SQL和SQL对POJO的映射规则定义,它 包含了映射器里面的信息。MyBatis将解析这个XML,来为我们生成映射器。
    现在用代码实现创建的SqlSessionFactory

    先创建了一个XML文件输入流,用SqlSessionFactoryBuilder读取XML的信息来创建SqlSessionFactory的对象。

1.2.创建SqlSession

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

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接口


(2)给出映射XML文件

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文件的时候就会出现异常。

3.1.properties元素

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

3.2.设置

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源码


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(存储过程)获取结果及数据的方法。

3.5.ObjectFactory

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

3.6.插件

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

3.7.environments配置环境

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

3.8.引入映射器的方法

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

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

  1. 用文件路径引入映射器
  2. 用包名引入映射器
  3. 用类注册引入映射器
  4. 用userMapper.xml引入映射器

以上是关于《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置的主要内容,如果未能解决你的问题,请参考以下文章

《深入浅出MyBatis技术原理与实战》读书笔记 - 动态SQL

《深入浅出MyBatis技术原理与实战》读书笔记 - 动态SQL

《深入浅出MyBatis技术原理与实战》修复错误和歧义

《深入浅出MyBatis技术原理与实战》——7. 插件

腾讯资深架构带你深入MyBatis技术原理与实战

《Flask Web开发实战:入门进阶与原理解析》读书笔记