SpringBoot-Guide项目:SpringBoot整合MyBatis全攻略

SpringBoot-Guide项目:SpringBoot整合MyBatis全攻略

springboot-guide SpringBoot2.0+从入门到实战! springboot-guide 项目地址: https://gitcode.com/gh_mirrors/sp/springboot-guide

本文将基于SpringBoot-Guide项目,全面讲解SpringBoot与MyBatis的两种整合方式:全注解方式和XML方式。通过本教程,你将掌握如何在SpringBoot项目中高效使用MyBatis进行数据库操作。

一、开发环境准备

1.1 技术栈说明

  • 核心框架:SpringBoot 2.1.0
  • ORM框架:MyBatis
  • 数据库:MySQL 5.7+
  • 开发工具:IDEA + Maven
  • JDK版本:JDK8

1.2 数据库准备

我们创建一个简单的用户表用于演示:

CREATE TABLE `user` (
  `id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(33) DEFAULT NULL COMMENT '姓名',
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  `money` double DEFAULT NULL COMMENT '账户余额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

表设计包含四个字段:ID(主键)、姓名、年龄和账户余额。其中账户余额字段将用于演示事务管理功能。

1.3 项目依赖配置

在pom.xml中添加必要依赖:

<dependencies>
    <!-- SpringBoot Web支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- MyBatis整合SpringBoot的starter -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>
    
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <!-- 测试支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

1.4 数据库连接配置

application.properties配置:

server.port=8333
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/erp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

特别注意:使用MySQL 8+驱动时:

  1. 必须指定时区参数serverTimezone
  2. 驱动类名应为com.mysql.cj.jdbc.Driver而非旧版的com.mysql.jdbc.Driver

1.5 实体类定义

创建User实体类:

public class User {
    private int id;
    private String name;
    private int age;
    private double money;
    
    // 省略getter/setter和toString方法
}

二、全注解方式整合MyBatis

全注解方式将SQL语句直接写在Java代码中,适合SQL语句较简单的场景。

2.1 项目结构

src/main/java
├── bean
│   └── User.java
├── dao
│   └── UserDao.java
├── service
│   ├── UserService.java
├── controller
│   └── UserController.java
└── MainApplication.java

2.2 DAO层实现

使用MyBatis注解定义SQL操作:

@Mapper
public interface UserDao {
    // 根据姓名查询用户
    @Select("SELECT * FROM user WHERE name = #{name}")
    User findUserByName(@Param("name") String name);

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

    // 插入用户
    @Insert("INSERT INTO user(name, age, money) VALUES(#{name}, #{age}, #{money})")
    void insertUser(@Param("name") String name, @Param("age") Integer age, 
                   @Param("money") Double money);

    // 更新用户
    @Update("UPDATE user SET name=#{name}, age=#{age}, money=#{money} WHERE id=#{id}")
    void updateUser(@Param("name") String name, @Param("age") Integer age,
                   @Param("money") Double money, @Param("id") int id);

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

2.3 Service层实现

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    // 查询方法
    public User selectUserByName(String name) {
        return userDao.findUserByName(name);
    }
    
    public List<User> selectAllUser() {
        return userDao.findAllUser();
    }

    // 插入方法
    public void insertService() {
        userDao.insertUser("SnailClimb", 22, 3000.0);
        userDao.insertUser("Daisy", 19, 3000.0);
    }

    // 删除方法
    public void deleteService(int id) {
        userDao.deleteUser(id);
    }

    // 事务演示方法
    @Transactional
    public void changemoney() {
        userDao.updateUser("SnailClimb", 22, 2000.0, 3);
        // 模拟异常触发事务回滚
        int temp = 1 / 0;
        userDao.updateUser("Daisy", 19, 4000.0, 4);
    }
}

2.4 Controller层实现

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/query")
    public User testQuery() {
        return userService.selectUserByName("Daisy");
    }

    @PostMapping("/insert")
    public List<User> testInsert() {
        userService.insertService();
        return userService.selectAllUser();
    }

    @PostMapping("/changemoney")
    public List<User> testchangemoney() {
        userService.changemoney();
        return userService.selectAllUser();
    }

    @DeleteMapping("/delete/{id}")
    public String testDelete(@PathVariable int id) {
        userService.deleteService(id);
        return "OK";
    }
}

2.5 启动类配置

@SpringBootApplication
@MapperScan("top.snailclimb.dao") // 扫描Mapper接口
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

2.6 全注解方式特点

优点:

  1. SQL与Java代码在一起,便于简单场景的快速开发
  2. 无需额外的XML文件,项目结构简洁
  3. 适合SQL语句较短、不复杂的场景

缺点:

  1. 复杂SQL可读性差
  2. SQL与Java代码耦合,修改需要重新编译
  3. 动态SQL支持较弱

三、XML方式整合MyBatis

XML方式将SQL语句写在配置文件中,适合复杂SQL场景。

3.1 项目结构调整

src/main
├── java
│   └── ... (同全注解方式)
└── resources
    └── mapper
        └── UserMapper.xml

3.2 DAO层调整

@Mapper
public interface UserDao {
    User findUserByName(String name);
    // 其他方法...
}

3.3 XML映射文件

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="top.snailclimb.dao.UserDao">
    <select id="findUserByName" parameterType="String" 
            resultType="top.snailclimb.bean.User">
        SELECT * FROM user WHERE name = #{name}
    </select>
    
    <!-- 其他SQL定义... -->
</mapper>

3.4 配置文件调整

application.properties新增:

mybatis.mapper-locations=classpath:mapper/*.xml

3.5 XML方式特点

优点:

  1. SQL与Java代码分离,便于维护
  2. 支持复杂SQL和动态SQL
  3. 修改SQL无需重新编译
  4. 有良好的语法高亮和提示

缺点:

  1. 需要维护额外的XML文件
  2. 简单场景下略显繁琐

四、两种方式对比与选择建议

| 对比项 | 全注解方式 | XML方式 | |--------|------------|---------| | 适用场景 | 简单CRUD | 复杂SQL | | 开发效率 | 高 | 中 | | 维护性 | 中 | 高 | | 动态SQL支持 | 弱 | 强 | | 代码整洁度 | 高 | 中 |

选择建议

  1. 项目初期或小型项目:推荐全注解方式
  2. 复杂查询较多:推荐XML方式
  3. 混合使用:简单CRUD用注解,复杂SQL用XML

五、最佳实践建议

  1. 命名规范

    • Mapper接口名:XxxDao或XxxMapper
    • XML文件名:与Mapper接口同名
    • SQL id:与Mapper方法同名
  2. 事务管理

    • 使用@Transactional注解管理事务
    • 注意事务的传播行为和隔离级别设置
  3. 性能优化

    • 复杂查询考虑使用二级缓存
    • 批量操作使用BatchExecutor
  4. 异常处理

    • 统一处理MyBatis异常
    • 使用Spring的异常处理机制

通过本教程,你应该已经掌握了SpringBoot整合MyBatis的两种主要方式。根据项目实际需求选择合适的方式,可以大大提高开发效率和代码质量。

springboot-guide SpringBoot2.0+从入门到实战! springboot-guide 项目地址: https://gitcode.com/gh_mirrors/sp/springboot-guide

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆欣瑶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值