JAVA-springboot整合Mybatis

article/2025/6/24 16:55:46

SpringBoot从入门到精通-第15章 MyBatis框架

学习MyBatis心路历程

2022年学习java基础时候,想着怎么使用java代码操作数据库,咨询了项目上开发W同事,没有引用框架,操作数据库很麻烦,就帮我写好多行代码,就实现了一个查询语句,至今我也忘记了那些代码大概是个什么样。

2025年果断入手一本SpringBoot从入门到精通纸质版书,纸质版书籍个人理解:

  • 1、有版权,案例有保障;
  • 2、系统性,把前后顺序会设计好;
  • 3、想翻的时候,翻起来有感觉;
  • 4、就是案例比较单一。
    然后就是一看就会,一做就废。但是最终只有一个解决方案,那就是动手敲,动手实现,实现过,心里就有底,才能说服自己这个我操作过。以下是我根据案例实操的步骤和结果,展示一下吧。

一、MyBatis简介

Mybatis是一款半自动化的持久层框架,所谓半自动化,就是MyBatis不仅需要程序开发人员手动编写SQL语句,而且需要手动设置SQL语句与实体类的映射关系。

MyBatis和Hibernate
MyBatis和Hibernate都是Java领域中流行的对象关系映射(ORM)框架,它们都旨在简化数据库操作和对象模型之间的交互。尽管它们都提供了类似的解决方案,但在设计理念、使用方式、性能和灵活性等方面存在一些关键差别。

结论
选择MyBatis还是Hibernate主要取决于项目的具体需求、开发团队的偏好以及特定的项目要求。如果项目需要高度定制的SQL并且团队成员熟悉SQL,那么MyBatis可能是更好的选择。如果项目更倾向于减少直接编写SQL的需要并希望减少数据库层面的复杂性,那么Hibernate可能更合适。在实践中,很多团队也会根据项目的不同部分选择使用这两种技术的一个组合,以平衡灵活性和易用性。

二、在Spring Boot项目中整合MyBatis

0、整体结构
在这里插入图片描述

1、整体步骤:

  1. pom.xml添加MyBatis依赖
  2. pom.xml添加数据库驱动依赖
  3. application配置文件添加datasource配置项
  4. 创建mapper映射器
  5. 在SpringBoot启动类添加用于表示映射器扫描的@MapperScan(basePackages = “com.mr._20250602spring_mybatis”)注解
  6. 实现数据库的基本事物,即编写实体类(对应数据库表)
  7. 测试类编写测试方法
  8. 启动测试类方法测试

2、步骤附代码

  1. pom.xml添加MyBatis依赖
 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency>
  1. pom.xml添加数据库驱动依赖
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version>
<!--            <scope>runtime</scope>--></dependency>
  1. application配置文件添加datasource配置项
spring.application.name=20250602spring_mybatis
spring.datasource.url=jdbc:mysql://10.0.0.132:1588/db_video?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL&allowPublicKeyRetrieval=true
spring.datasource.username=sun
spring.datasource.password=Sun@123

整体pom.xml文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<!--    <parent>-->
<!--        <groupId>org.springframework.boot</groupId>-->
<!--        <artifactId>spring-boot-starter-parent</artifactId>-->
<!--        <version>3.5.0</version>-->
<!--        <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
<!--    </parent>--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath /> <!-- lookup parent from repository --></parent><groupId>com.mr</groupId><artifactId>_20250602spring_mybatis</artifactId><version>0.0.1-SNAPSHOT</version><name>20250602spring_mybatis</name><description>20250602spring_mybatis</description>
<!--    <url/>-->
<!--    <licenses>-->
<!--        <license/>-->
<!--    </licenses>-->
<!--    <developers>-->
<!--        <developer/>-->
<!--    </developers>-->
<!--    <scm>-->
<!--        <connection/>-->
<!--        <developerConnection/>-->
<!--        <tag/>-->
<!--        <url/>-->
<!--    </scm>-->
<!--    <properties>-->
<!--        <java.version>17</java.version>-->
<!--    </properties>--><properties><java.version>11</java.version></properties><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>2.2.0</version></dependency><!--        <dependency>-->
<!--            <groupId>mysql</groupId>-->
<!--            <artifactId>mysql-connector-java</artifactId>-->
<!--            <scope>runtime</scope>-->
<!--        </dependency>--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version>
<!--            <scope>runtime</scope>--></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
  1. 创建mapper映射器
