十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)
十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)
@
MyBatis 的官方文档:https://mybatis.p2hp.com/

关于 MyBatis 的学习的详细内容,大家可以移步至:️️️ MyBatis_ChinaRainbowSea的博客-CSDN博客 。
1. Spring Boot 配置 MyBatis 的详细步骤
- 首先,我们创建相关测试的数据库,数据表。如下:

CREATE DATABASE `springboot_mybatis`
USE `springboot_mybatis`
CREATE TABLE `monster` (
`id` int not null auto_increment,
`age` int not null,
`birthday` DATE DEFAULT NULL,
`email` VARCHAR(255) DEFAULT NULL,
`gender` CHAR(1) DEFAULT null,
`name` VARCHAR(255) DEFAULT NULL,
`salary` DOUBLE not NULL,
PRIMARY KEY(`id`)
)
SELECT * from monster
INSERT INTO `monster` (`id`,`age` ,`birthday`,`email`,`gender`,`name`,`salary`)
VALUES (1,20,'2000-10-10','nmw@sohu.com','男','牛魔王',9000.99)
INSERT INTO `monster` (`id`,`age` ,`birthday`,`email`,`gender`,`name`,`salary`)
VALUES (2,10,'2000-12-12','bgj@sohu.com','女','白骨精',9999.99)
- 导入相关的
jar依赖。这里我们使用 Druid 数据库连接池,同时我们还需要导入mybatis.spring.boot的。

<!-- 引入 mybatis starter-->
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
引入 Druid 数据库的 jar 依赖。

<!-- 引入 druid 依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
所有的 pom.xml 文件当中的 jar 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rainbowsea</groupId>
<artifactId>springboot_mybaits</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 导入SpringBoot 父工程-规定写法-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
</parent>
<!-- 导入web项目场景启动器:会自动导入和web开发相关的jar包所有依赖【库/jar】-->
<!-- 后面还会在说明spring-boot-starter-web 到底引入哪些相关依赖-->
<dependencies>
<!-- 引入 web starter 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 mybatis starter-->
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- 引入 mysql 驱动: 这里老师使用版本仲裁 8.0.26-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 引入配置处理器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!--引入lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 引入 test stater -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- 引入 druid 依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
</dependencies>
</project>
- 编写对应 数据表的在Java当中对应的 Bean 对象。

特殊说明:
这里使用
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")注解。来设置数据表当中的时间赋值到该 Bean 对象上的时间属性的一个时间格式。
pattern = "yyyy-MM-dd"是设置时间显示的格式样式timezone = "GMT+8"是设置时区差。这里我们中国是东半球,时差为 + 8 个小时。需要注意的是:这个注解只对前端显示,有效果,后端,控制台显示无效。
- 将Spring Boot 默认的 HikariCP 数据库连接池,切换为我们想要的
Druid数据库连接池。
这里我们通过配置类的方式,进行切换。

package com.rainbowsea.springboot.mybatis.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DruidDataSourceConfig {
@ConfigurationProperties(value = "spring.datasource") // 读取 类路径下的application.yaml
// 的信息,并为下面的 对应的 setXX 进行赋值操作
@Bean
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
}
在 resource 类路径下创建一个,名为 applicaiton.yaml 文件,配置编写,相关对于,Druid 数据库连接池的信息。如下:

server:
port: 9090 # 注意:使用空格
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: MySQL123
url: jdbc:mysql://localhost:3306/springboot_mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8

- 编写项目的场景启动器

package com.rainbowsea.springboot.mybatis;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext ioc = SpringApplication.run(Application.class, args);
}
}
- 运行测试,我们是否成功切换为了,我们想要的 Duird 数据连接池,因为在 Spring Boot 当中测试的话,必须要编写好对应的项目启动器,不然,是无法测试的,会报错。


package com.rainbowsea.springboot.mybatis;
import com.rainbowsea.springboot.mybatis.bean.Monster;
import com.rainbowsea.springboot.mybatis.mapper.MonsterMapper;
import com.rainbowsea.springboot.mybatis.service.MonsterService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.annotation.Resource;
@SpringBootTest(classes = Application.class) // 与 main 不同的需要指明 测试的是哪个Class类
public class ApplicationTest {
@Resource
private JdbcTemplate jdbcTemplate;
@Test
public void t1() {
// 输出看看当前的数据源是什么
System.out.println(jdbcTemplate.getDataSource().getClass());
}
}
- 创建一个mapper/dao 的包,在该包下创建一个名为
MonsterMapper的接口,通过代理类的方式,在该接口下,编写我们要执行业务的 SQL 语句的方法。

