文章目录
- 一、Mybatis概述
- 1.1概念
- 1.2优点与缺点
- 1.3MyBatis和Hibernate的区别
- 1.4Mybatis的核心对象
- 1.5Mybatis执行流程
- 三、Mybatis的快速使用
- 3.1开发环境
- 3.2 创建一个maven项目
- 3.3添加Maven依赖
- 3.4MySQL创建user表
- 3.5创建数据源database.properties文件
- 3.6编写mybatis-config.xml配置文件
- 3.7测试数据库连通性
- 3.8创建User类
- 3.9创建UserMapper接口
- 3.10创建UserMapper.xml文件
- 3.11添加扫描配置文件的路径
- 3.12测试UserMapper接口
- 3.13基于注解的开发
- 四、Mybatis的全局配置文件解析
- 五、 Mybatis的mapper(映射器)
- 5.1映射器概念
- 5.2Mybatis执行sql的两种方式
- 5.3select标签
- 5.4insert标签
- 5.5update标签
- 5.6delete标签
- 5.7resultMap标签
一、Mybatis概述
1.1概念
MyBatis本是apache的一个开源项目iBatis , 2010年改名为MyBatis。
MyBatis是一个基于Java的半自动ORM框架 ,是 JDBC 和 Hibernate 的替代方案 。
MyBatis 支持普通 SQL查询,存储过程,高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性, 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索 。
iBATIS 内部封装了 JDBC
,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身,使用 XML
文件或注解的方式实现 SQL 的灵活配置 。
每个MyBatis应用程序主要都是使用SqlSessionFactory
实例的,一个SqlSessionFactory
实例可以通过SqlSessionFactoryBuilder
获得。SqlSessionFactoryBuilder
可以从一个xml配置文件或者一个预定义的配置类的实例获得。
- ORM是什么?
Object Relation Mapping,对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的User类,去对应数据库中的一张user表,类中的属性和表中的列一一对应。User类就对应user表,一个User对象就对应user表中的一行数据。
1.2优点与缺点
优点:
- MyBatis 是免费且开源的。
- 与 JDBC 相比,减少了 50% 以上的代码量。
- MyBatis 是最简单的持久化框架,小巧并且简单易学。
- MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。
- 提供 XML 标签,支持编写动态 SQL 语句。
- 提供映射标签,支持对象与数据库的 ORM 字段关系映射。
- 支持存储过程。MyBatis 以存储过程的形式封装 SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。
缺点:
- 编写 SQL 语句工作量较大,对开发人员编写 SQL 语句的功底有一定要求。
- SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
1.3MyBatis和Hibernate的区别
Hibernate 和 MyBatis 都是目前业界中主流的对象关系映射(ORM)框架,它们的主要区别如下。
1.sql 优化方面
- Hibernate 使用 HQL(Hibernate Query Language)语句,独立于数据库。不需要编写大量的 SQL,就可以完全映射,但会多消耗性能,且开发人员不能自主的进行 SQL 性能优化。提供了日志、缓存、级联(级联比 MyBatis 强大)等特性。
- MyBatis 需要手动编写 SQL,所以灵活多变。支持动态 SQL、处理列表、动态生成表名、支持存储过程。工作量相对较大。
2.开发方面
-
Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。
-
MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO 和 SQL 的映射关系。
3.缓存机制比较
- Hibernate 的二级缓存配置在
SessionFactory
生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置缓存。 - MyBatis 的二级缓存配置在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且 Mybatis 可以在命名空间中共享相同的缓存配置和实例,通过 Cache-ref 来实现。
4.应用场景
- Hibernate 适合需求明确、业务固定的项目,例如 OA 项目、ERP 项目和 CRM 项目等。
- MyBatis 适合需求多变的互联网项目,例如电商项目、金融类型、旅游类、售票类项目等。
1.4Mybatis的核心对象
MyBatis 有三个基本要素:
-
核心接口和类
-
MyBatis核心配置文件(mybatis-config.xml)
-
SQL映射文件(mapper.xml)
MyBatis 的核心接口和类,如下所示。
每个 MyBatis 应用程序都以一个 SqlSessionFactory
对象的实例为核心。
首先获取 SqlSessionFactoryBuilder对象,可以根据 XML 配置文件或者 Configuration 类的实例构建该对象。
然后获取 SqlSessionFactory 对象,该对象实例可以通过 SqlSessionFactoryBuilder 对象来获取。
有了 SqlSessionFactory 对象之后,就可以进而获取 SqlSession实例。SqlSession 对象中完全包含以数据库为背景的所有执行 SQL 操作的方法,用该实例可以直接执行已映射的 SQL 语句。
SqlSessionFactoryBuilder :
SqlSessionFactoryBuilder 会根据配置信息或者代码生成 SqlSessionFactory,并且提供了多个 build() 方法重载,重要的就是这几个。
- build(InputStream inputStream, String environment, Properties properties)
- build(Reader reader, String environment, Properties properties)
- build(Configuration config)
SqlSessionFactory:
SqlSessionFactory 是工厂接口而不是现实类,他的任务就是创建 SqlSession。 SqlSessionFactory 通过 openSession() 方法来获取 SqlSession 实例 。
SqlSessionFactory的生命周期和作用域: SqlSessionFactory 对象一旦创建,就会在整个应用程序过程中始终存在。 最佳作用域是 Application 。
SqlSession:
SqlSession 是用于执行持久化操作的对象,类似于 JDBC 中的 Connection。它提供了面向数据库执行 SQL 命令所需的所有方法,可以通过 SqlSession 实例直接运行已映射的 SQL 语句。
对象 | 说明 |
---|---|
Executor接口 | 执行器.统一调度StatementHandler、PrepareStatement、ResultHandler对象执行对应的SQL |
StatementHandler | 使用的数据库中的Statement执行操作 相当于字符串拼接 |
PrepareStatement | 使用SQL传参的方式处理 |
MappedStatement | 负责对SQL封装,用于存储需要映射的SQL语句及参数等信息 |
ResultHandler | 对最后的结果进行封装 |
SqlSession 的用途主要有两种:
- 获取映射器。让映射器通过命名空间和方法名称找到对应的 SQL,并发送给数据库,执行后返回结果。
- 直接通过 “命名空间(namespace)+SQL id” 的方式执行 SQL,不需要获取映射器。这是 iBatis 版本留下的方式。
SqlSession生命周期和作用域:SqlSession 对应一次数据库会话。 需要注意的是,每个线程都有自己的 SqlSession 实例,SqlSession 实例不能被共享,也不是线程安全的。因此 SqlSession 的作用域范围是 request 作用域或方法体作用域内。
1.5Mybatis执行流程
三、Mybatis的快速使用
3.1开发环境
- JDK1.8
- IDEA2020
- Maven:apache-maven-3.6.3
- MySQL:MySQL5.7
3.2 创建一个maven项目
创建 MyBatis 程序的步骤为:下载jar包 -> 部署jar包 -> 编写MyBatis核心配置文件 -> 创建实体类 -> 创建DAO接口 -> 创建SQL映射文件 -> 编写测试类
3.3添加Maven依赖
添加mybatis依赖、junit依赖、lombok依赖、和配置xml和properties会打包进jar包里。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shenxm</groupId>
<artifactId>mybatis-demo</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<!-- mysql连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>compile</scope>
</dependency>
<!--解决冲突问题-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
<!-- junit test-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
<!-- 配置idea扫描xml或者properties文件 -->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
3.4MySQL创建user表
连接Mysql,创建数据库test,并且创建user表和导入数据:
-- 创建user表
DROP TABLE IF EXISTS USER;
CREATE TABLE USER
(
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 ;
-- 真实开发中,version(乐观锁)、deleted(逻辑删除)、create_time(创建时间)、update_time(修改时间)
-- 数据导入
INSERT INTO USER (id, NAME, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
3.5创建数据源database.properties文件
在 src\main\resources 目录下 创建 database.properties
文件:用于mybatis配置文件读取数据库信息
#mysql数据库:MySQL5.7
driver=com.mysql.jdbc.Driver
url= jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username=root
password=123456
3.6编写mybatis-config.xml配置文件
在 src\main\resources\mybatis 目录下 创建 mybatis-config.xml
配置文件: 用于配置数据库连接和 MyBatis 运行时所需的各种特性,包含了设置和影响 MyBatis 行为的属性、映射文件的位置。
<?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">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 引入 database.properties 配置文件-->
<properties resource="database.properties"/>
<!-- 配置环境:有助于将 SQL 映射应用于多种数据库之中 -->
<environments default="mysql">
<!-- 配置mysql的环境id-->
<environment id="mysql">
<!-- 配置事务的类型:用了 JDBC 的提交和回滚设施-->
<transactionManager type="JDBC"/>
<!-- 配置数据源(连接池)type="POOLED -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置 -->
<!-- <mappers>-->
<!-- 1.单独加载某个映射配置文件 -->
<!-- <mapper resource="com/shenxm/mybatisdemo/mapper/UserMapper"/>-->
<!-- 2.加载某包所有的配置文件 -->
<!-- <package name="com.shenxm.mybatisdemo.mapper"/>-->
<!-- </mappers>-->
</configuration>
3.7测试数据库连通性
在 src\test\java 目录下的 com.shenxm.mybatisdemo
包 创建 DemoTest测试类:用输入流读取配置文件,然后根据配置文件信息构建sqlSessionFactory对象,通过sqlSessionFactory对象创建sqlSession对象,并使用sqlSession对象的方法执行数据操作。
package com.shenxm.mybatisdemo;
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.Reader;
/**
* @Author: shen
* @CreateTime: 2022-01-05 21:51
* @Description: 测试类
* @Version 1.0
*/
public class DemoTest {
@Test
public void testConetion() throws IOException {
// 核心配置文件classpath路径
String resource = "mybatis/mybatis-config.xml";
// 加载配置文件
Reader config = Resources.getResourceAsReader(resource);
//InputStream config = Resources.getResourceAsStream(resource);
// 构建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
// 从SqlSessionFactory对象中获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
System.out.println(sqlSession.getConnection());
// 归还连接给数据源
sqlSession.close();
}
}
3.8创建User类
在src\main\java目录下 的 com.shenxm.mybatisdemo.po
包创建User类:用于跟数据库字段做映射。
package com.shenxm.mybatisdemo.po;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: shen
* @CreateTime: 2022-01-05 21:31
* @Description: 用户类
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
//常见的数据库中主键自动设置方法有(uuid、自增id、雪花算法、redis生成、zookeeper生成)
private Long id;
private String name;
private Integer age;
private String email;
}
3.9创建UserMapper接口
在src\main\java目录下 的com.shenxm.mybatisdemo.mapper
包创建UserMapper接口:
package com.shenxm.mybatisdemo.mapper;
import com.shenxm.mybatisdemo.po.User;
import java.util.List;
/**
* @Author: shen
* @CreateTime: 2022-01-05 21:48
* @Description: UserMapper
* @Version 1.0
*/
public interface UserMapper {
List<User> selectAll();
}
3.10创建UserMapper.xml文件
在src\main\java 目录下 的com.shenxm.mybatisdemo.mapper
包创建UserMapper.xml:
或者
在src\main\resources 目录下 的com.shenxm.mybatisdemo.mapper
包创建UserMapper.xml:
<?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">
<mapper namespace="com.shenxm.mybatisdemo.mapper.UserMapper">
<select id="selectAll" resultType="com.shenxm.mybatisdemo.po.User">
SELECT * FROM user;
</select>
</mapper>
注意:
1.mapper接口和mapper.xml之间需要遵循一定规则,才能成功的让mybatis将mapper接口和mapper.xml绑定起来
- mapper接口的全限定名,要和mapper.xml的namespace属性一致
- mapper接口中的方法名要和mapper.xml中的SQL标签的id一致
- mapper接口中的方法入参类型,要和mapper.xml中SQL语句的入参类型一致
- mapper接口中的方法出参类型,要和mapper.xml中SQL语句的返回值类型一致
2.<select>
标签表明这是一条查询语句,属性 id 用来标识这条 SQL。resultType 表示返回的是一个 User 类型的值。
3.11添加扫描配置文件的路径
在mybatis-config.xml
文件中添加:
若没有添加扫描,mapper.xml位置,则会报错。
<!-- 指定映射配置文件的位置 -->
<mappers>
<!-- 1.单独加载某个映射配置文件 -->
<!-- <mapper resource="com\shenxm\mybatisdemo\mapper\UserMapper.xml"/>-->
<!-- 2.加载某包所有的配置文件 -->
<package name="com.shenxm.mybatisdemo.mapper"/>
</mappers>
完整的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">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 引入 database.properties 配置文件-->
<properties resource="database.properties"/>
<!-- 配置环境:有助于将 SQL 映射应用于多种数据库之中 -->
<environments default="mysql">
<!-- 配置mysql的环境id-->
<environment id="mysql">
<!-- 配置事务的类型:用了 JDBC 的提交和回滚设施-->
<transactionManager type="JDBC"/>
<!-- 配置数据源(连接池)type="POOLED -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置 -->
<mappers>
<!-- 1.单独加载某个映射配置文件 -->
<!-- <mapper resource="com\shenxm\mybatisdemo\mapper\UserMapper.xml"/>-->
<!-- 2.加载某包所有的配置文件 -->
<package name="com.shenxm.mybatisdemo.mapper"/>
</mappers>
</configuration>
3.12测试UserMapper接口
在 src\test\java 目录下的 com.shenxm.mybatisdemo
包中 DemoTest测试类添加测试方法:
@Test
public void testMapper() {
// 核心配置文件classpath路径
String resource = "mybatis/mybatis-config.xml";
Reader config = null;
SqlSessionFactory sqlSessionFactory = null;
SqlSession sqlSession = null;
List<User> users = null;
try {
// 1.加载配置文件
// 第一种: Resources.getResourceAsReader(resource);
config = Resources.getResourceAsReader(resource);
// 第二种:InputStream config = Resources.getResourceAsStream(resource);
// 2.构建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
// 3.打开SqlSession连接
sqlSession = sqlSessionFactory.openSession();
// 4.获取该接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 5.执行接口中的方法
users = mapper.selectAll();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 6.释放SqlSession资源
sqlSession.close();
}
// 遍历集合
users.forEach(System.out::println);
}
/** 输出结果:
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
*/
3.13基于注解的开发
基于注解的开发,可以不写UserMapper.xml,只需要将sql写到代码里,但是后续的维护和扩展性不是很好。
这里将UserMapper接口改成:
package com.shenxm.mybatisdemo.mapper;
import com.shenxm.mybatisdemo.po.User;
import java.util.List;
/**
* @Author: shen
* @CreateTime: 2022-01-05 21:48
* @Description: UserMapper
* @Version 1.0
*/
public interface UserMapper {
@Select("SELECT * FROM user")
List<User> selectAll();
}
四、Mybatis的全局配置文件解析
全局配置文件中,各个标签要按照如下顺序进行配置:
<configuration>
<!-- 配置顺序如下
properties
settings
typeAliases
typeHandlers
objectFactory
plugins
environments
environment
transactionManager
dataSource
mappers
-->
</configuration>
各个子标签说明如下 :
<properties>
一般将数据源的信息单独放在一个properties文件中,然后用这个标签引入,在下面environment标签中,就可以用${}
占位符快速获取数据源的信息 。
<properties resource="database.properties"/>
<settings>
用来开启或关闭mybatis的一些特性,比如可以用<setting name="lazyLoadingEnabled" value="true"/>
来开启延迟加载,可以用<settings name="cacheEnabled" value="true"/>
来开启二级缓存
配置项 | 作用 | 配置选项 | 默认值 |
---|---|---|---|
cacheEnabled | 该配置影响所有映射器中配置缓存的全局开关 | true|false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 | true|false | false |
aggressiveLazyLoading | 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载 | true|false | 版本3.4.1 (不包含) 之前默认值为 true,之后为 false |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要兼容驱动) | true|false | true |
useColumnLabel | 使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 | true|false | true |
useGeneratedKeys | 允许JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby) | true|false | false |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射。 PARTIAL 表示只会自动映射,没有定义嵌套结果集和映射结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套) | NONE、PARTIAL、FULL | PARTIAL |
autoMappingUnkno wnColumnBehavior | 指定自动映射当中未知列(或未知属性类型)时的行为。 默认是不处理,只有当日志级别达到 WARN 级别或者以下,才会显示相关日志,如果处理失败会抛出 SqlSessionException 异常 | NONE、WARNING、FAILING | NONE |
defaultExecutorType | 配置默认的执行器。SIMPLE 是普通的执行器;REUSE 会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新 | SIMPLE、REUSE、BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数 | 任何正整数 | Not Set (null) |
defaultFetchSize | 设置数据库驱动程序默认返回的条数限制,此参数可以重新设置 | 任何正整数 | Not Set (null) |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBounds)。如果允许,设置 false | true|false | false |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。如果允许,设置false | true|false | true |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射 | true|false | false |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速联复嵌套査询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlScssion 的不同调用将不会共享数据 | SESSION|STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER | NULL、VARCHAR、OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载 | — | equals、clone、hashCode、toString |
defaultScriptingLanguage | 指定动态 SQL 生成的默认语言 | — | org.apache.ibatis .script.ing.xmltags .XMLDynamicLanguageDriver |
callSettersOnNulls | 指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这对于 Map.kcySet() 依赖或 null 值初始化时是有用的。注意,基本类型(int、boolean 等)不能设置成 null | true|false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀 | 任何字符串 | Not set |
loglmpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动査找 | SLF4J|LOG4J|LOG4J2|JDK_LOGGING |COMMONS_LOGGING |ST DOUT_LOGGING|NO_LOGGING | Not set |
proxyFactory | 指定 MyBatis 创建具有延迟加栽能力的对象所用到的代理工具 | CGLIB|JAVASSIST | JAVASSIST (MyBatis 版本为 3.3 及以上的) |
vfsImpl | 指定 VFS 的实现类 | 提供 VFS 类的全限定名,如果存在多个,可以使用逗号分隔 | Not set |
useActualParamName | 允许用方法参数中声明的实际名称引用参数。要使用此功能,项目必须被编译为 Java 8 参数的选择。(从版本 3.4.1 开始可以使用) | true|false | true |
例如:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
<typeAliases>
在mapper.xml中需要使用parameterType和resultType属性来配置SQL语句的输入参数类型和输出参数类型,类必须要写上全限定名,比如一个SQL的返回值映射为Student类,则resultType属性要写com.shenxm.mybatisdemo.po.User
,这太长了,所以可以用别名来简化书写,比如
<typeAliases>
<typeAlias type="com.shenxm.mybatisdemo.po.User" alias="user"/>
</typeAliases>
之后就可以在resultType
上直接写user
,mybatis会根据别名配置自动找到对应的类。
另外,对于基本的Java类型 -> 8大基本类型以及包装类,以及String类型,mybatis提供了默认的别名,别名为其简单类名的小写,比如原本需要写java.lang.String
,其实可以简写为string
<typeHandlers>
用于处理Java类型和Jdbc类型之间的转换,mybatis有许多内置的TypeHandler,比如StringTypeHandler,会处理Java类型String和Jdbc类型CHAR和VARCHAR。
<objectFactory>
mybatis会根据resultType
或resultMap
的属性来将查询得到的结果封装成对应的Java类,它有一个默认的DefaultObjectFactory,用于创建对象实例。
<plugins>
可以用来配置mybatis的插件,比如在开发中经常需要对查询结果进行分页,就需要用到pageHelper分页插件,这些插件就是通过这个标签进行配置的。在mybatis底层,运用了责任链模式+动态代理去实现插件的功能
<!-- PageHelper 分页插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
<environments>
用来配置数据源 , 可以通过配置多个 environment 标签来连接多个数据库,需要注意的是必须指定其中一个为默认运行环境(通过default指定)。
environment 标签提供了两个子标签,即 transactionManager 和 dataSource。
transactionManager标签: MyBatis 支持两个事务管理器,即 JDBC 和 MANAGED。
dataSource标签: 用于配置数据库的连接属性,例如要连接的数据库的驱动程序名称、URL、用户名和密码等。
-
<mappers>
mappers 标签用于指定 MyBatis SQL 映射文件的路径。
<!-- 指定映射配置文件的位置 -->
<mappers>
<!-- 1.单独加载某个映射配置文件 -->
<!-- <mapper resource="com\shenxm\mybatisdemo\mapper\UserMapper.xml"/>-->
<!-- 2.加载某包所有的配置文件 -->
<package name="com.shenxm.mybatisdemo.mapper"/>
</mappers>
五、 Mybatis的mapper(映射器)
5.1映射器概念
映射器: 是 MyBatis 中最重要的文件,文件中包含一组 SQL 语句(例如查询、添加、删除、修改),例如UserMapper.xml和UserMapper接口就是一个映射器。
映射器由 Java 接口和 XML 文件(或注解)共同组成,它的作用如下:
- 定义参数类型
- 配置缓存
- 提供 SQL 语句和动态 SQL
- 定义查询结果和 POJO 的映射关系
映射器有以下两种实现方式:(快速使用章节有介绍)
- 通过 XML 文件方式实现,比如我们在 mybatis-config.xml 文件中描述的 XML 文件,用来生成 mapper。(推荐使用)
- 通过注解的方式实现,使用 Configuration 对象注册 Mapper 接口。
映射器可以定义以下标签:
元素名称 | 描述 | 备注 |
---|---|---|
mapper | 映射文件的根节点,只有 namescape 一个属性 | namescape 作用如下:用于区分不同的 mapper,全局唯一绑定DAO接口,即面向接口编程。当 namescape 绑定某一接口后,可以不用写该接口的实现类,MyBatis 会通过接口的完整限定名查找到对应的 mapper 配置来执行 SQL 语句。因此 namescape 的命名必须要跟接口同名。 |
select | 查询语句,最常用、最复杂的元素之一 | 可以自定义参数,返回结果集等 |
insert | 插入语句 | 执行后返回一个整数,代表插入的条数 |
update | 更新语句 | 执行后返回一个整数,代表更新的条数 |
delete | 删除语句 | 执行后返回一个整数,代表删除的条数 |
parameterMap | 定义参数映射关系 | 即将被删除的元素,不建议使用 |
sql | 允许定义一部分的 SQL,然后在各个地方引用它 | 例如,一张表列名,我们可以一次定义,在多个 SQL 语句中使用 |
resultMap | 用来描述数据库结果集与对象的对应关系,它是最复杂、最强大的元素 | 提供映射规则 |
cache | 配置给定命名空间的缓存 | - |
cache-ref | 其它命名空间缓存配置的引用 | - |
5.2Mybatis执行sql的两种方式
1.通过 SqlSession 发送 SQL。
2.通过 SqlSession 获取 Mapper 接口,通过 Mapper 接口发送 SQL。
//第一种:通过 SqlSession 发送 SQL。
List<User> users = (User)sqlSession.selectList("com.shenxm.mybatisdemo.mapper.UserMapper.selectAll");
//第二种:通过 SqlSession 获取 Mapper 接口,通过 Mapper 接口发送 SQL。
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
users = mapper.selectAll();
5.3select标签
用于执行查询操作。
执行 SQL 语句时可以定义参数 :基本参数类型或者复杂参数类型,例如JavaBean,Map等。
Mybatis提供了强大的 映射规则,执行sql后,会将结果集自动映射到JavaBean中。 通常这种映射采用Java驼峰命名规则。
参数的传递使用#{参数名}
,相当于告诉 MyBatis 生成 PreparedStatement 参数。对于 JDBC,该参数会被标识为“?”。
传递参数的四种方式:
- 基本类型传参
- 使用Map传参
- 使用注解传参: @Param() 传递参数
- 使用JavaBean传参
代码实现:
UserMapper接口:
package com.shenxm.mybatisdemo.mapper;
import com.shenxm.mybatisdemo.po.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @Author: shen
* @CreateTime: 2022-01-05 21:48
* @Description: UserMapper
* @Version 1.0
*/
public interface UserMapper {
List<User> selectAll();
String getNameById(@Param("id") Long id);
List<User> selectByMap(Map<String, Object> param);
List<User> selectByentity(User user);
}
UserMapper.xml:
<?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">
<mapper namespace="com.shenxm.mybatisdemo.mapper.UserMapper">
<!-- resultMap
id 在命名空间中唯一的标识符
type 结果集映射的javabean 或者 泛型为该类型的集合
-->
<resultMap id="userMap" type="com.shenxm.mybatisdemo.po.User">
<!-- id主键映射
result 非主键映射
property javabean 中的 filed
column datatable 中的 filed -->
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="email" column="email"/>
</resultMap>
<!-- <select id="selectAll" resultType="com.shenxm.mybatisdemo.po.User">-->
<!-- SELECT * FROM user;-->
<!-- </select>-->
<select id="selectAll" resultMap="userMap">
SELECT * FROM user;
</select>
<select id="getNameById" resultType="string">
SELECT name FROM user where id = #{id};
</select>
<select id="selectByMap" parameterType="map" resultType="com.shenxm.mybatisdemo.po.User">
SELECT * FROM user where id = #{id};
</select>
<select id="selectByentity" parameterType="com.shenxm.mybatisdemo.po.User" resultType="com.shenxm.mybatisdemo.po.User">
SELECT * FROM user where id = #{id};
</select>
</mapper>
DemoTest:
@Test
public void testMapper2() {
// 核心配置文件classpath路径
String resource = "mybatis/mybatis-config.xml";
Reader config = null;
SqlSessionFactory sqlSessionFactory = null;
SqlSession sqlSession = null;
try {
// 1.加载配置文件
// 第一种: Resources.getResourceAsReader(resource);
config = Resources.getResourceAsReader(resource);
// 第二种:InputStream config = Resources.getResourceAsStream(resource);
// 2.构建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
// 3.打开SqlSession连接
sqlSession = sqlSessionFactory.openSession();
// 4.获取该接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 5.执行接口中的方法
System.out.println("=================查询所有数据=========================");
//查询所有数据
List<User> userList = mapper.selectAll();
userList.forEach(System.out::println);
System.out.println("=================基本数据类型传参==================");
//基本数据类型传参
String users = mapper.getNameById(1L);
System.out.println("基本数据类型传参:" + users);
System.out.println("=================map传参==================");
//map传参
HashMap<String, Object> map = new HashMap<>();
map.put("id", 1L);
List<User> userList1 = mapper.selectByMap(map);
userList1.forEach(System.out::println);
System.out.println("================JavaBean传参==================");
//JavaBean传参
User user = new User();
user.setId(1L);
List<User> userList2 = mapper.selectByentity(user);
userList2.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 6.释放SqlSession资源
sqlSession.close();
}
}
常用标签属性:
属性名称 | 描 述 | 备注 |
---|---|---|
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+id不唯一,那么 MyBatis 抛出异常 |
parameterType | 表示传入 SQL 语句传入参数类型的全限定名或别名。它是一个可选属性,MyBatis 能推断出具体传入语句的参数 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
resultType | SQL 语句执行后返回的类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回时可以使用 resultType 或 resultMap 之一 | - |
resultMap | 它是映射集的引用,与 元素一起使用,返回时可以使用 resultType 或 resultMap 之一 | 是 MyBatis 最复杂的元素,可以配置映射规则、级联、typeHandler 等 |
flushCache | 用于设置在调用 SQL 语句后是否要求 MyBatis 清空之前查询的本地缓存和二级缓存 | 默认值为 false,如果设置为 true,则任何时候只要 SQL 语句被调用都将清空本地缓存和二级缓存 |
useCache | 启动二级缓存的开关,默认值为 true,表示将査询结果存入二级缓存中 | - |
timeout | 用于设置超时参数,单位是秒(s),超时将抛出异常 | - |
fetchSize | 获取记录的总条数设定 | 默认值是数据库厂商提供的 JDBC 驱动所设置的条数 |
statementType | 告诉 MyBatis 使用哪个 JDBC 的 Statement 工作,取值为 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement) | - |
resultSetType | 这是针对 JDBC 的 ResultSet 接口而言,其值可设置为 FORWARD_ONLY(只允许向前访问)、SCROLL_SENSITIVE(双向滚动,但不及时更新)、SCROLLJNSENSITIVE(双向滚动,及时更新) | - |
5.4insert标签
用来定义插入语句,执行插入操作。 当 MyBatis 执行完一条插入语句后,就会返回其影响数据库的行数。
传递参数的四种方式:
- 基本类型传参
- 使用Map传参
- 使用注解传参: @Param() 传递参数
- 使用JavaBean传参
主键回填: 数据库自动生成的主键回填到请求对象,供业务使用, 此时,我们就可以通过在 insert 标签中添加 keyProperty 和 useGeneratedKeys 属性,来实现该功能。
UserMapper接口:
package com.shenxm.mybatisdemo.mapper;
import com.shenxm.mybatisdemo.po.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @Author: shen
* @CreateTime: 2022-01-05 21:48
* @Description: UserMapper
* @Version 1.0
*/
public interface UserMapper {
List<User> selectAll();
String getNameById(@Param("id") Long id);
List<User> selectByMap(Map<String, Object> param);
List<User> selectByentity(User user);
int addUser(@Param("user") User user);
}
UserMapper.xml:
<?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">
<mapper namespace="com.shenxm.mybatisdemo.mapper.UserMapper">
<!-- resultMap
id 在命名空间中唯一的标识符
type 结果集映射的javabean 或者 泛型为该类型的集合
-->
<resultMap id="userMap" type="com.shenxm.mybatisdemo.po.User">
<!-- id主键映射
result 非主键映射
property javabean 中的 filed
column datatable 中的 filed -->
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="email" column="email"/>
</resultMap>
<!-- <select id="selectAll" resultType="com.shenxm.mybatisdemo.po.User">-->
<!-- SELECT * FROM user;-->
<!-- </select>-->
<select id="selectAll" resultMap="userMap">
SELECT * FROM user;
</select>
<select id="getNameById" resultType="string">
SELECT name FROM user where id = #{id};
</select>
<select id="selectByMap" parameterType="map" resultType="com.shenxm.mybatisdemo.po.User">
SELECT * FROM user where id = #{id};
</select>
<select id="selectByentity" parameterType="com.shenxm.mybatisdemo.po.User" resultType="com.shenxm.mybatisdemo.po.User">
SELECT * FROM user where id = #{id};
</select>
<insert id="addUser" keyProperty="id" useGeneratedKeys="true">
INSERT INTO user (name,age,email)
VALUES(#{user.name},#{user.age},#{user.email})
</insert>
</mapper>
DemoTest:
@Test
public void testMapper3() {
// 核心配置文件classpath路径
String resource = "mybatis/mybatis-config.xml";
Reader config = null;
SqlSessionFactory sqlSessionFactory = null;
SqlSession sqlSession = null;
try {
// 1.加载配置文件
// 第一种: Resources.getResourceAsReader(resource);
config = Resources.getResourceAsReader(resource);
// 第二种:InputStream config = Resources.getResourceAsStream(resource);
// 2.构建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
// 3.打开SqlSession连接
sqlSession = sqlSessionFactory.openSession();
// 4.获取该接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 5.执行接口中的方法
System.out.println("================插入==================");
User user = new User();
user.setAge(22);
user.setName("xiaowu");
user.setEmail("xiaowu@baomidou.com");
int i = mapper.addUser(user);
sqlSession.commit();//提交
System.out.println("成功插入了:" + i + "条");
System.out.println("主键回填对象:" + user.getId());
} catch (IOException e) {
e.printStackTrace();
} finally {
// 6.释放SqlSession资源
sqlSession.close();
}
}
常用属性:
属性名称 | 描述 | 备注 |
---|---|---|
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+ id 不唯一,那么 MyBatis 抛出异常 |
parameterType | 传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
keyProperty | 该属性的作用是将插入操作的返回值赋给 PO 类的某个属性,通常为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。 | - |
useGeneratedKe | 该属性用来设置,是否使用 JDBC 提供的 getGenereatedKeys() 方法,获取数据库内部产生的主键并赋值到 keyProperty 属性设置的请求对象的属性中,例如 MySQL、SQL Server 等自动递增的字段,其默认值为 false。 | 该属性值设置为 true 后,会将数据库生成的主键回填到请求对象中,以供其他业务使用。 |
flushCache | 该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。 | - |
timeout | 该属性用于设置执行该操作的最大时限,如果超时,就抛异常。 | - |
databaseId | 取值范围 oracle、mysql 等,表示数据库厂家;元素内部可通过 来为特定数据库指定不同的 sql 语句。 | MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 |
keyColumn | 该属性用于设置第几列是主键,当主键列不是表中的第 1 列时,就需要设置该属性。如果是联合主键,可以将多个值用逗号隔开。 | - |
5.5update标签
用于定义更新语句,执行更新操作。当 MyBatis 执行完一条更新语句后,会返回一个整数,表示受影响的数据库记录的行数。
传递参数的四种方式:
- 基本类型传参
- 使用Map传参
- 使用注解传参: @Param() 传递参数
- 使用JavaBean传参
UserMapper接口:
int updateByentity(@Param("user") User user);
UserMapper.xml:
<update id="updateByentity">
UPDATE user SET age=#{user.age} WHERE id = #{user.id}
</update>
DemoTest:
@Test
public void testMapper4() {
// 核心配置文件classpath路径
String resource = "mybatis/mybatis-config.xml";
Reader config = null;
SqlSessionFactory sqlSessionFactory = null;
SqlSession sqlSession = null;
try {
// 1.加载配置文件
// 第一种: Resources.getResourceAsReader(resource);
config = Resources.getResourceAsReader(resource);
// 第二种:InputStream config = Resources.getResourceAsStream(resource);
// 2.构建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
// 3.打开SqlSession连接
sqlSession = sqlSessionFactory.openSession();
// 4.获取该接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 5.执行接口中的方法
System.out.println("================更新==================");
User user = new User();
user.setAge(18);
user.setId(8L);
int i = mapper.updateByentity(user);
sqlSession.commit();//提交
System.out.println("共更新了 " + i + " 条记录");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 6.释放SqlSession资源
sqlSession.close();
}
}
常用属性:
属性名称 | 描述 | 备注 |
---|---|---|
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+ id 不唯一,那么 MyBatis 抛出异常 |
parameterType | 传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
flushCache | 该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。 | - |
timeout | 该属性用于设置 SQL 执行的超时时间,如果超时,就抛异常。 | - |
statementType | 执行 SQL 时使用的 statement 类型, 默认为 PREPARED,可选值:STATEMENT,PREPARED 和 CALLABLE。 | - |
注意:update 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。
5.6delete标签
定义 delete 语句,执行删除操作。当 MyBatis 执行完一条更新语句后,会返回一个整数,表示受影响的数据库记录的行数。
传递参数的四种方式:
- 基本类型传参
- 使用Map传参
- 使用注解传参: @Param() 传递参数
- 使用JavaBean传参
UserMapper接口:
int deleteById(@Param("id") Long id);
UserMapper.xml:
<delete id="deleteById">
DELETE FROM `user` WHERE id = #{id}
</delete>
DemoTest:
@Test
public void testMapper5() {
// 核心配置文件classpath路径
String resource = "mybatis/mybatis-config.xml";
Reader config = null;
SqlSessionFactory sqlSessionFactory = null;
SqlSession sqlSession = null;
try {
// 1.加载配置文件
// 第一种: Resources.getResourceAsReader(resource);
config = Resources.getResourceAsReader(resource);
// 第二种:InputStream config = Resources.getResourceAsStream(resource);
// 2.构建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
// 3.打开SqlSession连接
sqlSession = sqlSessionFactory.openSession();
// 4.获取该接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 5.执行接口中的方法
System.out.println("================删除==================");
int i = mapper.deleteById(8L);
sqlSession.commit();//提交
System.out.println("删除了 " + i + " 条记录");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 6.释放SqlSession资源
sqlSession.close();
}
}
常用属性:
属性名称 | 描述 | 备注 |
---|---|---|
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+ id 不唯一,那么 MyBatis 抛出异常 |
parameterType | 传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
flushCache | 该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。 | - |
timeout | 该属性用于设置 SQL 执行的超时时间,如果超时,就抛异常。 | - |
statementType | 执行 SQL 时使用的 statement 类型, 默认为 PREPARED,可选值:STATEMENT,PREPARED 和 CALLABLE。 | - |
注意:delete 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。
5.7resultMap标签
主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。
注意:MyBatis 版本只支持 resultMap 查询,不支持更新或者保存,更不必说级联的更新、删除和修改。
<resultMap id="" type="">
<constructor><!-- 类再实例化时用来注入结果到构造方法 -->
<idArg/><!-- ID参数,结果为ID -->
<arg/><!-- 注入到构造方法的一个普通结果 -->
</constructor>
<id/><!-- 用于表示哪个列是主键 -->
<result/><!-- 注入到字段或JavaBean属性的普通结果 -->
<association property=""/><!-- 用于一对一关联 -->
<collection property=""/><!-- 用于一对多、多对多关联 -->
<discriminator javaType=""><!-- 使用结果值来决定使用哪个结果映射 -->
<case value=""/><!-- 基于某些值的结果映射 -->
</discriminator>
</resultMap>
其中:
- 元素的 type 属性表示需要的 POJO,id 属性是 resultMap 的唯一标识。
- 子元素
id 和 result 元素都有以下属性。
元素 说明 property 映射到列结果的字段或属性。如果 POJO 的属性和 SQL 列名(column元素)是相同的,那么 MyBatis 就会映射到 POJO 上 column 对应 SQL 列 javaType 配置 Java 类型。可以是特定的类完全限定名或 MyBatis 上下文的别名 jdbcType 配置数据库类型。这是 JDBC 类型,MyBatis 已经为我们做了限定,基本支持所有常用数据库类型 typeHandler 类型处理器。允许你用特定的处理器来覆盖 MyBatis 默认的处理器。需要指定 jdbcType 和 javaType 相互转化的规则 一条 SQL 查询语句执行后会返回结果集,结果集有两种存储方式,即使用 Map 存储和使用 POJO 存储。