SpringBoot——整合MyBatis

目录

MyBatis

项目总结

1、创建SQL表

2、新建一个SpringBoot项目

3、pom.xml添加依赖

4、application.properties配置文件

5、User实体类

6、UserMapper接口

7、UserMapper.xml映射文件

8、UserController控制器

9、SpringBootMyBatisApplication启动类

10、使用Postman进行测试


学习该项目时的一点心得:

在学习SpringBoot整合MyBatis时,网上的资料实在太多了,学得有点混乱。后来找到了一本书《SpringBoot企业级应用开发实战教程》张磊、宋洁、张建军著,里面的内容简洁明了,容易理解。然后跟着书敲出这个项目,以这个小项目为基点,再去对比其他的SpringBoot整合MyBatis的项目,有不同的地方就查资料,为什么不一样,尽力让项目变得更完美,在此过程中,也不断地确定了SpringBoot整合MyBatis时的核心要点是什么。

MyBatis

  • MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架
  • MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的传统的Java对象)映射成数据库中的记录

项目总结

工作流程

  • 创建一个Spring Boot项目,并在pom.xml中添加必要的依赖

  • 在application.properties文件中配置数据库的连接信息和MyBatis的相关配置信息。

  • 创建一个实体类User,该实体类对应数据库中的t_user表的结构

  • 然后使用MyBatis的注解或者XML配置文件来定义数据库操作的接口和方法。

    • 创建一个UserMapper接口,用于定义数据库操作的方法。在接口中定义了各种增删改查的方法。

    • 创建一个UserMapper.xml文件,该文件对应UserMapper接口中定义的方法。在该文件中配置每个方法对应的SQL语句。

  • 在 UserController 控制器中注入对应的数据库操作接口,并调用接口中的方法来实现相关的业务逻辑。

  • 创建SpringBootMyBatisApplication类作为项目的启动类,

    • 并在该类上添加@SpringBootApplication注解,表示这是一个Spring Boot项目。

    • 添加@MapperScan,扫描接口类

  • 整个过程中,Spring Boot会根据配置文件和注解来自动装配相应的Bean,并管理整个项目的生命周期。 

