4000-9696-28

SpringBoot集成Mybatis这一篇就够了!

2023年03月03日 14:08供稿中心:北大青鸟总部

摘要: Spring作为这座森林里的"森林之王",除了自家的技术给予了无缝的链接的支持,对于其他优秀的技术,也是抱着开放的态度,支持各种优秀的开源技术主动向SpringBoot的靠拢,MyBatis就是其中之一。

伴随着微服务的如此火爆的趋势,SpringBoot逐渐成为了目前Java开发领域的必备技能,如果不会点SpringBoot感觉都没脸在这个程序猿的森林里混。所以在掌握SpringBoot已经成为了大家的共识,同时SpringBoot和其他的无缝集成也成了程序员的必备技能,比如:MyBatis、Redis等......

SpringBoot作为Spring家族的明星产品,一出世就受到了广泛的关注。Spring作为这座森林里的"森林之王",除了自家的技术给予了无缝的链接的支持,对于其他优秀的技术,也是抱着开放的态度,支持各种优秀的开源技术主动向SpringBoot的靠拢,MyBatis就是其中之一。



我们都知道在使用SpringBoot的过程中,常用的持久化解决方案主要有两种,一种是Mybatis框架,另一个就是SpringData JPA。

而 SpringData Jpa和MyBatis最大的区别就是SpringData Jpa是Spring亲生的,这个从名字的命名方式上也能看出来,当然是因为它们是一家人了。

为什么这么说呢?如果大家用过Mybatis的话应该会发现,Mybatis依赖的artifactId是mybatis-spring-boot-starter,而接下来我们要讲的SpringDataJPA依赖的artifactId却是spring-boot-starter-data-jpa,从这个名字关键字(mybatis、jpa)的顺序上,我们就能看出来谁才是亲生的。

虽然不是亲生的,但是Mybatis凭借自己轻巧灵活的身姿(易上手、动态SQL等),赢得了广大开发者的喜爱,大有夺嫡的之势。



所以这篇文章咱么就来聊聊SpringBoot整合MyBatis的技术细节。


兵马未动粮草先行

常言道,兵马未动,粮草先行;没有稳重的大后方,前线的将士如何安心打仗,饭都没了,即使打赢了也是会饿死的,所以在整合Mybatis之前呢,咱么还得先做一些准备工作,咱么首先使用SpringInitializer来构建SpringBoot的基础工程,然后在此基础上再进行整合Mybatis

  1. 创建数据库

  2. 建数据库表

通常情况下,建议数据库名字以英文命名,数据库的名字就叫kgc(课工场拼音首字母),字符集选择utf8,排序规则选择utf8generalci。字符集和排序规则也可以不选使用默认设置。设置完成之后点击“确定”。



建表

创建好数据库之后,我们就要创建数据库表,表名叫t_user,这张用户表有三个属性,分别是:

  • id 唯一标记

  • username 用户名称

  • age 年龄


并插入三条数据:

# 数据库脚本文件
SET NAMES utf8mb4;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`age` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
# 插入数据
INSERT INTO `t_user`(username, age) VALUES ('张三', '18');
INSERT INTO `t_user`(username, age) VALUES ( '李四', '20');
INSERT INTO `t_user` (username, age) VALUES ('王五', '22');


配置数据库连接池

做好准备工作之后,接下来最重要的就是要在pom.xml文件中添加数据库驱动和数据库连接池依赖。

添加MySQL驱动,这里如果不指定版本默认是8.0的版本,当然你也可以指定版本,8.0的版本这里有一问比较坑的问题:

  1. MySQL数据库默认使用的是美国的时区,而我们连接的时候用的是中国的北京时间,然后比美国晚上8个小时,所以当我们在连接数据库的时候要设置一下时区为东八区ServerTimezone=UTC

  2. 驱动类

  • MySQL5.x的版本使用的驱动类是com.mysql.jdbc.Driver

  • MySQL8.x的版本使用的驱动类是com.mysql.cj.jdbc.Driver

