Java应用Ⅺ在 Java 中使用MyBatis框架进行关系型数据库操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java应用Ⅺ在 Java 中使用MyBatis框架进行关系型数据库操作相关的知识,希望对你有一定的参考价值。

如果您觉得本博客的内容对您有所帮助或启发,请关注我的博客,以便第一时间获取最新技术文章和教程。同时,也欢迎您在评论区留言,分享想法和建议。谢谢支持!

相关阅读:

​Java应用【六】Java 反射:动态类加载和调用教程​

​Java应用【七】使用Java实现数据结构和算法:排序、查找、图​

​Java应用【八】使用网络编程进行 socket 通信​

​Java应用【九】在 Java 中使用Log4j/Logback进行日志记录和调试​

​Java应用【十】使用Mockito进行模拟和测试桩​

I.MyBatis 简介

MyBatis 是一款开源的 ORM(Object-Relational Mapping,对象关系映射)框架,它可以帮助 Java 开发人员快速地进行数据库操作。MyBatis 的主要特点是将 Java 对象映射到数据库表中,可以通过 XML 或者注解的方式进行 SQL 语句的编写。MyBatis 的核心思想是将 SQL 语句与 Java 代码解耦,使得开发人员可以更加专注于业务逻辑的实现。

MyBatis 的概念

  1. 映射文件(Mapper XML):MyBatis 的核心配置文件,其中包含了 SQL 语句的编写和 Java 对象的映射规则。
  2. SqlSessionFactory:MyBatis 的会话工厂,用于创建 SqlSession 对象,每个 SqlSessionFactory 对象都对应一个数据库。
  3. SqlSession:MyBatis 的会话对象,可以完成对数据库的增删改查操作。
  4. 映射接口(Mapper Interface):定义了操作数据库的方法,通常与 Mapper XML 文件中的 SQL 语句相对应。

MyBatis 的优点

  1. 灵活性:MyBatis 可以通过 XML 或者注解的方式进行 SQL 语句的编写,可以灵活地适应各种开发场景。
  2. 易于学习:MyBatis 的学习曲线较平缓,可以快速掌握基本用法。
  3. 高性能:MyBatis 采用了预编译的 SQL 语句和二级缓存机制,可以提高数据库访问的效率。
  4. 易于集成:MyBatis 可以与各种主流的 Web 框架进行集成,如 Spring、Spring Boot、Struts2 等。
  5. 易于调试:MyBatis 提供了完善的日志记录机制,可以方便地进行错误排查和性能优化。

II. MyBatis 的配置

MyBatis 的配置主要包括数据库连接配置和 MyBatis 的核心配置文件。

数据库连接配置

在 MyBatis 中,需要配置数据库连接信息,包括数据库的驱动名称、连接地址、用户名、密码等信息。可以在 MyBatis 的配置文件中通过 properties 元素来配置这些信息,例如:

<properties>
<property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="123456"/>
</properties>

其中,name 属性表示属性名称,value 属性表示属性值。

MyBatis 的核心配置文件

MyBatis 的核心配置文件是指包含了 MyBatis 的基本配置信息和 SQL 映射文件(Mapper XML)路径的文件。MyBatis 的核心配置文件采用 XML 格式,通常命名为 mybatis-config.xml。

MyBatis 的核心配置文件中包含了以下内容:

  • properties:用于配置数据库连接信息等属性。
  • settings:用于配置 MyBatis 的全局设置,例如缓存开关、懒加载等。
  • typeAliases:用于配置 Java 对象与数据库表之间的映射关系。
  • environments:用于配置 MyBatis 的环境信息,例如数据源的配置。
  • mappers:用于配置 SQL 映射文件的路径和映射器接口。

以下是一个典型的 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">
<configuration>
<properties>
<property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="123456"/>
</properties>

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

<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>

其中,environments 元素用于配置 MyBatis 的环境信息,可以配置多个环境,每个环境都对应一个数据源。mappers 元素用于配置 SQL 映射文件的路径和映射器接口,可以通过 resource 或者 class 属性来指定映射文件的位置或者映射器接口的类路径。

III. MyBatis 的使用

MyBatis 的基本操作

MyBatis 的基本操作主要包括增删改查四种操作。可以通过 MyBatis 的 SQL 映射文件(Mapper XML)或者注解方式来实现这些操作。以下是一个 MyBatis 的基本操作示例:

// 使用 MyBatis 的 SQL 映射文件实现查询操作
public List<User> getUserList()
SqlSession sqlSession = MyBatisUtil.getSqlSession();
List<User> userList = sqlSession.selectList("com.example.mapper.UserMapper.getUserList");
sqlSession.close();
return userList;