1、创建SQL表

  • 表名和列名应使用反引号(`)而不是单引号(')
CREATE DATABASE userdb;
USE userdb;
DROP table IF EXISTS t_user;
CREATE TABLE `t_user`(`id` INT(11) NOT NULL AUTO_INCREMENT,`uname` VARCHAR(20) NOT NULL,`age` TINYINT(4) NOT NULL,`roles` INT(11) NOT NULL,`address` VARCHAR(255),PRIMARY KEY (`id`)
);
INSERT INTO `t_user`(`id`,`uname`,`age`,`roles`,`address`) 
VALUES (1,'小张',60,1,'天津市'),(2,'小王',55,2,'北京市'),(3,'小红',60,3,'天津市'),(4,'小李',70,3,'上海市');

打开MySQL,保持运行,不要关闭黑窗

2、新建一个SpringBoot项目

挑选技术支持:

  • Lombok
  • SpringWeb
  • MySQL Driver
  • MyBatis Framework

项目结构:

3、pom.xml添加依赖

  • 注意版本号,我是从3.x降到2.x才跑通
<?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>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.study</groupId><artifactId>springboot_mybatis</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_mybatis</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--添加MyBatis依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!--添加MySQL依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>2.2.2</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

4、application.properties配置文件

# userdb是使用的数据库名字
spring.datasource.url=jdbc:mysql://localhost:3306/userdb?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 添加mapper-locations路径,扫描*Mapper.xml文件,一般不用改,*Mapper是指命名以Mapper结尾的XML文件
mybatis.mapper-locations=classpath*:mapper/*Mapper.xml

5、User实体类

package com.study.springboot_mybatis.pojo;import lombok.Data;import java.io.Serializable;@Data //添加lombok依赖,自动生成getter和setter
public class User implements Serializable {private Integer id;private String uname;private int age;private int roles;private String address;
}

6、UserMapper接口

package com.study.springboot_mybatis.mapper;import com.study.springboot_mybatis.pojo.User;
import org.springframework.stereotype.Repository;import java.util.List;//通过在类上添加@Repository注解,Spring可以自动创建该类的实例,并将其注入到其他需要访问数据库或持久化的组件中。
@Repository
public interface UserMapper {List<User> selectUserList();User findById(int id);int save(User user);int update(User user);int delete(Integer id);
}

7、UserMapper.xml映射文件

  • 接口类名称要和Mapper映射文件的名称一致
  • 接口中的方法要和映射文件id值名称一致
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.study.springboot_mybatis.mapper.UserMapper"><resultMap id="BaseResultMap" type="com.study.springboot_mybatis.pojo.User"><!--1.column 指定表字段名或其别名2.property 指定 javaBean 的属性名3.jdbcType 指定表字段类型4.javaType 指定类属性的java类型--><result column="id" jdbcType="INTEGER" property="id" javaType="java.lang.Integer"/><result column="uname" jdbcType="VARCHAR" property="uname" javaType="java.lang.String"/><result column="age" jdbcType="INTEGER" property="age" javaType="java.lang.Integer"/><result column="roles" jdbcType="INTEGER" property="id" javaType="java.lang.Integer"/><result column="address" jdbcType="VARCHAR" property="address" javaType="java.lang.String"/></resultMap><!--useGeneratedKeys:是够获取自动增长的主键值。true表示获取keyProperty :指定将获取到的主键值封装到哪儿个属性里--><insert id="save" parameterType="com.study.springboot_mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">insert into t_user<trim prefix="(" suffix=")" suffixOverrides=","><if test="id != null">id,</if><if test="uname != null">uname,</if><if test="age != null">age,</if><if test="roles != null">roles,</if><if test="address != null">address,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="id != null"><!--#{id} 是 MyBatis 的参数占位符,表示将会传入的参数中的 id 字段的值替换到此处。-->#{id,jdbcType=INTEGER},</if><if test="uname != null">#{uname,jdbcType=VARCHAR},</if><if test="age != null">#{age,jdbcType=INTEGER},</if><if test="roles != null">#{roles,jdbcType=INTEGER},</if><if test="address != null">#{address,jdbcType=VARCHAR},</if></trim></insert><update id="update" parameterType="com.study.springboot_mybatis.pojo.User">update t_user<!--set 标签可以用于动态包含需要更新的列,忽略其它不更新的列下面是ID不变,其他信息动态更新,即通过ID找到要修改的用户--><set><!--<trim> 标签用于修剪 SQL 语句中不必要的部分。这里设置了 prefix、suffix 和 suffixOverrides 属性为空,表示不添加任何前缀和后缀,并且去除 SQL 语句末尾可能多余的逗号。根据条件使用了 <if> 标签来判断是否更新相应的列--><trim prefix="" suffix="" suffixOverrides=","><!--使用了 <if> 标签来判断是否更新相应的列。如果条件为真,则添加对应的更新语句--><if test="uname != null">uname = #{uname,jdbcType=VARCHAR},</if><if test="age != null">age = #{age},</if><if test="roles != null">roles = #{roles,jdbcType=INTEGER},</if><if test="address != null">address = #{address,jdbcType=VARCHAR},</if></trim></set>where id = #{id,jdbcType=BIGINT}</update><delete id="delete" parameterType="java.lang.Integer">deletefrom t_userwhere id = #{id,jdbcType=INTEGER}</delete><!--查询全部记录--><select id="selectUserList" resultType="com.study.springboot_mybatis.pojo.User">select * from t_user;</select><select id="findById" resultType="com.study.springboot_mybatis.pojo.User">select * from t_user where id = #{id};</select>
</mapper>

8、UserController控制器

  • UserController是一个基于Spring Boot的RESTful风格的控制器类,用于处理用户相关的HTTP请求
  • ResponseEntity 则是 Spring Framework 中用于表示 HTTP 响应的一个类,它包含了响应的状态码、头部信息和响应体等内容。在 Spring MVC 或 Spring Boot 中,我们通常会将处理方法的返回值包装为 ResponseEntity 对象,以便更加灵活地设置 HTTP 响应的各种属性。

package com.study.springboot_mybatis.controller;import com.study.springboot_mybatis.mapper.UserMapper;
import com.study.springboot_mybatis.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/user")
public class UserController {@AutowiredUserMapper userMapper;@GetMapping("/findAll")ResponseEntity<List<User>> findAllUser(){List<User> list = userMapper.selectUserList();return ResponseEntity.status(HttpStatus.OK).body(list);}@GetMapping("/findById/{id}")ResponseEntity<User> findById(@PathVariable("id") Integer id){if(id==null || id<1){return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();}User user = userMapper.findById(id);if(user == null){return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}return ResponseEntity.status(HttpStatus.OK).body(user);}@PostMapping("/save")public ResponseEntity<String> save(@RequestBody User user){if(user==null){return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();}Integer count = userMapper.save(user);if(count == null || count == 0){return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();}if(count > 0){return ResponseEntity.status(HttpStatus.CREATED).body("添加新用户信息成功!");}else{return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("添加新用户信息失败!");}}@PutMapping("/update")public ResponseEntity<String> update(@RequestBody User user){if(user==null){return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();}Integer count = userMapper.update(user);if(count == null || count == 0){return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();}if(count > 0){return ResponseEntity.status(HttpStatus.OK).body("修改用户信息成功!");}else{return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("修改用户信息失败!");}}@DeleteMapping("/delete/{id}")ResponseEntity<String> delete(@PathVariable("id") Integer id){if(id == null || id < 1){return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();}Integer count = userMapper.delete(id);if(count == null || count == 0){return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}if(count > 0){return ResponseEntity.status(HttpStatus.OK).body("删除用户信息成功!");}else{return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("删除用户信息失败!");}}}

9、SpringBootMyBatisApplication启动类

package com.study.springboot_mybatis;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
//扫描basePackages下的mapper接口,并创建代理对象
@MapperScan(basePackages = {"com.study.springboot_mybatis.mapper"})
public class SpringbootMybatisApplication {public static void main(String[] args) {SpringApplication.run(SpringbootMybatisApplication.class, args);}}

10、使用Postman进行测试

  •  根据UserController类中的方法逐个进行测试

1、findAll():查找全部 

 2、findById:通过ID进行查找 

3、save:添加新用户

 4、update:修改用户信息

通过ID指定用户,修改任一信息,下列是修改 id=4 的用户的 roles 为4

 5、delete:删除用户

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第98题验证二叉搜索树

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isValid(struct TreeNode * root,long left,long right){if(!root){return true;}long…

一个超级简单的Python UI库:NiceGUI

大家好&#xff0c;图形用户界面&#xff08;GUI&#xff09;的开发往往被看作是一项复杂且繁琐的任务。Python作为一门强大的编程语言&#xff0c;提供了许多优秀的库来帮助开发者实现这一目标。今天&#xff0c;我们将介绍一个名为NiceGUI的库&#xff0c;它能帮助你轻松构建…

Science Robotics 封面论文:一种使用半球形纳米线阵列实现机器人视觉的超宽视场针孔复眼

研究背景 从生物复眼中汲取灵感&#xff0c;拥有一系列生动多样视觉功能特征的人工视觉系统最近脱颖而出。然而&#xff0c;这些人工系统中的大多数都依赖于可转换的电子设备&#xff0c;这些电子设备受到全局变形的复杂性和受限几何形状的影响&#xff0c;以及光学和探测器单元…

好的架构是进化来的,不是设计来的

很多年前&#xff0c;读了子柳老师的《淘宝技术这十年》。这本书成为了我的架构启蒙书&#xff0c;书中的一句话像种子一样深埋在我的脑海里&#xff1a;“好的架构是进化来的&#xff0c;不是设计来的”。 2015 年&#xff0c;我加入神州专车订单研发团队&#xff0c;亲历了专…

Wav2Vec 2.0:语音表示自监督学习框架

Wav2Vec 2.0是目前自动语音识别的模型之一。 Wav2Vec 2.0 代表了无监督预训练技术在语音识别领域的重大进步。这些方法通过直接从原始音频中学习&#xff0c;无需人工标记&#xff0c;因此可以有效利用大量未标记的语音数据集。相比于传统的监督学习数据集通常只有大约几百小时…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于改进Q学习算法和组合模型的超短期电力负荷预测》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Cookie 和 Session概念及相关API

目录 1.Cookie概念 2.理解会话机制 (Session) 3.相关API 3.1HttpServletRequest 3.2HttpServletResponse 3.3HttpSession 3.4Cookie 4.代码示例: 实现用户登陆 1.Cookie概念 Cookie 是存储在用户本地终端&#xff08;如计算机、手机等&#xff09;上的数据片段。 它…

反射获取或修改对象属性的值

利用反射既可以获取也可以写入&#xff0c;首先咱们先写几个获取的例子。 一&#xff1a;利用反射修改各数据(利用resultField.set修改) 首先定义实体类 public class Dog {private String dogUser;private int age;把DogUser的"hahaha"改为"geggegegege&quo…

LiveGBS流媒体平台GB/T28181用户手册-版本信息:查看机器码、切换查看流媒体服务

LiveGBS流媒体平台GB/T28181用户手册--版本信息:查看机器码、切换查看流媒体服务 1、版本信息1.1、查看机器码1.2、多个流媒体服务1.3、提交激活 2、搭建GB28181视频直播平台 1、版本信息 版本信息页面&#xff0c;可以查看到信令服务 流媒体服务相关信息&#xff0c;包含硬件…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

小程序丨数据功能如何使用

查询发布完成后&#xff0c;如发现信息有误或想要修改信息&#xff0c;老师可以使用数据功能在线修改已发布的查询内容。 数据功能包含导出、添加、编辑、更多操作&#xff0c;下面来教大家如何使用吧。 &#x1f4cc;使用教程 数据功能主要用于在线修改已发布的查询内容&#…

C语言 | Leetcode C语言题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; struct TreeNode* helper(int* nums, int left, int right) {if (left > right) {return NULL;}// 选择任意一个中间位置数字作为根节点int mid (left right rand() % 2) / 2;struct TreeNode* root (struct TreeNode*)malloc(sizeo…

ElasticSearch IK分词器的安装、词典扩展与停用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;云原生与服务部署-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 ​编辑 1. 前言 2. IK分词器安装 3. IK分词器词典扩展与停用 4. 总…

汽车整车检测的原由(北重试验平台制造厂家)

汽车整车检测是指对整车系统和构造各部分的性能、可靠性、安全性等方面进行全面检查和评估的过程。它是在汽车生产制造和销售使用环节中&#xff0c;为了保障驾驶安全和质量而必不可少的一项检测和评估工作。 1. 提升行车安全 汽车整车检测能够全面评估车辆的性能和安全性&…

音视频-常用的分析工具介绍-连续补充

目录 1&#xff1a;Audacity 2&#xff1a;MediaInfo 3&#xff1a;MP4Box 4&#xff1a;hexinator 5&#xff1a;Adobe Audition 6&#xff1a;VideoEye 7&#xff1a;YUVplayer &#xff08;YUV/RGB播放器&#xff09; 在做音视频分析时&#xff0c;经常用到各种分析工…

【有手就行】使用你自己的声音做语音合成,CPU都能跑,亲测有效

此文介绍在百度飞桨上一个公开的案例&#xff0c;亲测有效。 厌倦了前篇一律的TTS音色了吗&#xff1f;打开短视频听来听去就是那几个声音&#xff0c;快来试试使用你自己的声音来做语音合成吧&#xff01;本教程非常简单&#xff0c;只需要你能够上传自己的音频数据就可以(建议…

OpenLayers中实现对ImageStatic图层的扩展以支持平铺WrapX功能

地图平铺技术概述 地图平铺&#xff08;Tiling&#xff09;是一种将大尺寸地图数据分割成小块&#xff08;瓦片&#xff09;的技术&#xff0c;这在地图服务中非常常见。它使得地图数据能高效加载和展示&#xff0c;尤其适合网络环境。通过仅加载当前视图窗口所需的地图瓦片&a…

SERVER ——查询(二)

目录 5. top 6. null 7. order by 8. 模糊查询&#xff1a; 9. 聚合函数 5. top top查询&#xff1a;查询表的前几行&#xff1b;下面是代码演示&#xff1a; --top&#xff08;前面的几个记录&#xff09; select top 2 * from emp; --查询表的前两列 select top 20 percent *…

MoonDream2微调指南【最小VLM】

在本指南中&#xff0c;我们将探讨如何使用计算机视觉数据集对完全开源的小型视觉语言模型 Moondream2 进行微调&#xff0c;以计数项目&#xff08;这是 GPT-4V 一直表现不一致的任务&#xff09;&#xff0c;并以一种可以依赖输出用于生产应用程序的方式进行微调。 视觉语言…

FFmpeg操作命令 - 精简版

PS&#xff1a;&#xff08;因为我只需要简单的操作&#xff0c;所以我整理出了这份笔记&#xff09; 原网址&#xff1a;30分钟带你入门&#xff0c;20个 FFmpeg操作命令&#xff0c;包你学会 - 知乎 大佬零声Github整理库整理的笔记非常的全面&#xff0c;想看完整版去上面…