《深入浅出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最复杂、最核心的组件。
引入映射器的方法很多,主要分为:
- 用文件路径引入映射器
- 用包名引入映射器
- 用类注册引入映射器
- 用userMapper.xml引入映射器
以上是关于《深入浅出MyBatis技术原理与实战》读书笔记 - MyBatis入门与配置的主要内容,如果未能解决你的问题,请参考以下文章
《深入浅出MyBatis技术原理与实战》读书笔记 - 动态SQL