package com.rainbowsea.springboot.mybatis.mapper;
import com.rainbowsea.springboot.mybatis.bean.Monster;
import org.apache.ibatis.annotations.Mapper;
/**
* 在Mapper接口使用 @Mapper 就会扫描,并将Mapper接口对象注入
*/
@Mapper // 包扫描,加上了这个注解的话,那么
public interface MonsterMapper {
// 方法 根据id 返回 Monster 对象
public Monster getMonsterById(Integer id);
}
特别说明:
这里我们在该 接口类当中,使用了
@Mapper注解。该注解的作用就是,让Spring Boot 加载的时候,会扫描这个类。从而找到这个类。这样我们就不需要额外的配置,包扫描了 。
- 在相应的对应的包,下创建对应的包,创建对应 SQl 语句的
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.rainbowsea.springboot.mybatis.mapper.MonsterMapper">
<!--
1. 扫描所有的dao接口的实现,加入到ioc容器中
2. 这里dao接口,就是mapper接口
-->
<!-- 配置 getMonsterById-->
<select id="getMonsterById" resultType="com.rainbowsea.springboot.mybatis.bean.Monster">
select * from monster where id = #{id}
</select>
<!-- elect * from `monster` where id = #{id} 注意: 不是单引号处理 -->
</mapper>
同时需要在,application.yaml 文件当中配置,Mybatis 的包扫描路径:如下;

