乐趣区

基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis

Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot 和其他常用技术的整合, 可能是你遇到的讲解最详细的学习案例, 力争新手也能看懂并且能够在看完之后独立实践。基于最新的 SpringBoot2.0+,是你学习 SpringBoot 的最佳指南。),欢迎各位 Star。
SpringBoot 整合 Mybatis 有两种常用的方式,一种就是我们常见的 xml 的方式,还有一种是全注解的方式。我觉得这两者没有谁比谁好,在 SQL 语句不太长的情况下,我觉得全注解的方式一定是比较清晰简洁的。但是,复杂的 SQL 确实不太适合和代码写在一起。
下面就开始吧!
目录:

一 开发前的准备

1.1 环境参数
1.2 创建工程
1.3 创建数据库和 user 用户表
1.4 配置 pom 文件中的相关依赖
1.5 配置 application.properties
1.6 创建用户类 Bean

二 全注解的方式

2.1 Dao 层开发
2.2 service 层
2.3 Controller 层
2.4 启动类
2.5 简单测试

三 xml 的方式

3.1 Dao 层的改动
3.2 配置文件的改动

一 开发前的准备
1.1 环境参数

开发工具:IDEA
基础工具:Maven+JDK8
所用技术:SpringBoot+Mybatis
数据库:MySQL
SpringBoot 版本:2.1.0

1.2 创建工程
创建一个基本的 SpringBoot 项目,我这里就不多说这方面问题了,具体可以参考下面这篇文章:
https://blog.csdn.net/qq_34337272/article/details/79563606
1.3 创建数据库和 user 用户表
我们的数据库很简单,只有 4 个字段:用户 id、姓名、年龄、余额,如下图所示:

添加了“余额 money”字段是为了给大家简单的演示一下事务管理的方式。
建表语句:
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
1.4 配置 pom 文件中的相关依赖
由于要整合 springboot 和 mybatis 所以加入了 artifactId 为 mybatis-spring-boot-starter 的依赖,由于使用了 Mysql 数据库 所以加入了 artifactId 为 mysql-connector-java 的依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<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.5 配置 application.properties
由于我使用的是比较新的 Mysql 连接驱动,所以配置文件可能和之前有一点不同。
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=153963
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
注意:我们使用的 mysql-connector-java 8+,JDBC 连接到 mysql-connector-java 6+ 以上的需要指定时区 serverTimezone=GMT%2B8。另外我们之前使用配置 Mysql 数据连接是一般是这样指定 driver-class-name=com.mysql.jdbc.Driver, 但是现在不可以必须为 否则控制台下面的异常:
Loading class `com.mysql.jdbc.Driver’. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
上面异常的意思是:com.mysql.jdbc.Driver 被弃用了。新的驱动类是 com.mysql.cj.jdbc.Driver。驱动程序通过 SPI 自动注册,手动加载类通常是不必要。
如果你非要写把 com.mysql.jdbc.Driver 改为 com.mysql.cj.jdbc.Driver 即可。
1.6 创建用户类 Bean
public class User {
private int id;
private String name;
private int age;
private double money;

此处省略 getter、setter 以及 toString 方法
}
二 全注解的方式
先来看一下 全注解的方式,这种方式和后面提到的 xml 的方式的区别仅仅在于 一个将 sql 语句写在 java 代码中,一个写在 xml 配置文件中。全注方式解转换成 xml 方式仅需做一点点改变即可,我在后面会提到。
项目结构:

2.1 Dao 层开发
UserDao.java
@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);

/**
* 根据 id 更新用户信息
*/
@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);

/**
* 根据 id 删除用户信息
*/
@Delete(“DELETE from user WHERE id = #{id}”)
void deleteUser(@Param(“id”) int id);
}
2.2 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);
}

/**
* 根据 id 删除用户
*/

public void deleteService(int id) {
userDao.deleteUser(id);
}

/**
* 模拟事务。由于加上了 @Transactional 注解,如果转账中途出了意外 SnailClimb 和 Daisy 的钱都不会改变。
*/
@Transactional
public void changemoney() {
userDao.updateUser(“SnailClimb”, 22, 2000.0, 3);
// 模拟转账过程中可能遇到的意外状况
int temp = 1 / 0;
userDao.updateUser(“Daisy”, 19, 4000.0, 4);
}
}

2.3 Controller 层
@RestController
@RequestMapping(“/user”)
public class UserController {
@Autowired
private UserService userService;

@RequestMapping(“/query”)
public User testQuery() {
return userService.selectUserByName(“Daisy”);
}

@RequestMapping(“/insert”)
public List<User> testInsert() {
userService.insertService();
return userService.selectAllUser();
}

@RequestMapping(“/changemoney”)
public List<User> testchangemoney() {
userService.changemoney();
return userService.selectAllUser();
}

@RequestMapping(“/delete”)
public String testDelete() {
userService.deleteService(3);
return “OK”;
}

}
2.4 启动类
// 此注解表示 SpringBoot 启动类
@SpringBootApplication
// 此注解表示动态扫描 DAO 接口所在包,实际上不加下面这条语句也可以找到
@MapperScan(“top.snailclimb.dao”)
public class MainApplication {

public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}

}
2.5 简单测试
上述代码经过测试都没问题,这里贴一下根据姓名查询的测试的结果。

三 xml 的方式
项目结构:
相比于注解的方式主要有以下几点改变,非常容易实现。
3.1 Dao 层的改动
我这里只演示一个根据姓名找人的方法。
UserDao.java
@Mapper
public interface UserDao {
/**
* 通过名字查询用户信息
*/
User findUserByName(String name);

}
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>
</mapper>

3.2 配置文件的改动
配置文件中加入下面这句话:
mybatis.mapper-locations=classpath:mapper/*.xml
ThoughtWorks 准入职 Java 工程师。专注 Java 知识分享!开源 Java 学习指南——JavaGuide(12k+ Star)的作者。公众号多篇文章被各大技术社区转载。公众号后台回复关键字“1”可以领取一份我精选的 Java 资源哦!

退出移动版