Spring整合Mybatis和声明式事务

星辰漫步 2024-06-20 ⋅ 18 阅读

在开发Java项目时,常常会使用到Spring框架的特性来简化开发过程。Spring框架提供了许多功能强大的模块,其中整合Mybatis和提供声明式事务管理是非常常见的需求。

1. 搭建开发环境

首先,我们需要确保已经安装了以下工具和软件:

  • JDK
  • Maven
  • MySQL
  • IntelliJ IDEA(或其他Java开发IDE)

2. 创建Spring项目

使用IDEA创建一个新的Maven项目,并添加以下依赖:

<dependencies>
  <!-- Spring 相关依赖 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.5</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.5</version>
  </dependency>

  <!-- Mybatis 相关依赖 -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
  </dependency>
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
  </dependency>

  <!-- 数据库连接池依赖 -->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.7</version>
  </dependency>

  <!-- MySQL 驱动依赖 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.23</version>
  </dependency>
</dependencies>

3. 配置数据库连接和Mybatis

src/main/resources目录下创建一个名为applicationContext.xml的配置文件,并添加以下内容:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?useSSL=false&amp;serverTimezone=UTC&amp;characterEncoding=utf-8" />
  <property name="username" value="root" />
  <property name="password" value="password" />
</bean>
    
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="mapperLocations" value="classpath*:mapper/*.xml" />
</bean>

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

4. 创建Mapper接口和对应的XML文件

创建一个Mapper接口,定义数据库操作的方法。例如,创建一个名为UserMapper的接口:

public interface UserMapper {
  User getUserById(Long id);
  List<User> getAllUsers();
  void addUser(User user);
  void updateUser(User user);
  void deleteUser(Long id);
}

然后,在src/main/resources/mapper目录下创建一个UserMapper.xml文件,并添加SQL语句,如下所示:

<?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.model.User">
    <id property="id" column="id" />
    <result property="name" column="name" />
    <result property="email" column="email" />
  </resultMap>

  <select id="getUserById" resultMap="userResultMap">
    SELECT * FROM user WHERE id = #{id}
  </select>
    
  <select id="getAllUsers" resultMap="userResultMap">
    SELECT * FROM user
  </select>
    
  <insert id="addUser">
    INSERT INTO user (name, email) VALUES (#{name}, #{email})
  </insert>
    
  <update id="updateUser">
    UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}
  </update>
    
  <delete id="deleteUser">
    DELETE FROM user WHERE id = #{id}
  </delete>
</mapper>

5. 编写逻辑代码和声明式事务

创建一个名为UserService的Service类,用于处理业务逻辑并调用Mapper接口。例如:

@Service
public class UserService {
  @Autowired
  private UserMapper userMapper;

  public User getUserById(Long id) {
    return userMapper.getUserById(id);
  }

  public List<User> getAllUsers() {
    return userMapper.getAllUsers();
  }

  @Transactional
  public void addUser(User user) {
    userMapper.addUser(user);
  }

  @Transactional
  public void updateUser(User user) {
    userMapper.updateUser(user);
  }

  @Transactional
  public void deleteUser(Long id) {
    userMapper.deleteUser(id);
  }
}

在上面的代码中,我们使用了@Transactional注解来提供声明式事务管理。通过在方法上添加该注解,Spring会自动为该方法启用事务,并在方法执行之前开启事务,在方法执行之后提交或回滚事务。

6. 编写测试代码

src/test/java目录下创建一个测试类,用于测试上述代码。

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTests {
  @Autowired
  private UserService userService;

  @Test
  public void testGetUserById() {
    User user = userService.getUserById(1L);
    assertNotNull(user);
    assertEquals("John Doe", user.getName());
  }

  @Test
  public void testGetAllUsers() {
    List<User> userList = userService.getAllUsers();
    assertNotNull(userList);
    assertFalse(userList.isEmpty());
  }

  @Test
  public void testAddUser() {
    User user = new User();
    user.setName("Jane Smith");
    user.setEmail("jane@example.com");

    userService.addUser(user);

    assertNotNull(user.getId());
  }

  @Test
  public void testUpdateUser() {
    User user = userService.getUserById(2L);
    assertNotNull(user);

    user.setEmail("updated@example.com");

    userService.updateUser(user);

    User updatedUser = userService.getUserById(2L);
    assertEquals("updated@example.com", updatedUser.getEmail());
  }

  @Test
  public void testDeleteUser() {
    Long id = 3L;

    User user = userService.getUserById(id);
    assertNotNull(user);

    userService.deleteUser(id);

    User deletedUser = userService.getUserById(id);
    assertNull(deletedUser);
  }
}

7. 运行测试

运行测试代码,并确保所有测试用例通过。

结语

通过上述步骤,我们成功地整合了Spring、Mybatis和声明式事务。通过使用Spring的依赖注入和声明式事务管理,我们可以更加方便地开发和管理数据库相关的操作,提高开发效率。同时,Mybatis提供了强大的SQL映射功能,让我们可以轻松地与数据库进行交互。希望本篇文章能对你在Spring整合Mybatis和声明式事务方面有所帮助。


全部评论: 0

    我有话说: