如果您觉得本博客的内容对您有所帮助或启发,请关注我的博客,以便第一时间获取最新技术文章和教程。同时,也欢迎您在评论区留言,分享想法和建议。谢谢支持!
MyBatis 是一款开源的 ORM(Object-Relational Mapping,对象关系映射)框架,它可以帮助 Java 开发人员快速地进行数据库操作。MyBatis 的主要特点是将 Java 对象映射到数据库表中,可以通过 XML 或者注解的方式进行 SQL 语句的编写。MyBatis 的核心思想是将 SQL 语句与 Java 代码解耦,使得开发人员可以更加专注于业务逻辑的实现。
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 的基本配置信息和 SQL 映射文件(Mapper XML)路径的文件。MyBatis 的核心配置文件采用 XML 格式,通常命名为 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">
- <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 属性来指定映射文件的位置或者映射器接口的类路径。
MyBatis 的基本操作主要包括增删改查四种操作。可以通过 MyBatis 的 SQL 映射文件(Mapper XML)或者注解方式来实现这些操作。以下是一个 MyBatis 的基本操作示例:
- // 使用 MyBatis 的 SQL 映射文件实现查询操作
- public List
getUserList() { - SqlSession sqlSession = MyBatisUtil.getSqlSession();
- List
userList = sqlSession.selectList("com.example.mapper.UserMapper.getUserList"); - sqlSession.close();
- return userList;
- }
-
- // 使用 MyBatis 的注解方式实现查询操作
- @Select("SELECT * FROM user")
- public List
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);
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 支持使用注解来实现 SQL 语句的编写和映射器接口的定义。使用注解方式可以减少编写 XML 配置文件的工作量,并且使代码更加简洁和易于维护。以下是一个使用 MyBatis 注解方式实现 SQL 语句编写的示例:
- @Mapper
- public interface UserMapper {
-
- // 查询所有用户
- @Select("SELECT * FROM user")
- List
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 进行开发时,可以根据具体的业务需求来选择最适合的方式进行开发。
动态 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 嵌套查询的示例:
- <!-- 根据用户 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 的内置缓存机制,它是基于 SqlSession 实例的缓存机制,只在同一个 SqlSession 实例中有效。二级缓存是指 MyBatis 的全局缓存机制,它是基于 Mapper 映射器的缓存机制,可在多个 SqlSession 实例之间共享。以下是一个启用 MyBatis 二级缓存的示例:
- <settings>
- <setting name="cacheEnabled" value="true"/>
- settings>
-
- <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
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 的功能,比如实现 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();
- }
- }
在 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 进行更高级的配置。
首先,在 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"/>
- plugin>
- plugins>
-
-
- <objectFactory type="org.mybatis.spring.factory.SpringObjectFactory"/>
-
-
- configuration>
在上面的例子中,配置了一个自定义的插件 MyInterceptor,并设置了两个属性。
最后,可以在 MyInterceptor 中实现自定义的拦截逻辑:
- public class MyInterceptor implements Interceptor {
- private String property1;
- private String property2;
-
- @Override
- public Object intercept(Invocation invocation) throws Throwable {
- // 拦截逻辑
- }
-
- @Override
- public Object plugin(Object target) {
- return Plugin.wrap(target, this);
- }
-
- @Override
- public void setProperties(Properties properties) {
- // 属性设置
- }
- }
以上就是 SpringBoot 整合 MyBatis 的高级配置的示例。
为了更好地排查 MyBatis 的错误,可以开启 MyBatis 的日志记录功能。MyBatis 提供了四种日志记录的实现:
最常用的是 SLF4J 日志记录框架。可以在 pom.xml 文件中添加如下依赖:
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>2.0.0-alpha1</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-simple</artifactId>
- <version>2.0.0-alpha1</version>
- <scope>test</scope>
- </dependency>
然后,在 application.properties 文件中添加日志记录相关的配置:
- # 日志记录配置
- logging.level.org.apache.ibatis=debug
- logging.level.java.sql.Connection=debug
其中,logging.level.org.apache.ibatis=debug 表示将 MyBatis 的日志记录级别设置为 debug,logging.level.java.sql.Connection=debug 表示将 JDBC 连接的日志记录级别设置为 debug。
开启日志记录后,可以更清晰地查看 MyBatis 的执行过程和 SQL 语句的执行情况,更方便排查错误。
除了 SLF4J 日志记录框架之外,还可以使用 Log4j 和 Log4j2 日志记录框架来记录 MyBatis 的日志。在使用 Log4j 或 Log4j2 时,需要在 pom.xml 文件中添加相应的依赖:
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j-impl</artifactId>
- <version>2.14.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <version>2.14.1</version>
- </dependency>
Log4j2:
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j18-impl</artifactId>
- <version>2.14.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <version>2.14.1</version>
- </dependency>
然后,在 application.properties 文件中添加日志记录相关的配置:
Log4j:
- # 日志记录配置
- log4j.rootLogger=debug,stdout
- log4j.logger.org.apache.ibatis=debug
- log4j.logger.java.sql.Connection=debug
-
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.Target=System.out
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Log4j2:
- # 日志记录配置
- logger.MyBatis.name=org.apache.ibatis
- logger.MyBatis.level=debug
- logger.jdbc.name=java.sql.Connection
- logger.jdbc.level=debug
-
- appender.stdout.type=Console
- appender.stdout.name=STDOUT
- appender.stdout.layout.type=PatternLayout
- appender.stdout.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
-
- rootLogger.level=info
- rootLogger.appenderRef.stdout.ref=STDOUT
- rootLogger.loggerRef.MyBatis.ref=MyBatis
- rootLogger.loggerRef.jdbc.ref=jdbc
在这些配置中,都配置了日志记录的级别以及输出格式等相关信息。配置完成后,就可以使用 Log4j 或 Log4j2 来记录 MyBatis 的日志信息。
在 pom.xml 文件中添加 MyBatis 的依赖:
- <dependencies>
- <!-- MyBatis -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.5.7</version>
- </dependency>
-
- <!-- 数据库连接池 -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>1.2.6</version>
- </dependency>
-
- <!-- MySQL 驱动 -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.27</version>
- </dependency>
- </dependencies>
其中,mybatis 是 MyBatis 的核心依赖,druid 是数据库连接池,mysql-connector-java 是 MySQL 驱动。
首先是数据库连接的配置,在 application.properties 或 application.yml 文件中添加以下配置:
- spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
- spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
- spring.datasource.username=root
- spring.datasource.password=root
其中,driverClassName 是数据库驱动类名,url 是数据库连接地址,username 是数据库用户名,password 是数据库密码。这里的示例是连接本地的 MySQL 数据库,端口号是 3306,数据库名是 mydatabase。
接下来是 MyBatis 的核心配置文件,在 resources 目录下创建一个 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="${spring.datasource.driverClassName}" />
- <property name="url" value="${spring.datasource.url}" />
- <property name="username" value="${spring.datasource.username}" />
- <property name="password" value="${spring.datasource.password}" />
- </dataSource>
- </environment>
- </environments>
-
- <!-- 配置 MyBatis 插件 -->
- <plugins>
- <plugin interceptor="com.github.pagehelper.PageInterceptor">
- <property name="helperDialect" value="mysql"/>
- <property name="reasonable" value="true"/>
- <property name="supportMethodsArguments" value="true"/>
- <property name="params" value="count=countSql"/>
- </plugin>
- </plugins>
- </configuration>
其中,environments 标签用来配置数据源,这里使用了 Spring Boot 的自带数据源,同时也配置了 MyBatis 插件 pagehelper,用于实现分页查询。此外,还可以配置多个数据源,用于不同环境的切换。
创建一个实体类,例如命名为 User,该类中的字段应该和数据库表中的字段一一对应,示例如下:
- public class User {
- private int id;
- private String name;
- private int age;
- private String email;
- private String phone;
-
- // getter 和 setter 方法
- }
其中,id 字段对应表中的主键,需要有对应的 getter 和 setter 方法。name 和 age 分别对应表中的 name 和 age 字段。需要注意的是,这里的字段命名需要和数据库表中的字段命名保持一致。
创建一个 Mapper 接口,例如命名为 UserMapper,该接口中定义了对应的增删改查方法,示例如下:
- public interface UserMapper {
- User getUserById(int id);
-
- List
getAllUsers() ; -
- int addUser(User user);
-
- int updateUser(User user);
-
- int deleteUser(int id);
- }
其中,getUserById 方法根据传入的 id 参数获取一条用户记录,返回一个 User 对象。getAllUsers 方法返回所有用户记录的列表,返回值类型为 List。addUser 方法向表中插入一条用户记录,传入一个 User 对象作为参数,返回插入记录的数量。updateUser 方法更新一条用户记录,传入一个 User 对象作为参数,返回更新记录的数量。deleteUser 方法删除一条用户记录,传入 id 参数作为删除条件,返回删除记录的数量。
需要注意的是,这里的方法命名和参数命名需要和 Mapper 文件中的 SQL 语句保持一致,便于后续的映射关系配置。
下面是一个 UserMapper 接口对应的映射文件示例:
- <?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">
-
- <resultMap id="userResultMap" type="com.example.entity.User">
- <id column="id" property="id"/>
- <result column="name" property="name"/>
- <result column="age" property="age"/>
- <result column="email" property="email"/>
- <result column="phone" property="phone"/>
- </resultMap>
-
- <select id="getUserById" resultMap="userResultMap">
- SELECT * FROM users WHERE id = #{id}
- </select>
-
- <select id="getAllUsers" resultMap="userResultMap">
- SELECT * FROM users
- </select>
-
- <insert id="addUser" parameterType="com.example.entity.User">
- INSERT INTO users (name, age, email, phone)
- VALUES (#{name}, #{age}, #{email}, #{phone})
- </insert>
-
- <update id="updateUser" parameterType="com.example.entity.User">
- UPDATE users
- SET name = #{name}, age = #{age}, email = #{email}, phone = #{phone}
- WHERE id = #{id}
- </update>
-
- <delete id="deleteUser">
- DELETE FROM users WHERE id = #{id}
- </delete>
-
- </mapper>
在映射文件中,首先指定了命名空间 namespace,这里需要和 UserMapper 接口的全名保持一致。
接着定义了一个 resultMap 元素,用来将查询结果映射成 User 对象。resultMap 的 id 属性为 userResultMap,type 属性指定映射的目标类型为 com.example.entity.User。在 resultMap 中,通过 id 元素将表中的 id 字段映射到 User 对象的 id 属性,通过 result 元素将其他字段映射到对应的属性上。
随后,分别定义了 select、insert、update 和 delete 元素,分别对应 UserMapper 接口中的对应方法。这里通过 SQL 语句实现了增删改查的功能。其中 parameterType 属性指定了方法参数的类型,resultMap 属性指定了查询结果的映射关系。
下面是一个示例代码,用于演示如何在代码中调用 Mapper 接口中的方法,实现对数据库的操作:
- public class MyBatisDemo {
- public static void main(String[] args) {
- // 创建 MyBatis 的 SqlSessionFactory 对象
- SqlSessionFactory sqlSessionFactory = null;
- try {
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- // 创建 MyBatis 的 SqlSession 对象
- SqlSession sqlSession = sqlSessionFactory.openSession();
-
- try {
- // 获取 Mapper 接口的代理对象
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
-
- // 插入用户
- User user = new User();
- user.setId(1L);
- user.setName("张三");
- userMapper.insertUser(user);
-
- // 查询用户
- User queryUser = userMapper.getUserById(1L);
- System.out.println("查询用户结果:" + queryUser);
-
- // 更新用户
- queryUser.setName("李四");
- userMapper.updateUser(queryUser);
-
- // 删除用户
- userMapper.deleteUser(1L);
-
- // 提交事务
- sqlSession.commit();
- } catch (Exception e) {
- // 出现异常时回滚事务
- sqlSession.rollback();
- e.printStackTrace();
- } finally {
- // 关闭 SqlSession 对象
- sqlSession.close();
- }
- }
- }
在上述代码中,首先创建了 MyBatis 的 SqlSessionFactory 对象,然后通过 SqlSessionFactory 对象创建了 SqlSession 对象。接着获取了 Mapper 接口的代理对象,并通过代理对象调用了增删改查等方法。最后提交事务并关闭 SqlSession 对象。
在 MyBatis 中,需要配置一个事务管理器来进行事务控制。通常情况下,我们可以使用 Spring 框架提供的事务管理器来进行配置。在 SpringBoot 中,可以直接使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 等 starter 来快速集成数据库和事务管理器。
在 MyBatis 中,事务代理是用于拦截 Mapper 接口方法并开启事务的类。可以通过在 SqlSession 中设置 ExecutorType 来指定事务代理的类型。例如:
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
可以使用 MyBatis 提供的 @Transactional 注解来实现事务控制。在 Mapper 接口方法上加上 @Transactional 注解,即可将该方法划分为一个事务单元。在事务单元中,如果发生了异常,则整个事务将会被回滚。
- @Transactional
- int updatePerson(Person person);
编写事务处理代码,例如:
- @Transactional
- public void updatePerson(Person person) {
- try {
- // 更新操作1
- personMapper.updatePerson1(person);
- // 更新操作2
- personMapper.updatePerson2(person);
- // 更新操作3
- personMapper.updatePerson3(person);
- // 手动抛出异常,模拟事务回滚
- throw new RuntimeException("模拟事务回滚");
- } catch (Exception e) {
- log.error("updatePerson error", e);
- throw new RuntimeException("updatePerson error", e);
- }
- }
在上述代码中,通过 @Transactional 注解将 updatePerson 方法划分为一个事务单元。在事务单元中,执行了三个更新操作,同时手动抛出了一个异常。如果执行过程中发生了异常,整个事务将被回滚,即三个更新操作都会被撤销。
以上是使用 MyBatis 进行事务操作的基本步骤,需要注意的是,在进行事务操作时,一定要遵循 ACID 原则,保证事务的正确性和完整性。
MyBatis 是一个强大的 ORM 框架,可以帮助开发者快速地进行数据库操作。通过本文的介绍,读者可以掌握 MyBatis 的基本原理、使用方法以及高级应用技巧,同时还能了解到 MyBatis 与 SpringBoot 的整合以及常见错误排查方法。通过实例演示,读者还可以深入了解 MyBatis 的实际应用。
如果您觉得本博客的内容对您有所帮助或启发,请关注我的博客,以便第一时间获取最新技术文章和教程。同时,也欢迎您在评论区留言,分享想法和建议。谢谢支持!