package com.mr._20250602spring_mybatis.mapper;import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import com.mr._20250602spring_mybatis.pojo.T_video;
public interface EmpMapper {
//    @Select("select name from t_video where id = 10")
//    boolean selectAll();@Insert("insert into t_video values(33,'springboot','sun',22)")boolean insertData();
}
  1. 在SpringBoot启动类添加用于表示映射器扫描的@MapperScan(basePackages = “com.mr._20250602spring_mybatis”)注解
package com.mr._20250602spring_mybatis;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan(basePackages = "com.mr._20250602spring_mybatis")
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
  1. 实现数据库的基本事物,即编写实体类(对应数据库表)
package com.mr._20250602spring_mybatis.pojo;public class T_video {private Integer id;private String name;private String author;private int video_view;public T_video(Integer id, String name, String author, int video_view) {this.id = id;this.name = name;this.author = author;this.video_view = video_view;}public T_video() {}@Overridepublic String toString() {return "T_video{" +"id=" + id +", name='" + name + '\'' +", author='" + author + '\'' +", video_view=" + video_view +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public int getVideo_view() {return video_view;}public void setVideo_view(int video_view) {this.video_view = video_view;}
}
  1. 测试类编写测试方法
package com.mr._20250602spring_mybatis;import com.mr._20250602spring_mybatis.mapper.EmpMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class ApplicationTests {
@AutowiredEmpMapper mapper;@Testvoid contextLoads() {
//        System.out.println("查询id=10 的name");System.out.println("增加一条数据");boolean result;if (mapper.insertData()) result = true;else result = false;System.out.println(result);}}
  1. 启动测试类方法测试
增加一条数据
2025-06-02 08:06:34.599  INFO 12944 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2025-06-02 08:06:34.962  INFO 12944 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
true

三、SQL语句中添加占位符

package com.mr._20250602spring_mybatis.mapper;import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import com.mr._20250602spring_mybatis.pojo.T_video;
public interface EmpMapper {
//    @Select("select name from t_video where id = 10")
//    boolean selectAll();@Insert("insert into t_video values(33,'springboot','sun',22)")boolean insertData();@Select("select  name from t_video where id = #{id}")String selectAll(int id);
}

修改测试类

package com.mr._20250602spring_mybatis;import com.mr._20250602spring_mybatis.mapper.EmpMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class ApplicationTests {
@AutowiredEmpMapper mapper;@Testvoid contextLoads() {
//        System.out.println("查询id=10 的name");System.out.println("增加一条数据");boolean result;if (mapper.insertData()) result = true;else result = false;System.out.println(result);}//    @Test
//    void selectData(){
//        System.out.println("查询id=10的name");
//        System.out.println(mapper.selectAll());
//    }
@Test
void selectData(){System.out.println("查询id=10的name");System.out.println(mapper.selectAll(10));
}}

执行测试方法

查询id=10的name
2025-06-02 09:48:46.929  INFO 124 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2025-06-02 09:48:47.281  INFO 124 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
零基础学Java

9.数据库表


CREATE DATABASE db_video;
USE db_video;SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for `t_video`
-- ----------------------------
DROP TABLE IF EXISTS `t_video`;
CREATE TABLE `t_video` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(100) NOT NULL,`author` varchar(20) DEFAULT NULL,`video_view` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of t_video
-- ----------------------------
INSERT INTO `t_video` VALUES ('10', '零基础学Java', '张工程师', '100000');
INSERT INTO `t_video` VALUES ('20', '如何做鱼香肉丝', '李厨师', '80000');
INSERT INTO `t_video` VALUES ('30', '职场日常妆', '王女士', '76000');
INSERT INTO `t_video` VALUES ('40', '动作电影剪辑', '老赵', '66000');

四、引入Controller

mapper接口内容

package com.mr._20250602spring_mybatis.mapper;import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import com.mr._20250602spring_mybatis.pojo.T_video;
public interface EmpMapper {
//    @Select("select name from t_video where id = 10")
//    boolean selectAll();@Insert("insert into t_video values(33,'springboot','sun',22)")boolean insertData();@Select("select  name from t_video where id = #{id}")String selectAll(int id);
}

Controller类文件内容

package com.mr._20250602spring_mybatis.controller;import com.mr._20250602spring_mybatis.mapper.EmpMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/springboot")public class a {@AutowiredEmpMapper mapper;@GetMapping("t_video")String video(@RequestParam Integer id){
//        return mapper.selectAll(10);return mapper.selectAll(id);}
}

浏览器访问测试
http://localhost:8080/springboot/t_video?id=10

零基础学Java
在这里插入图片描述

五、引入R类,返回数据库表所有数据

1、引入R类

package com.mr._20250602spring_mybatis.controller;public class R { // 通用返回值类private Boolean bool; // boolean型对象private Object obj; // 实体类对象private String str; // 字符串信息// 为通用返回值类添加无参构造方法和有参构造方法public R() {}public R(Boolean flag) {this.bool = flag;}public R(Boolean flag, Object data) {this.bool = flag;this.obj = data;}public R(Boolean flag, String msg) {this.bool = flag;this.str = msg;}public R(String msg) {this.str = msg;}// 分别为上述的3个属性添加Getter/Setter方法public Boolean getFlag() {return bool;}public void setFlag(Boolean flag) {this.bool = flag;}public Object getData() {return obj;}public void setData(Object data) {this.obj = data;}public String getMsg() {return str;}public void setMsg(String msg) {this.str = msg;}}

2、mapper接口增加select * from t_video

package com.mr._20250602spring_mybatis.mapper;import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import com.mr._20250602spring_mybatis.pojo.T_video;import java.util.List;public interface EmpMapper {
//    @Select("select name from t_video where id = 10")
//    boolean selectAll();@Insert("insert into t_video values(33,'springboot','sun',22)")boolean insertData();@Select("select  name from t_video where id = #{id}")String selectAll(int id);@Select("select * from t_video")List<T_video> selectall();
}

3、Controller类增加映射路径all

package com.mr._20250602spring_mybatis.controller;import com.mr._20250602spring_mybatis.mapper.EmpMapper;
import com.mr._20250602spring_mybatis.pojo.T_video;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/springboot")public class a {@AutowiredEmpMapper mapper;@GetMapping("t_video")String video(@RequestParam Integer id){
//        return mapper.selectAll(10);return mapper.selectAll(id);}@GetMapping("all")public R selectVideo(){return new R(true, mapper.selectall());}
}

4、启动项目,访问测试
在这里插入图片描述

六、遇到的问题

  • 1、依赖版本问题

这里采用的是书本自带的案例库进行了比对,版本对不上的复制了书本案例的版本,比如下面这个是我在IDEA创建项目时生成的spring-boot-starter-parent版本3.5.0,但是有了接口文件后启动项目时候报错了

   <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.0</version><relativePath/> <!-- lookup parent from repository --></parent>

替换成2.5.4版本后启动成功

  • <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.4</version> <relativePath /> <!-- lookup parent from repository --> </parent>

  • 2、SQL语句问题
    mapper接口中使用注解方式写sql语句时,字符串值用单引号,避免和注解的整体sql语句的双引号冲突。这里如果写错,启动程序时也会提示sql语句某个位置有异常。比如

@Insert("insert into t_video values(33,'springboot','sun',22)")boolean insertData();
  • 3、步骤前后顺序问题
    比如,引用了Mybatis依赖,application配置文件就得有数据库连接信息,不然启动报错

大佬们,小试牛刀,见笑了。更多精彩内容,敬请期待!


http://www.hkcw.cn/article/AAQSADFnIb.shtml

相关文章

Torch Geometric GCN训练心得

我训练的是直推式的图卷积神经网络GCN 对于直推式GCN训练&#xff0c;控制参数量是非常重要的&#xff0c;我的网络大小30个节点&#xff1a; 不像归纳式学习训练&#xff0c;可以通过提升样本数量来承受巨大的模型参数量&#xff0c;直推式学习一次训练的目标就一个样本&…

张雪峰宣布暂停直播两个月 深情感言引共鸣

张雪峰宣布暂停直播两个月 深情感言引共鸣。5月31日晚,有网友发布视频称张雪峰结束了2025届高考季的直播,并宣布将暂停直播两个月。在直播中,张雪峰表示这个行业不容易,因为他触动了太多人的利益,有些事情不能说得太直白。他希望能在8月1日恢复直播,如果不行的话,9月1日…

线程池详细解析(一)

java中的线程池是运用场景最多的并发框架&#xff0c;几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中&#xff0c;合理的使用线程池能够带来三个好处。 1. 降低资源消耗&#xff1a;频繁的创建线程和销毁线程会产生不少的资源上的消耗&#xff0c;通过重…

韩国大选今日开始投票 五候选人竞逐总统

韩国第21届总统大选于当地时间6月3日6时正式开始,全国共设有14295个投票站。未参加提前投票的选民凭身份证件前往指定投票站即可参与投票,投票将于当日20时结束。本次大选共有7位候选人登记,但其中两位宣布退出并支持国民力量党候选人金文洙。因此,选民将从以下五位候选人中…

米奇盖顿:音乐架起中美交流桥梁 纯粹情感共鸣

米奇盖顿在湖南卫视《歌手2025》的舞台上演唱完《If I Were a Boy》后,不禁潸然泪下。这位来自美国得克萨斯州的乡村音乐女歌手,曾在2021年获得格莱美最佳乡村独唱表演提名,成为首位提名该奖项的黑人女歌手。在中国观众毫无保留的情感反馈中,她感受到了一种久违的真诚。在美…

字节跳动社招面经 —— BSP驱动工程师(6)

接前一篇文章&#xff1a;字节跳动社招面经 —— BSP驱动工程师&#xff08;5&#xff09; 本文内容参考&#xff1a; 嵌入式硬件平台修改启动地址-CSDN博客 特此致谢&#xff01; 上一回开始针对于“嵌入式充电站”发的一篇文章字节跳动社招面经——BSP驱动工程师中的面试题…

检索器组件深入学习与使用技巧 VectorStoreRetriever 检索器

1. VectorStoreRetriever 检索器 VectorStoreRetriever 是 BaseRetriever 的子类&#xff0c;这是一个专门针对向量数据库的基础检索器&#xff0c;在 VectorStoreRetriever 的内部实现了 _get_relevant_documents() 方法&#xff0c;还定义了单独的属性&#xff1a; vectors…

深度学习pycharm debug

深度学习中&#xff0c;Debug 是定位并解决代码逻辑错误&#xff08;如张量维度不匹配&#xff09;、训练异常&#xff08;如 Loss 波动&#xff09;、数据问题&#xff08;如标签错误&#xff09;的关键手段&#xff0c;通过打印维度、可视化梯度等方法确保模型正常运行、优化…

女研究生二次入伍再续海军梦 逐梦军营续写辉煌

女研究生二次入伍再续海军梦!在2025年春季入伍的新兵中,有一名特殊的“老兵”。她曾在海军某部服役两年,退伍后重返校园继续学业。如今已是研究生的她再次穿上海军军装,来到南部战区海军某训练基地,又一次成为了海军战士,踏上了二次入伍的军旅生涯。张玉玺于2020年9月第一…

尾号7个0的手机号拍出61.2万元 独特号码高价成交

一个尾号为七个零的手机号码使用权于6月1日以25万元底价起拍,共有13人参与竞拍。最终该号码以61.2万元成交。公告显示,截至4月23日,该号码无欠费,余额约9.14元,已办理4G全国流量王8元套餐,未绑定宽带,过户无预存话费要求,完成过户即可转网。目前,该号码使用权已被天津…

中国单方面免签“朋友圈”扩大 拉美五国加入免签行列

中国单方面免签“朋友圈”扩大 拉美五国加入免签行列。从6月1日起,巴西、阿根廷、智利、秘鲁、乌拉圭五个国家的持普通护照人员可以享受免签政策。这一政策试行期为2025年6月1日至2026年5月31日,期间这些国家的公民来华经商、旅游观光、探亲访友、交流访问或过境不超过30天,…

贝尔伯克当选联大主席 大V解读 女性力量再添一笔

6月2日,德国前外长贝尔博克当选为第80届联合国大会主席,成为第五位担任此职位的女性。联合国大会以167票赞成通过了安娜莱娜贝尔博克出任下一任主席的决定。贝尔博克对此表示非常感激,并承诺将通过“基于信任的对话”为大家服务。她宣称自己的目标是减少冗余、提高透明度,并…

上海游客“表扬帖”走红网络 感谢信点赞厦门辅警

上海游客“表扬帖”走红网络 感谢信点赞厦门辅警!一篇饱含深情的表扬贴在小红书上迅速走红,网友查女士诚挚地感谢了一位帮助她的厦门辅警。厦门双子塔上灯光轮滚播放着连续七届获选文明城市的信息,这是每一位厦门人共同努力、团结一致的结果。5月25日中午11点多,上海游客查…

如何评估 RAG 的分块Chunking策略

如何评估 RAG 的分块策略 我对 RAG&#xff08;检索增强生成模型&#xff09;进行了深入研究&#xff0c;深知分块在任何 RAG 流水线中都至关重要。 我接触过的许多人坚信更好的模型能够提升 RAG 的性能。有些人则对向量数据库寄予厚望。即便那些认同分块重要性的人&#xff…

贪心算法应用:顶点覆盖问题详解

贪心算法应用&#xff1a;顶点覆盖问题详解 贪心算法是解决顶点覆盖问题的经典方法之一。下面我将从基础概念到高级优化&#xff0c;全面详细地讲解顶点覆盖问题及其贪心算法解决方案。 一、顶点覆盖问题基础 1. 问题定义 顶点覆盖问题&#xff08;Vertex Cover Problem&am…

代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、栈与队列总结

150. 逆波兰表达式求值--后缀表达式 力扣题目链接(opens new window) 根据 逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给…

女童玩的气球突然爆炸 静电引发惊魂一刻

一位江苏宝妈在六一儿童节前发布了一段视频,提醒家长们不要给孩子买氢气球玩。她描述了自己孩子遇到的一次危险情况:气球突然爆炸,孩子的后脑勺头发被烧焦了一层,手臂上的汗毛也被烧掉了。事发时,这位宝妈正在给孩子喂食鸡腿,突然听到“嘭”的一声,气球在孩子身后爆裂,…

Ubuntu安装CH340驱动教程

Ubuntu22.04安装CH340驱动 3.1 用lsusb查看USB 插上CH340之前 插上CH340之后 输出中包含ID 1a86:7523 QinHeng Electronics CH340 serial converter的信息&#xff0c;这表明CH340设备已经被系统识别。 3.2 查看USB转串口 ls -l /dev/ttyUSB0/dev下没有该设备节点。 用dme…

新人雨中骑“鸡动车”去结婚 创意婚礼引关注

6月1日,在合肥渡仙桥路上,一对新人以独特的方式前往婚礼现场。他们没有选择豪华婚车,甚至没有开车,而是骑着小鸡造型的两轮电动车赶往婚礼现场。这对新人表示,看到这种小鸡造型的电动车觉得很漂亮,便决定用它作为婚车。视频中,这支婚车车队虽然数量不多,但在路上格外显…

上海迪士尼打架事件后续 因拍照引发冲突

5月31日,有网友发布视频称,在上海迪士尼乐园内一对情侣和一家三口发生了冲突。视频中可以看到双方在现场扭打,周围游客纷纷上前劝阻。6月1日,当地相关部门透露,该事件发生在5月31日下午,在迪士尼疯狂动物城的一处拍照打卡点,双方因拍照问题发生争执,随后演变成肢体冲突…