SpringBoot-Guide项目:SpringBoot整合MyBatis全攻略
springboot-guide SpringBoot2.0+从入门到实战! 项目地址: 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+驱动时:
- 必须指定时区参数
serverTimezone
- 驱动类名应为
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 全注解方式特点
优点:
- SQL与Java代码在一起,便于简单场景的快速开发
- 无需额外的XML文件,项目结构简洁
- 适合SQL语句较短、不复杂的场景
缺点:
- 复杂SQL可读性差
- SQL与Java代码耦合,修改需要重新编译
- 动态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方式特点
优点:
- SQL与Java代码分离,便于维护
- 支持复杂SQL和动态SQL
- 修改SQL无需重新编译
- 有良好的语法高亮和提示
缺点:
- 需要维护额外的XML文件
- 简单场景下略显繁琐
四、两种方式对比与选择建议
| 对比项 | 全注解方式 | XML方式 | |--------|------------|---------| | 适用场景 | 简单CRUD | 复杂SQL | | 开发效率 | 高 | 中 | | 维护性 | 中 | 高 | | 动态SQL支持 | 弱 | 强 | | 代码整洁度 | 高 | 中 |
选择建议:
- 项目初期或小型项目:推荐全注解方式
- 复杂查询较多:推荐XML方式
- 混合使用:简单CRUD用注解,复杂SQL用XML
五、最佳实践建议
-
命名规范:
- Mapper接口名:XxxDao或XxxMapper
- XML文件名:与Mapper接口同名
- SQL id:与Mapper方法同名
-
事务管理:
- 使用@Transactional注解管理事务
- 注意事务的传播行为和隔离级别设置
-
性能优化:
- 复杂查询考虑使用二级缓存
- 批量操作使用BatchExecutor
-
异常处理:
- 统一处理MyBatis异常
- 使用Spring的异常处理机制
通过本教程,你应该已经掌握了SpringBoot整合MyBatis的两种主要方式。根据项目实际需求选择合适的方式,可以大大提高开发效率和代码质量。
springboot-guide SpringBoot2.0+从入门到实战! 项目地址: https://gitcode.com/gh_mirrors/sp/springboot-guide
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考