文章目录
-
- 第1章 MyBatis简介
- 1.1 MyBatis历史
- 1.2 MyBatis简介
- 1.3 如何下载MyBatis
- 1.4 为什么要使用MyBatis – 现有持久化技术的对比
- 第2章 HelloWorld
- 2.1 开发环境的准备
- 2.2 创建数据库和表
- 2.3 创建Employee类
- 2.4 创建EmployeeMapper(Dao)接口
- 2.5 创建Mybatis的sql映射文件
- 2.6 创建MyBatis的全局配置文件
- 2.7 测试
- 第3章 MyBatis全局配置文件
- 3.1 MyBatis全局配置文件简介
- 3.2 properties属性
- 3.3 settings设置
- 3.4 typeAliases 别名处理
- 3.5 typeHandlers 类型处理器
- 3.6 plugins 插件机制
- 3.7 environments 环境配置
- 3.8 databaseIdProvider数据库厂商标识
- 3.9 mappers 映射器
- 第4章 MyBatis 映射文件
- 4.1 Mybatis映射文件简介
- 4.2 Mybatis映射CRUD
- 4.2.1 select
- 4.2.2 insert
- 4.2.3 update
- 4.2.4 delete
- 4.3 主键生成方式、获取主键值
- 4.3.1 主键生成方式
- 4.3.2 获取主键值
- 4.4 参数传递
- 4.4.1 参数传递的方式
- 4.4.2 参数传递源码分析
- 4.4.3 参数处理
- 4.4.4 参数的获取方式
- 4.5 select查询的几种情况
- 4.6 resultType自动映射
- 4.7 resultMap自定义映射
- 4.7.1 id&result 中的属性
- 4.7.2 association
- 4.7.3 association 分步查询
- 4.7.4 association 分步查询使用延迟加载
- 4.7.5 collection
- 4.7.6 collection 分步查询
- 4.7.7 collection 分步查询使用延迟加载
- 4.7.8 扩展: 分步查询多列值的传递
- 第5章 MyBatis 动态SQL
- 5.1 MyBatis动态SQL简介
- 5.2 if where
- 5.3 trim
- 5.4 set
- 5.5 choose(when、otherwise)
- 5.6 foreach
- 5.7 sql
- 第6章 MyBatis 缓存机制
- 6.1 缓存机制简介
- 6.2 一级缓存的使用
- 6.3 一级缓存失效的几种情况
- 6.4 二级缓存的使用
- 6.5 缓存的相关属性设置
- 6.6 整合第三方缓存
- 第7章 MyBatis 逆向工程
- 7.1 逆向工程简介
- 7.2 逆向工程的配置
- 7.3 逆向工程的使用
- 第8章 扩展-PageHelper分页插件
- 8.1 PageHelper 分页插件简介
- 8.2 PageHelper的使用步骤
- 8.3 Page对象的使用
- 8.4 PageInfo对象的使用
- 第9章 SSM框架整合
- 9.1 整合注意事项
- 9.2 整合步骤
- 9.3 整合的配置
- 9.3.1 web.xml
- 9.3.2 Spring配置
- 9.3.3 SpringMVC配置
- 9.3.4 MyBatis配置
- 9.3.5 Spring 整合MyBatis 配置
- 9.4 整合测试
第1章 MyBatis简介
1.1 MyBatis历史
1)MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis ,代码于2013年11月迁移到Github。
2)iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis 提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
1.2 MyBatis简介
1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录
4) Mybatis 是一个 半自动的ORM(Object Relation Mapping)框架
1.3 如何下载MyBatis
1) 下载网址
https://github.com/mybatis/mybatis-3
1.4 为什么要使用MyBatis – 现有持久化技术的对比
1) JDBC
① SQL夹在Java代码块里,耦合度高导致硬编码内伤
② 维护不易且实际开发需求中sql有变化,频繁修改的情况多见
2) Hibernate和JPA
① 长难复杂SQL,对于Hibernate而言处理也不容易
② 内部自动生产的SQL,不容易做特殊优化
③ 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降
3) MyBatis
① 对开发人员而言,核心sql还是需要自己优化
② sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据
第2章 HelloWorld
2.1 开发环境的准备
- 导入以下jar包
2) 导入log4j 的配置文件log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
2.2 创建数据库和表
在MySQL中执行资料中的mybatis.sql文件
2.3 创建Employee类
package com.atguigu.mybatis.entities;
public class Employee {
private Integer id;
private String lastName;
private String email;
private Double salary;
private Integer deptId;
public Employee() {
}
public Employee(Integer id, String lastName, String email, Double salary, Integer deptId) {
this.id = id;
this.lastName = lastName;
this.email = email;
this.salary = salary;
this.deptId = deptId;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
", salary=" + salary +
", deptId=" + deptId +
'}';
}
}
2.4 创建EmployeeMapper(Dao)接口
package com.atguigu.mybatis.dao;
import com.atguigu.mybatis.entities.Employee;
public interface EmployeeMapper {
Employee getEmployeeById(Integer id);
}
2.5 创建Mybatis的sql映射文件
- 参考MyBatis的官方文档创建EmployeeMapper.xml映射文件
- 完成两个绑定
a) 标签中的namespace属性必须指定成Mapper接口的全类名
b) Mapper映射文件中的增删改查标签的id必须指定成Mapper接口中的方法名
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace属性:设置为接口的全类名-->
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper">
<!--
id属性:设置为接口中的方法名
resultType属性:设置为方法的返回值的类型的全类名
-->
<select id="getEmployeeById" resultType="com.atguigu.mybatis.entities.Employee">
select id,last_name lastName,email,salary,dept_id deptId
from employees
where id = #{id}
</select>
</mapper>
2.6 创建MyBatis的全局配置文件
参考MyBatis的官网文档创建mybatis-config.xml全局配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--设置Mapper映射文件(sql映射文件)-->
<mappers>
<mapper resource="com/atguigu/mybatis/dao/EmployeeMapper.xml"/>
</mappers>
</configuration>
2.7 测试
参考MyBatis的官方文件创建测试代码
package com.atguigu.mybatis.test;
import com.atguigu.mybatis.dao.EmployeeMapper;
import com.atguigu.mybatis.entities.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisTest {
/*
测试HelloWorld
*/
@Test
public void testHelloWorld() throws IOException {
//设置MyBatis全局配置文件的路径
String resource = "mybatis-config.xml";
//读取类路径下的配置文件得到输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象,相当于Connection对象
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//获取Mapper代理对象
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//调用EmployeeMapper中获取一个对象的方法
Employee employeeById = mapper.getEmployeeById(1);
System.out.println(employeeById);
} finally {
//关闭sqlSession
sqlSession.close();
}
}
}
第3章 MyBatis全局配置文件
3.1 MyBatis全局配置文件简介
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
3.2 properties属性
- 可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来配置
<properties>
<property name="username" value="hanzong"/>
<property name="password" value="123456"/>
</properties>
- 然而properties的作用并不单单是这样,你可以创建一个资源文件,名为jdbc.properties的文件,将四个连接字符串的数据在资源文件中通过键值 对(key=value)的方式放置,不要任何符号,一条占一行
a) jdbc.properties
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.driver=com.mysql.jdbc.Driver
b) 通过properties标签引入jdbc.properties文件
<!--
resource属性:引入类路径下的属性文件
url属性:引入网络或磁盘路径下的属性文件
-->
<properties resource="jdbc.properties"></properties
c) 在environment元素的dataSource元素中为其动态设置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
- 如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
a) 首先读取在 properties 元素体内指定的属性。
b) 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
c) 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
3.3 settings设置
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项常见设置的含义、默认值等
3.4 typeAliases 别名处理
- 通过子标签typeAlias设置别名
<typeAliases>
<!--
子标签typeAlias:用来给某些类指定别名
type属性:指定起别名的类的全类名
alias属性:指定别名,如果没有指定则是类命的首字母小写,但是别名大小写不敏感
-->
<typeAlias type="com.atguigu.mybatis.entities.Employee" alias="employee"></typeAlias>
</typeAliases>
- 通过子标签package设置别名
<typeAliases>
<!--
子标签package:通过指定包名给包下所有的类起别名
name属性:指定包名
-->
<package name="com.atguigu.mybatis.entities"/>
</typeAliases>
- MyBatis已经取好的别名
3.5 typeHandlers 类型处理器
- 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型
- MyBatis中提供的类型处理器:
- 日期和时间的处理,JDK1.8以前一直是个头疼的问题。我们通常使用JSR310规范领导者Stephen Colebourne创建的Joda-Time来操作。1.8已经实现全部的JSR310规范了
- 日期时间处理上,我们可以使用MyBatis基于JSR310(Date and Time API)编写的各种日期时间类型处理器。
- MyBatis3.4以前的版本需要我们手动注册这些处理器,以后的版本都是自动注册的,如需注册,需要下载mybatistypehandlers-jsr310,并通过如下方式注册
6) 自定义类型转换器
① 我们可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类 型
② 步骤
实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
指定其映射某个JDBC类型(可选操作)
在mybatis全局配置文件中注册
3.6 plugins 插件机制
- 插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行
- 四大对象:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
3.7 environments 环境配置
- MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置
- 每种环境使用一个environment标签进行配置并通过id属性指定唯一标识符
- 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境
- environment-指定具体环境
a) id:指定当前环境的唯一标识
b) transactionManager和dataSource都必须有
<environments default="development">
<!--开发环境-->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<!--生产环境-->
<environment id="online">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
-
transactionManager
type: JDBC | MANAGED | 自定义
JDBC:使用了 JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范 围。 JdbcTransactionFactory
MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 ManagedTransactionFactory
自定义:实现TransactionFactory接口,type=全类名/别名 -
dataSource
type: UNPOOLED | POOLED | JNDI | 自定义
UNPOOLED:不使用连接池, UnpooledDataSourceFactory
POOLED:使用连接池, PooledDataSourceFactory
JNDI: 在EJB 或应用服务器这类容器中查找指定的数据源
自定义:实现DataSourceFactory接口,定义数据源的获取方式。 -
可以通过org.apache.ibatis.session. Configuration查询上述信息
-
实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置
3.8 databaseIdProvider数据库厂商标识
- MyBatis 可以根据不同的数据库厂商执行不同的语句
<!--设置数据库厂商标识--