// 使用 MyBatis 的注解方式实现查询操作
@Select("SELECT * FROM user")
public List<User> getUserList();

// 使用 MyBatis 的注解方式实现插入操作
@Insert("INSERT INTO user(id, name, age) VALUES(#id, #name, #age)")
public int addUser(User user);

// 使用 MyBatis 的注解方式实现更新操作
@Update("UPDATE user SET name=#name, age=#age WHERE id=#id")
public int updateUser(User user);

// 使用 MyBatis 的注解方式实现删除操作
@Delete("DELETE FROM user WHERE id=#id")
public int deleteUser(int id);

SQL 语句的编写

MyBatis 支持多种 SQL 语句编写方式,包括使用 MyBatis 的 SQL 映射文件、注解方式和 XML 配置方式等。SQL 语句可以使用参数占位符(#)来表示参数,也可以使用动态 SQL 来实现复杂的 SQL 语句编写。以下是一个使用 MyBatis 的 SQL 映射文件编写 SQL 语句的示例:

<!-- 查询所有用户 -->
<select id="getUserList" resultType="com.example.model.User">
SELECT * FROM user
</select>

<!-- 插入用户 -->
<insert id="addUser" parameterType="com.example.model.User">
INSERT INTO user(id, name, age) VALUES(#id, #name, #age)
</insert>

<!-- 更新用户 -->
<update id="updateUser" parameterType="com.example.model.User">
UPDATE user SET name=#name, age=#age WHERE id=#id
</update>

<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id=#id
</delete>

MyBatis 的注解方式

MyBatis 支持使用注解来实现 SQL 语句的编写和映射器接口的定义。使用注解方式可以减少编写 XML 配置文件的工作量,并且使代码更加简洁和易于维护。以下是一个使用 MyBatis 注解方式实现 SQL 语句编写的示例:

@Mapper
public interface UserMapper

// 查询所有用户
@Select("SELECT * FROM user")
List<User> getUserList();

// 插入用户
@Insert("INSERT INTO user(id, name, age) VALUES(#id, #name, #age)")
int addUser(User user);

@Update("UPDATE user SET name=#name, age=#age WHERE id=#id")
int updateUser(User user);

// 删除用户
@Delete("DELETE FROM user WHERE id=#id")
int deleteUser(int id);

总的来说,MyBatis 的使用相对来说比较简单,可以通过 SQL 映射文件、注解方式或者 XML 配置方式来实现 SQL 语句的编写和执行。在使用 MyBatis 进行开发时,可以根据具体的业务需求来选择最适合的方式进行开发。

IV. MyBatis 的高级应用

MyBatis 的动态 SQL

动态 SQL 是指根据条件动态生成 SQL 语句的技术。MyBatis 提供了强大的动态 SQL 功能,可以通过使用 if、choose、when、otherwise、foreach 等元素来实现动态 SQL 语句的编写。

if 元素可以根据条件动态生成 SQL 片段,语法如下:

<select id="getUserList" resultType="User">
SELECT * FROM user WHERE
<if test="name != null">
name = #name
</if>
<if test="age != null">
AND age = #age
</if>
</select>

在上面的示例中,如果传入的参数 name 不为空,则会生成 WHERE name = #name 的 SQL 片段,如果传入的参数 age 不为空,则会生成 AND age = #age 的 SQL 片段。

choose、when、otherwise 元素可以根据条件选择不同的 SQL 片段,语法如下:

<select id="getUserList" resultType="User">
SELECT * FROM user
<where>
<choose>
<when test="name != null">
name = #name
</when>
<when test="age != null">
age = #age
</when>
<otherwise>
status = 1
</otherwise>
</choose>
</where>
</select>

在上面的示例中,如果传入的参数 name 不为空,则会生成 name = #name 的 SQL 片段,如果传入的参数 age 不为空,则会生成 age = #age 的 SQL 片段,如果都为空,则会生成 status = 1 的 SQL 片段。

foreach 元素可以遍历集合、数组等类型的参数,并将每个元素作为 SQL 片段的一部分,语法如下:

<update id="updateUsers" parameterType="Map">
update user
<set>
<foreach collection="users" item="user" separator=",">
name = #user.name, age = #user.age
</foreach>
</set>
where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#id
</foreach>
</update>

在上面的示例中,参数 Map 中包含了 users 和 ids 两个键值对,其中 users 是一个 User 对象的集合,ids 是一个 Integer 数组。foreach 元素遍历 users 集合,将每个 User 对象的 name 和 age 属性作为 SET 子句的一部分;然后遍历 ids 数组,将每个元素作为 IN 子句的一部分。最终生成的 SQL 语句类似于:

update user set name = Alice, age = 20 where id in (1, 2, 3)

MyBatis 的多表关联

在实际的开发中,经常需要使用多表关联来查询数据。MyBatis 提供了多种实现多表关联的方式,包括嵌套查询、联合查询和存储过程等。以下是一个使用 MyBatis 嵌套查询的示例:

<!-- 根据用户 id 查询用户信息和订单信息 -->
<select id="getUserAndOrdersById" resultMap="userAndOrdersResultMap">
SELECT * FROM user
WHERE id = #id
</select>

<resultMap id="userAndOrdersResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="orders" ofType="com.example.model.Order">
<id property="id" column="order_id"/>
<result property="name" column="order_name"/>
<result property="price" column="order_price"/>
</collection>
</resultMap>

MyBatis 的缓存机制

MyBatis 提供了多种缓存机制来提高查询效率,包括一级缓存和二级缓存。一级缓存是指 MyBatis 的内置缓存机制,它是基于 SqlSession 实例的缓存机制,只在同一个 SqlSession 实例中有效。二级缓存是指 MyBatis 的全局缓存机制,它是基于 Mapper 映射器的缓存机制,可在多个 SqlSession 实例之间共享。以下是一个启用 MyBatis 二级缓存的示例:

<!-- 启用 MyBatis 二级缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>

<!-- 在 Mapper XML 中指定缓存类型 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

MyBatis 的批处理:

MyBatis 提供了批处理功能,可以在一次数据库连接中执行多个 SQL 语句,从而提高数据库的操作效率。以下是一个使用 MyBatis 批处理的示例:

// 批量插入用户
public int insertUsers(List<User> userList)
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH))
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int count = 0;
for (User user : userList)
userMapper.insertUser(user);
count++;
if (count % 1000 == 0)
sqlSession.flushStatements();


