Spring快速整合Mybatis

MyBatis是一个优秀的持久层框架,Spring则是广泛使用的Java应用框架。可以将两者整合可以充分发挥各自的优势。

1、Spring整合MyBatis的基本配置

添加依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.10</version>
</dependency>
<!-- Spring JDBC支持 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.10</version>
</dependency>
<!-- MyBatis核心 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
<!-- MyBatis-Spring整合包 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>

Spring配置文件:
创建Spring配置文件applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis_db?useSSL=false&serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
    </bean>
    <!-- 配置SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 指定MyBatis配置文件 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 指定mapper.xml文件位置 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>
    <!-- 配置Mapper扫描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.example.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
    <!-- 开启注解扫描 -->
    <context:component-scan base-package="com.example"/>
</beans>

MyBatis配置文件:
创建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>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <typeAliases>
        <package name="com.example.entity"/>
    </typeAliases>
</configuration>

2、基本的CRUD操作

创建实体类:

package com.example.entity;
public class User {
    private Long id;
    private String username;
    private String password;
    private String email;

    // 省略getter和setter方法
    // 省略toString方法
}

创建Mapper接口:

package com.example.mapper;
import com.example.entity.User;
import java.util.List;
public interface UserMapper {
    int insert(User user);
    int update(User user);
    int deleteById(Long id);
    User selectById(Long id);
    List<User> selectAll();
}

创建Mapper XML文件:
在resources/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">
    <insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user(username, password, email)
        VALUES(#{username}, #{password}, #{email})
    </insert>
    <update id="update" parameterType="User">
        UPDATE user
        SET username=#{username}, password=#{password}, email=#{email}
        WHERE id=#{id}
    </update>
    <delete id="deleteById" parameterType="long">
        DELETE FROM user WHERE id=#{id}
    </delete>
    <select id="selectById" parameterType="long" resultType="User">
        SELECT * FROM user WHERE id=#{id}
    </select>
    <select id="selectAll" resultType="User">
        SELECT * FROM user
    </select>
</mapper>

创建Service层:

package com.example.service;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public int addUser(User user) {
        return userMapper.insert(user);
    }

    public int modifyUser(User user) {
        return userMapper.update(user);
    }

    public int removeUser(Long id) {
        return userMapper.deleteById(id);
    }

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

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

测试类:

import com.example.entity.User;
import com.example.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = context.getBean(UserService.class);

        // 添加用户
        User user = new User();
        user.setUsername("testUser");
        user.setPassword("123456");
        user.setEmail("[email protected]");
        userService.addUser(user);
        System.out.println("添加用户成功,ID: " + user.getId());

        // 查询用户
        User dbUser = userService.getUserById(user.getId());
        System.out.println("查询用户: " + dbUser);

        // 更新用户
        dbUser.setEmail("[email protected]");
        userService.modifyUser(dbUser);
        System.out.println("更新用户成功");

        // 查询所有用户
        List<User> users = userService.getAllUsers();
        System.out.println("所有用户:");
        users.forEach(System.out::println);

        // 删除用户
        userService.removeUser(user.getId());
        System.out.println("删除用户成功");
    }
}

3、动态SQL和分页查询

扩展Mapper接口:
// 在UserMapper接口中添加

List<User> selectByCondition(@Param("username") String username, 
                           @Param("email") String email);

List<User> selectByPage(@Param("offset") int offset, 
                       @Param("pageSize") int pageSize);

扩展Mapper XML:

<!--UserMapper.xml中添加 -->
<select id="selectByCondition" resultType="User">
    SELECT * FROM user
    <where>
        <if test="username != null and username != ''">
            AND username LIKE CONCAT('%', #{username}, '%')
        </if>
        <if test="email != null and email != ''">
            AND email LIKE CONCAT('%', #{email}, '%')
        </if>
    </where>
</select>
<select id="selectByPage" resultType="User">
    SELECT * FROM user LIMIT #{offset}, #{pageSize}
</select>

扩展Service:
// 在UserService中添加

public List<User> getUsersByCondition(String username, String email) {
    return userMapper.selectByCondition(username, email);
}
public List<User> getUsersByPage(int pageNum, int pageSize) {
    int offset = (pageNum - 1) * pageSize;
    return userMapper.selectByPage(offset, pageSize);
}

测试动态SQL和分页:
// 在Application的main方法中添加测试代码

System.out.println("条件查询:");
List<User> conditionUsers = userService.getUsersByCondition("test", null);
conditionUsers.forEach(System.out::println);
System.out.println("分页查询(第1页,每页2条):");
List<User> pageUsers = userService.getUsersByPage(1, 2);
pageUsers.forEach(System.out::println);

4、事务管理

修改Spring配置

在applicationContext.xml中添加事务配置:
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启注解驱动的事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

创建事务性Service方法:

@Transactional
public void transferEmail(Long fromId, Long toId, String newEmail) {
    User fromUser = userMapper.selectById(fromId);
    User toUser = userMapper.selectById(toId);

    if(fromUser == null || toUser == null) {
        throw new RuntimeException("用户不存在");
    }

    // 将fromUser的email设置为newEmail
    fromUser.setEmail(newEmail);
    userMapper.update(fromUser);

    // 模拟异常
    if(newEmail.contains("error")) {
        throw new RuntimeException("测试事务回滚");
    }

    // 将toUser的email也设置为newEmail
    toUser.setEmail(newEmail);
    userMapper.update(toUser);
}

测试事务:

try {
    userService.transferEmail(1L, 2L, "[email protected]");
    System.out.println("事务操作成功");
} catch (Exception e) {
    System.out.println("事务操作失败: " + e.getMessage());
}
try {
    userService.transferEmail(1L, 2L, "[email protected]");
} catch (Exception e) {
    System.out.println("事务回滚测试: " + e.getMessage());
}

你可能感兴趣的:(Spring快速整合Mybatis)