所以这两个问题需要大家去注意一下,以免出现莫名其妙的bug

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>


接着,添加数据库连接池,这里咱们使用最火的阿里开源的Druid。

Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBossDataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池!

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>


集成Mybatis

添加Mybatis的依赖,我们使用最新的版本2.0.1

番外篇:

如果大家细心的话可能会发现,通常我们在集成一些SpringBoot提供支持的技术的时候,所添加的依赖都是以spring-boot-starter开头,格式:spring-boot-starter-xxx;但是刚才我们添加的Mybatis的依赖却是mybatis-spring-boot-starter,是以mybatis开头的,这个能其实是SpringBoot默认是不支持mybatis的,它默认支持的是它自己生态内的持久层框架JPA,由于SpringBoot是大势所趋,所以mybatis就主动去迎合SpringBoot生态,自己开发了mybatis的stater。以后大家凡是看到xxx-spring-boot-starter的依赖,都是SpringBoot没有主动提供支持的技术。

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>


在pojo包下创建User对象,并实现序列化接口Serializable

public class User implements Serializable{
private Integer id; //用户id
private String username; //用户名
private Integer age; //年龄
// 省略 setter、getter方法
}


配置数据源和mybatis的配置

在application.properties属性配置文件中配置数据源和mybatis相关配置

# 端口号
server.port=8080


# mapper xml 文件地址
mybatis.mapper-locations=classpath*:mapper/*Mapper.xml


# 数据库url
spring.datasource.url=jdbc:mysql://localhost:3306/kgc?characterEncoding=utf8&serverTimezone=UTC
# 数据库用户名
spring.datasource.username=root
# 数据库密码
spring.datasource.password=root
# 数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

创建UserMapper接口和对应的UserMapper.xml文件

在mapper包下创建UserMapper接口,并在接口中定义各一个方法



并在resource包下创建依次创建com/example/demo/mapper/UserMapper.xml



这里要注意的是接口名称要和映射文件的名称一致


最后一击:测试

在测试之前我还需要在SpringBoot的主启动类上加上一段注解配置@MapperScan,这个注解的意思是扫描我们com.example.demo.mapper包下的mapper接口并创建代理对象。

@SpringBootApplication
@MapperScan(basePackages = {"com.example.demo.mapper"})
public class DemoApplication {


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


然后在我们的controller中写一个测试的方法,可以直接使用@Autowired注解注入UserMapper,有同学可能会有这样的疑问?接口是不能创建对象怎么能注入呢,因为在SpringBoot启动的时候,会创建UserMapper的代理对象,所以实际上我们注入的是代理对象,这个跟咱么上一步说加@MapperScan正好可以对应上的。

@RestController
public class DemoController {


@Autowired
private UserMappper userMappper;
/**
* 查询所有用户信息
*/
@GetMapping("/hello")
public List<User> hello() {
List<User> users = userMappper.selectUserList();
return users;
}
}


然后在浏览器地址栏输入http://localhost:8080/hello,就可以看到浏览器已经查询出来数据,这些数据和我们插入数据的数据是一样的。这就说明我们SpringBoot集成Mybatis成功跑通了,是不是很简单呢?



在实际的开发过程中,SpringBoot和MyBatis的整合也是这么简单。如果你认真看完这篇文章,那么恭喜你又掌握了一新技能!


标签:
关于我们
公司简介
发展历程
青鸟荣誉
联系我们
加入我们
青鸟课程
BCVE视频特效课程
BCUI全链路UI设计
BCSP软件开发专业
BCNT网络工程师
启能职业教育基础课程
学习客户端下载
青鸟优师
青鸟云课堂
微信 公众号 咨询 顶部 首页
官方新版意见收集

*

官方新版意见收集

提交成功,感谢您的反馈。

我们会认真阅读和考虑每个用户的反馈。