sqlSession.flushStatements();
return count;

MyBatis 的插件机制

MyBatis 的插件机制可以通过自定义插件来扩展 MyBatis 的功能,比如实现 SQL 语句拦截、参数处理、结果处理等。以下是一个使用 MyBatis 插件机制的示例:

// 自定义 MyBatis 插件
@Intercepts(
@Signature(type = Executor.class, method = "query", args = MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class)
)
public class CustomPlugin implements Interceptor
@Override
public Object intercept(Invocation invocation) throws Throwable
// 实现拦截逻辑
return invocation.proceed();



// 注册自定义 MyBatis 插件
@MapperScan("com.example.mapper")
@Configuration
public class MyBatisConfig
@Bean
public CustomPlugin customPlugin()
return new CustomPlugin();


V. MyBatis 与 SpringBoot 的整合

SpringBoot 整合 MyBatis 的基本配置

在 Spring Boot 中使用 MyBatis,需要添加以下依赖:

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>$mybatis.version</version>
</dependency>

其中 $mybatis.version 是 MyBatis 的版本号。

在 application.properties 文件中配置 MyBatis 的基本信息:

# 数据库驱动类
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
# 数据库连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
# 数据库用户名
spring.datasource.username=root
# 数据库密码
spring.datasource.password=123456

# MyBatis 的配置文件路径
mybatis.config-location=classpath:mybatis-config.xml
# MyBatis 的 Mapper 文件路径
mybatis.mapper-locations=classpath:mapper/*.xml

上述配置文件中,配置了数据库的连接信息,以及 MyBatis 的配置文件和 Mapper 文件的路径。

SpringBoot 整合 MyBatis 的高级配置

在 SpringBoot 中,可以通过配置文件对 MyBatis 进行更高级的配置。

首先,在 application.properties 文件中添加 MyBatis 相关配置:

# 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root

# MyBatis 配置
mybatis.config-location=classpath:mybatis-config.xml
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity

其中,mybatis.config-location 指定了 MyBatis 的核心配置文件,mybatis.mapper-locations 指定了 Mapper 文件所在的目录,mybatis.type-aliases-package 指定了实体类所在的包。

然后,创建 mybatis-config.xml 配置文件,可以在其中配置插件、拦截器、类型别名等:

<configuration>
<!-- 类型别名配置 -->
<typeAliases>
<package name="com.example.demo.entity"/>
</typeAliases>

<!-- 插件配置 -->
<plugins>
<plugin interceptor="com.example.demo.interceptor.MyInterceptor">
<property name="property1" value="value1"/>
<property name="property2" value="value2"以上是关于Java应用Ⅺ在 Java 中使用MyBatis框架进行关系型数据库操作的主要内容,如果未能解决你的问题,请参考以下文章

java数据库访问—Mybatis

JAVA应用程序单独集成Mybatis使用Demo

在JavaEE中使用Mybatis框架

JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结

将大型Java应用程序从MyBatis迁移到ORM

Java单体应用 - 常用框架 - 08.MyBatis