目录
2.3-配置文件详解 (mybatis-config.xml)
2.4-Mapper 文件详解 (xxxMapper.xml)
3.1-Session 和 SqlSessionFactory
4.1-if, choose, when, otherwise
9.2-使用 Spring 管理 MyBatis 的 SqlSessionFactory 和 Mapper
一, MyBatis 概述
1.1-介绍 MyBatis 的历史和发展
- 起源:MyBatis 的前身是 iBatis,最初由 Clinton Begin 在2001年创建。
- 发展:2008年左右,iBatis 被捐赠给了 Apache 软件基金会,并更名为 MyBatis。
- 版本演变:MyBatis 3.x 版本引入了大量的改进和新特性,成为目前最广泛使用的版本。
- 社区与生态:MyBatis 拥有活跃的社区和丰富的插件生态系统,包括 MyBatis Generator、MyBatis Plus 等工具。
1.2-MyBatis 的特点和优势
- 轻量级:MyBatis 相对于其他 ORM 框架来说更为轻量,易于上手且灵活性高。
- SQL 语句编写:允许直接编写 SQL 语句,提供更高的定制能力和优化空间。
- 结果映射:提供强大的结果映射机制,能够灵活地处理复杂的数据结构。
- 动态 SQL:支持动态 SQL 语法,可以根据条件生成不同的 SQL 语句。
- 插件机制:支持插件扩展,可以方便地添加日志记录、分页等功能。
- 与 Spring 的良好集成:能够很好地与 Spring 框架集成,提供依赖注入和事务管理等功能。
1.3-MyBatis 与 JDBC 的对比
封装性:MyBatis 对 JDBC 进行了封装,避免了直接与 JDBC API 交互的繁琐步骤。
资源管理:MyBatis 自动管理 SQL 会话,减少了资源泄漏的风险。
错误处理:MyBatis 提供更友好的异常处理机制,使得错误定位更加容易。
SQL 语句编写:MyBatis 支持直接编写 SQL 语句,而 JDBC 需要程序员自行构建 SQL 语句。
结果映射:MyBatis 提供了自动化的结果映射机制,使得数据转换更为简单。
1.4-MyBatis 与其他 ORM 框架的对比
Hibernate:
- 全自动 vs 半自动:Hibernate 是全自动的 ORM 框架,而 MyBatis 是半自动的。
- 易用性:Hibernate 提供了更多的自动化特性,如懒加载、缓存等。
- 性能:MyBatis 因为更接近 SQL 的控制,所以可能在某些场景下有更好的性能。
JPA (Java Persistence API):
- 标准 vs 实现:JPA 是一种规范,而 Hibernate 是 JPA 的实现之一;MyBatis 则是一种具体的框架。
- API 使用:JPA 使用面向对象的方式,而 MyBatis 更偏向于 SQL 语句的编写。
Spring Data JPA:
- 集成度:Spring Data JPA 与 Spring 集成度更高,提供了更多的便捷方法。
- 灵活性:MyBatis 在编写 SQL 方面提供了更大的灵活性。
二, 快速入门
2.1-环境搭建
1.安装 JDK
- 确保已安装 JDK 1.8 或以上版本。
- 设置环境变量 JAVA_HOME。
2.安装 Maven (可选)
- 如果使用 Maven 管理项目依赖,则需安装 Maven。
- 设置环境变量 M2_HOME 和 MAVEN_HOME。
3.创建 Maven 项目
- 使用 IntelliJ IDEA 或 Eclipse 创建一个新的 Maven 项目。
- 添加 MyBatis 和 MySQL 的依赖到 pom.xml 文件中。
<dependencies> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.11</version> </dependency> <!-- MySQL Connector/J --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.36</version> </dependency> </dependencies>
4.配置 MySQL 数据库
- 创建数据库和表。
- 配置数据库连接信息。
5.创建实体类
- 根据数据库表结构创建对应的 Java 实体类。
6.创建 MyBatis 配置文件
- 创建 mybatis-config.xml 文件。
7.编写 Mapper 文件
- 创建 UserMapper.xml 文件。
2.2-第一个 MyBatis 应用程序
1.创建实体类
- 创建 User.java 实体类。
@Data @NoArgsConstructor @AllArgsConstructor public class User { private int id; private String name; private String email; }
2.创建 Mapper 接口
- 创建 UserMapper.java 接口。
import org.apache.ibatis.annotations.Select; public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User getUserById(int id); }
3.创建 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.example.mapper.UserMapper"> <select id="getUserById" resultType="com.example.entity.User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>
4.配置文件详解 (mybatis-config.xml)
- 创建 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.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration>
5.编写测试类
- 创建 UserTest.java 文件来测试 MyBatis 的基本功能。
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 java.io.IOException; import java.io.InputStream; public class UserTest { public static void main(String[] args) throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession sqlSession = sqlSessionFactory.openSession()) { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(1); System.out.println(user); } } }
2.3-配置文件详解 (mybatis-config.xml)
mybatis-config.xml 是 MyBatis 的核心配置文件,用于配置 MyBatis 的运行环境以及其他各种属性。下面是 mybatis-config.xml 的详细说明:
1. 根元素 <configuration>
属性:无
说明:根元素,包含了所有子元素。
2.<properties>
属性:
- resource:指定外部 properties 文件的位置。
- url:指定外部 properties 文件的 URL。
- defaultPrefix:指定默认前缀,用于在 properties 文件中区分默认值。
说明:
- 用于读取外部的 properties 文件,可以用来配置数据库连接信息等。
3. <settings>
属性:无
说明:包含一系列的设置项,用于改变 MyBatis 的行为。
4. <typeAliases>
属性:无
说明:用于配置别名,可以简化 Java 类型的引用。
5. <typeHandlers>
属性:无
说明:用于配置自定义的类型处理器,可以处理特定类型的转换。
6. <objectFactory>
属性:无
说明:用于配置 MyBatis 创建新实例的方式,默认使用 Java 默认构造器。
7. <plugins>
属性:无
说明:用于配置 MyBatis 的插件,可以增强或修改 MyBatis 的行为。
8. <environments>
属性:无
说明:用于配置不同的环境,如开发、测试、生产等。<environment>:表示一个具体的环境配置。
属性:
id:环境标识符。
子元素:
<transactionManager>:配置事务管理器。
属性:
type:事务管理器类型,如 JDBC、MANAGED。
<dataSource>:配置数据源。
属性:
type:数据源类型,如 UNPOOLED、POOLED、JNDI。
子元素:
<property>:配置数据源的属性,如 url、username、password。
9. <databaseIdProvider>
属性:无
说明:用于配置数据库 ID 提供者,可以用于区分不同的数据库方言。
10. <mappers>
属性:无
说明:用于配置 Mapper 接口或 Mapper XML 文件的位置。
<mapper>:配置单个 Mapper 文件或接口。
属性:
resource:指定 Mapper 文件的资源路径。
url:指定 Mapper 文件的 URL。
class:指定 Mapper 接口的全限定类名。
<package>:批量注册指定包下的所有 Mapper 接口。
属性:
name:指定包名。
<?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>
<properties resource="db.properties"/>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<typeAlias alias="User" type="com.example.entity.User"/>
</typeAliases>
<typeHandlers>
<typeHandler handler="com.example.handler.MyTypeHandler"/>
</typeHandlers>
<objectFactory>
<property name="defaultScope" value="prototype"/>
</objectFactory>
<plugins>
<plugin interceptor="com.example.interceptor.MyInterceptor">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
<mapper class="com.example.mapper.UserMapper"/>
<package name="com.example.mapper"/>
</mappers>
</configuration>
2.4-Mapper 文件详解 (xxxMapper.xml)
xxxMapper.xml 是 MyBatis 的映射文件,用于定义 SQL 语句和结果映射规则。下面是 xxxMapper.xml 的详细说明:
1. 根元素 <mapper>
属性:namespace:指定 Mapper 接口的全限定类名或唯一标识符。
说明:根元素,包含了所有的映射语句。
2. <insert>
属性:
- id:映射语句的唯一标识符。
- parameterType:传入参数的类型。
- useGeneratedKeys:是否使用主键自动生成。
- keyProperty:指定自动生成的主键值放入哪个字段。
- keyColumn:指定自动生成的主键值的列名。
说明:定义插入语句。
3. <update>
属性:
- id:映射语句的唯一标识符。
- parameterType:传入参数的类型。
说明:定义更新语句。
4. <delete>
属性:
- id:映射语句的唯一标识符。
- parameterType:传入参数的类型。
说明:定义删除语句。
5. <select>
属性:
- id:映射语句的唯一标识符。
- parameterType:传入参数的类型。
- resultType:返回结果的类型。
- resultSetType:结果集类型,如 FORWARD_ONLY、SCROLL_INSENSITIVE、SCROLL_SENSITIVE。
说明:定义查询语句。
6. <resultMap>
属性:
- id:映射语句的唯一标识符。
- type:返回结果的类型。
说明:定义结果映射规则,可以用于复杂的映射逻辑。
7. <sql>
属性:id:SQL 片段的唯一标识符。
说明:定义可重用的 SQL 片段。
8. <include>
属性:refid:引用 <sql> 元素的 ID。
说明:引用 <sql> 元素定义的 SQL 片段。
9. 动态 SQL<