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 mapper
        PUBLIC "-//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">
        delete
        from t_user
        where 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 {

    @Autowired
    UserMapper 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:删除用户

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于如何创建一个可配置的 SpringBoot Web 项目的全局异常处理

前情概要 这个问题其实困扰了我一周时间&#xff0c;一周都在 Google 上旅游&#xff0c;我要如何动态的设置 RestControllerAdvice 里面的 basePackages 以及 baseClasses 的值呢&#xff1f;经过一周的时间寻求无果之后打算决定放弃的我终于找到了一些关键的线索。 当然在此…

反射的基本知识

基本概念 反射是java在运行过程中的自我观察能力&#xff0c;通过class constructor field method 四个方法来获取一个类的各个组成部分。 反射是在运行状态中对于任意一个类&#xff0c;都能知道这个类的所有属性和方法&#xff1b;对于任意一个对象都能调用它的任意一个方法…

《MySQL是怎样运行的》快速查询秘籍——B+树索引

一.引出索引 前面一章我们说出了数据页的结构&#xff0c;但是如果我们要查找某一条记录的话&#xff0c;怎么办呢&#xff1f; 我们前面知道页与页之间是一个双向链表实现的&#xff0c;我们要找的话&#xff0c;是不是要按照这个链表一个一个找下去&#xff0c;然后找到&am…

数据链路层简单介绍

mac地址&#xff08;物理地址&#xff09; mac地址和ip地址&#xff0c;目的都是为了区分网络上的不同设备的&#xff0c;在最开始的时候&#xff0c;mac地址和ip地址是两伙人&#xff0c;独立各自提出的&#xff0c;ip地址是4个字节&#xff08;早都不够用了&#xff09;&…

【个人商业画布】你有思考过把自己当成一家公司来经营吗?

商业模式画布(Business Model Canvas)&#xff0c;是亚历山大奥斯特瓦德在《商业模式新生代》中提出的一种用于描述商业模式、可视化商业模式、评估商业模式以及改变商业模式的通用语言。它由9个模块构成&#xff0c;帮助创业者理清为“细分客户提供独有价值”&#xff0c;从而…

PersonalLLM——探索LLM是否能根据五大人格特质重新塑造一个新的角色?

1.概述 近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如ChatGPT&#xff0c;致力于构建能够辅助人类的个性化人工智能代理&#xff0c;这些代理以进行类似人类的对话为重点。在学术领域&#xff0c;尤其是社会科学中&#xff0c;一些研究报告已经…

溪谷联运SDK功能全面解析

近期&#xff0c;备受用户关注的手游联运10.0.0版本上线了&#xff0c;不少用户也选择了版本更新&#xff0c;其中也再次迎来了SDK的更新。溪谷软件和大家一起盘点一下溪谷SDK的功能都有哪些吧。 一、溪谷SDK具有完整的运营功能和高度扩展性 1.登录&#xff1a;登录是SDK最基础…

简述MyBatis中#{}引用和${}引用的区别

各位大佬光临寒舍&#xff0c;希望各位能赏脸给个三连&#xff0c;谢谢各位大佬了&#xff01;&#xff01;&#xff01; 目录 1.有无预编译 优点 缺点 2.SQL执行的快慢 3.能否被SQL注入 4.参数输入方式 5.总结 1.有无预编译 #{}是有预编译的而${}是没有预编译的&…

OceanBase集群如何进行OCP的替换

有OceanBase社区版的用户提出替换 OCP 管控平台的需求。举例来说&#xff0c;之前的OCP平台采用单节点&#xff0c;然而随着OceanBase集群的陆续上线和数量的不断增多&#xff0c;担心单节点的OCP可能面临故障风险&#xff0c;而丧失对OceanBase集群的管控能力。另此外&#xf…

创建vue工程、Vue项目的目录结构、Vue项目-启动、API风格

环境准备 介绍&#xff1a;create-vue是Vue官方提供的最新的脚手架工具&#xff0c;用于快速生成一个工程化的Vue项目create-vue提供如下功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包依赖环境&#xff1a;NodeJS 安装NodeJS 一、 创建vue工程 npm 类…

以Linux为例了解线程

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

IO系列(八) -浅析NIO工作原理

一、简介 现在使用 NIO 的场景越来越多&#xff0c;很多网上的技术框架或多或少的使用 NIO 技术&#xff0c;譬如 Tomcat、Jetty、Netty&#xff0c;学习和掌握 NIO 技术已经不是一个 Java 攻城狮的加分技能&#xff0c;而是一个必备技能。 那什么是 NIO 呢&#xff1f; NIO…

第06章 数据加载、存储与文件格式

以下内容参考自https://github.com/iamseancheney/python_for_data_analysis_2nd_chinese_version/blob/master/%E7%AC%AC05%E7%AB%A0%20pandas%E5%85%A5%E9%97%A8.md 《利用Python进行数据分析第2版》 用以学习和记录。 输入输出通常可以划分为几个大类&#xff1a;读取文本文…

深海奥秘:鳐鱼肽的肌肤之旅

深海&#xff0c;一个神秘又充满生命力的世界&#xff0c;总是带给我们无尽的惊喜。鳐鱼&#xff0c;又被称为“魔鬼鱼”&#xff0c;它的皮肤中含有一种特殊的肽&#xff0c;这种肽不仅分子量适中&#xff0c;易于人体吸收&#xff0c;还具有极高的消化率和生物利用度。来自北…

科技引领乡村振兴新潮流:运用现代信息技术手段,提升农业生产和乡村管理效率,打造智慧化、现代化的美丽乡村

一、引言 随着科技的不断进步&#xff0c;现代信息技术已经渗透到社会的各个领域&#xff0c;成为推动社会发展的重要力量。在乡村振兴战略的背景下&#xff0c;科技的力量同样不容忽视。本文旨在探讨如何运用现代信息技术手段&#xff0c;提升农业生产和乡村管理效率&#xf…

Android软件渲染流程

Android软件渲染流程 一.渲染流程1.VSync信号的监听2.VSync信号触发绘制 二.渲染原理1.画布的获取1.1 渲染缓存的初始化1.2 graphics::Canvas的创建1.3 graphics::Canvas与渲染缓存的绑定1.3.1 SkBitmap的初始化1.3.2 SkiaCanvas与SkBitmap的绑定1.3.3 SkCanvas的创建 2.矩形的…

Transformer系列专题(二)——multi-headed多头注意力机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是multi-headed&#xff08;多头注意力机制&#xff09;二、multi-headed三、multi-headed结果四、堆叠多层总结 前言 在实践中&#xff0c;当给定相同…

【数据库基础】基本认识数据库--入门引导

文章目录 什么是数据库&#xff1f;主流数据库基本使用安装MySQL连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL架构SQL语句分类什么叫存储引擎 什么是数据库&#xff1f; 数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或…

分布式异步框架celery + Redis 安装配置

引入 这里不对web框架做过多说明&#xff0c;到时候在总结一篇 python的常见web框架 django、flask、tornado、sanic、fastapi..各框架区别 - 内部集成功能的多少 django&#xff0c;内部提供了很多组件。 【相对大】flask、tornado、sanic、fastapi… 本身自己功能很少第…

Linux c开发线程锁和条件变量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("线程等待唤醒,锁定互斥量...\n");…