mybatis:
# 指定要扫描的 Xxxmapper.xml
mapper-locations: classpath:mapper/*.xml
server:
port: 9090 # 注意:使用空格
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: MySQL123
url: jdbc:mysql://localhost:3306/springboot_mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
mybatis:
# 指定要扫描的 Xxxmapper.xml
mapper-locations: classpath:mapper/*.xml
# 通过config-location 可以指定mybatis-config.xml 可以以传统的方式来配置mybatis
# config-location:
# 我们可以直接在 application.yaml 进行配置
# 举例说明1,比如配置原来的 typeAliases
# 还有很多配置,等我们用到再说
# type-aliases-package: com.rainbowsea.springboot.mybatis.bean
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# map-underscore-to-camel-case: true
# 老师说明: 配置mybatis的两种方式的选择: 如果配置比较简单,就直接在application.yaml配置
# 如配置内部比较多,可以考虑单独的做一个mybatis-config.xml
运行测试:

package com.rainbowsea.springboot.mybatis;
import com.rainbowsea.springboot.mybatis.bean.Monster;
import com.rainbowsea.springboot.mybatis.mapper.MonsterMapper;
import com.rainbowsea.springboot.mybatis.service.MonsterService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.annotation.Resource;
@SpringBootTest(classes = Application.class) // 与 main 不同的需要指明 测试的是哪个Class类
public class ApplicationTest {
@Resource
private MonsterMapper monsterMapper;
@Test
public void getMonsterById() {
Monster monsterById = monsterMapper.getMonsterById(1);
System.out.println(monsterById);
}
}

- 编写对应的 Severl 业务处理
首先,编写其接口:

package com.rainbowsea.springboot.mybatis.service;
import com.rainbowsea.springboot.mybatis.bean.Monster;
public interface MonsterService {
// 根据id 返回 Monster 对象
public Monster getMonsterById(Integer id);
}
在编写其接口的实现类,

package com.rainbowsea.springboot.mybatis.service.impl;
import com.rainbowsea.springboot.mybatis.bean.Monster;
import com.rainbowsea.springboot.mybatis.mapper.MonsterMapper;
import com.rainbowsea.springboot.mybatis.service.MonsterService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class MonsterServiceImpl implements MonsterService {
// 装配MonsterMapper
@Resource
private MonsterMapper monsterMapper;
@Override
public Monster getMonsterById(Integer id) {
return monsterMapper.getMonsterById(id);
}
}
运行测试:

package com.rainbowsea.springboot.mybatis;
import com.rainbowsea.springboot.mybatis.bean.Monster;
import com.rainbowsea.springboot.mybatis.mapper.MonsterMapper;
import com.rainbowsea.springboot.mybatis.service.MonsterService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.annotation.Resource;
@SpringBootTest(classes = Application.class) // 与 main 不同的需要指明 测试的是哪个Class类
public class ApplicationTest {
// 装配到MonsterService
@Resource
private MonsterService monsterService;
// 测试 MonsterService
@Test
public void getMonsterById2() {
Monster monster = monsterService.getMonsterById(2);
System.out.println(monster);
}
}

- 编写对应的 Controller 控制器,在前端处理显示。

package com.rainbowsea.springboot.mybatis.controller;
import com.rainbowsea.springboot.mybatis.bean.Monster;
import com.rainbowsea.springboot.mybatis.service.MonsterService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
@Controller
public class MonsterController {
// 装配MonsterService
@Resource
private MonsterService monsterService;
@ResponseBody
@GetMapping("/monster")
public Monster getMonsterById( @RequestParam(value = "id") Integer id) {
return monsterService.getMonsterById(id);
}
}
运行测试:注意:我们这里配置的端口是9090,并不是8080。

2. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)的更多相关文章
- spring boot集成 servlet自动注册的两种方式
有两种方式:(两种方式同时存在时,@Bean优先@ServletComponentScan实例化,生成两个对象) 1)通过@ServletComponentScan类注解 扫描 带有@WebServl ...
- Spring Boot整合Mybatis完成级联一对多CRUD操作
在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...
- Spring Boot系列(三):Spring Boot整合Mybatis源码解析
一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...
- Spring Boot整合Mybatis并完成CRUD操作
MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...
- spring boot 整合 mybatis 以及原理
同上一篇文章一样,spring boot 整合 mybatis过程中没有看见SqlSessionFactory,sqlsession(sqlsessionTemplate),就连在spring框架整合 ...
- Spring Boot 整合mybatis时遇到的mapper接口不能注入的问题
现实情况是这样的,因为在练习spring boot整合mybatis,所以自己新建了个项目做测试,可是在idea里面mapper接口注入报错,后来百度查询了下,把idea的注入等级设置为了warnin ...
- Spring Boot整合Mybatis报错InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider
Spring Boot整合Mybatis时一直报错 后来发现原来主配置类上的MapperScan导错了包 由于我使用了通用Mapper,所以应该导入通用mapper这个包
- Spring Boot整合MyBatis(非注解版)
Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...
- 太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?
Spring boot 整合 Mybatis Druid并配置监控 添加依赖 <!--druid--> <dependency> <groupId>com.alib ...
- MyBatis配置数据源的两种方式
---------------------siwuxie095 MyBatis 配置数据源的两种方式 1.配置方 ...
随机推荐
- electron安装成功记录
1.登录官网查看当前最新版本对应的node,注意这里不要看php那个汉化的,他那个是老版本的,node对不上 2.nvm安装一个新的node 3.使用cnpm安装(npm安装还是报错了,记得删node ...
- 使用ventoy安装windows10
使用ventoy安装windows10 在ventoy中选择windows10镜像 进入Windows安装界面 下一步,选择现在安装 稍等片刻 选择我没有产品密钥 根据需求选择对应版本 下一步,接受许 ...
- CentOS-7离线安装policycoreutils-python
1.下载相关安装包 policycoreutils-2.5-34.el7.src.rpm 快速下载地址:https://vault.centos.org/7.9.2009/os/x86_64/Pack ...
- 【Vue】Re03 computed属性计算和ES6的一些补充
一.Computed属性计算 四种计算处理的方式方法 <!DOCTYPE html> <html lang="en"> <head> <m ...
- signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library) —— 强化学习ppo算法库sample-factory的多进程包装器,实现类似Qt的多进程编程模式(信号与槽机制) —— python3.12版本下成功通过测试
什么是 Qt signal-slot库项目地址: https://github.com/alex-petrenko/signal-slot 该库实现的主要原理: 要注意这个项目的library只是对原 ...
- 国产深度学习框架吸引用户的一种免费手段——免费GPU时长
国产的深度学习框架基本成为了一个头部公司的标配了,不论是阿里.百度还是华为都推出了自己的深度学习框架,这几家公司为了吸引用户也都采取了免费使用GPU的活动,但是与阿里.百度的不同,华为是与固定的高校的 ...
- git 如何处理合并时存在的子模块冲突
如果另一个分支的子模块不同于当前分支,那么在拉取下来时,并不会更新本地子模块的版本,而会出现一个.diff文件,表示差异性.那么在合并代码时,可能会因为这个.dff文件冲突无法解决.产生这个问题的原因 ...
- vite创建的react项目如何兼容低版本安卓,低版本安卓不支持es6语法
Vite 是一个现代化的前端构建工具,默认情况下,它会生成基于 ES6+ 的代码.这对于大多数现代浏览器来说是没有问题的,但对于一些较旧版本的安卓浏览器可能会遇到兼容性问题. 为了使 Vite 创建的 ...
- Java 大文件IO操作效率对比【我说说 你瞅瞅】
Java 文件IO操作效率对比 注:本文只做时间消耗层面对比,内存占用层面需要特别关注! 1. 参数说明 文件总大小:2,111,993,850 字节(2.11 GB) static String d ...
- docker生产环境jvm性能优化
1.xmx与xms设置多大合适 docker获得的mem_usage的大小是从外部得到的java进程的内存大小,不仅仅是 -Xmx设置的大小,如果 -Xmx和docker分配的内存一致的话,由于jav ...

