【开发】Spring整合MyBatis、MyBatisPlus

目录

前言

Spring整合MyBatis

1. 在项目中的pom.xml中导入MyBatis和Spring相关的依赖:

2. 配置数据源

3. 编写实体类

4. 编写API接口

5. 编写单元测试方法(业务)

 Spring整合MyBatis-Plus

1. 在项目中导入依赖:

2. 配置数据源

3. 编写实体类

4. 编写API接口与编写单元测试方法(业务)


前言

什么是MyBatis?

  • MyBatis是一个开源、轻量级的数据持久型框架,是JDBCHibernate的替代方案。

为什么使用MyBatis?

  • MyBatis内部封装了JDBC,简化了加载驱动、创建连接、创建statement等繁杂的过程,开发者只需要关注SQL语句本身。

Spring怎么整合MyBatis?

  • 如下文所示

什么是MyBatis-Plus?

  • MyBatis-Plus简称MP,是MyBatis的增强工具,在MyBatis的基础上扩展了许多实用的功能。

为什么使用MyBatis-Plus?

  1. 简化CRUD操作:MP提供了丰富的内置方法,可以通过简单的方法调用完成常见的CRUD(创建、读取、更新、删除)操作,无需手动编写SQL语句。
  2. 条件构造器:MP提供了强大的条件构造器,可以通过API的方式灵活地拼接查询条件,支持链式调用,使得复杂的查询条件更加可控和易于维护。
  3. 分页查询:支持快速、简单地进行分页查询,减少手动编写分页SQL的复杂性,提高了开发效率。
  4. 逻辑删除:MP支持逻辑删除,通过注解配置的方式可以轻松实现逻辑删除的功能,避免在业务代码中手动处理逻辑删除的逻辑。
  5. 乐观锁和数据权限:对乐观锁和数据权限提供了良好的支持,简化了相关的操作和配置。

Spring怎么整合MyBatis-Plus?

  • 如下文第二章所示

Spring整合MyBatis

1. 在项目中的pom.xml中导入MyBatis和Spring相关的依赖:

MySQL的依赖坐标: 

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>

MyBatis的依赖坐标:

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>

Lombok的依赖坐标:导入后,自动生成实体类的get、set、无参构造方法和有参构造方法,方便快速搭建项目(多数情况下会导致编译器“报红”,影响开发者对“异常”信息的捕捉

注:使用此Java库,IDEA、Eclipse需要安装Lombok插件,启用注解处理功能或添加配置。

相关搜索:Lombok在IDEA中的使用        Eclipse使用Lombok

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
        </dependency>

Junit的依赖坐标:在项目开发过程中用于“单元测试”某个接口API的逻辑正确性,避免造成过大损失

       <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

2. 配置数据源

在MyBatis的配置文件(一般为 mybatis.xml 或 mybatis-config.xml 文件)中配置全局设置、数据源、映射器等信息

jdbc.properties文件: 

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/2003db?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=123456

mybatis-config.xml文件: 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--开启全局配置-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>


    <!--开发模式-->
    <environments default="env">
        <environment id="env">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--映射器注册-->
    <mappers>
        <package name="com.ape.dao"/>
    </mappers>
</configuration>

解读:

  • 在这里,我们使用
     <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>开启了驼峰命名和下划线命名的自动转换功能。

        Mybatis自动驼峰映射规范:

  1. 数据库的 stu_id 对应实体类中的 stuId;
  2. 数据库的 stu_name 对应实体类中的 stuName;
  • environments 标签内配置了数据源和环境信息;环境名为 env ,使用JDBC作为事务管理器类型,使用 POOLED 数据源类型,配置MySQL数据库的连接信息(驱动、URL、用户名、密码);
    • <property>标签的value属性中使用${jdbc.username}占位符,引用jdbc.properties文件中的属性值 jdbc.username
      • 通常情况下,我们会将敏感的配置信息存储在外部的配置文件中;
      •  jdbc.properties 存储MySQL的连接信息,这样做的好处是可以在不同环境中使用不同的配置,而不修改MyBatis的配置文件;
  • mappers 标签内注册映射器(Mapper)。使用<package>标签指定Mappper接口所在包路径 com.ape.dao,表示MyBatis会扫描该包下的Mapper接口并注册到MyBatis中;

3. 编写实体类

使用Lombok快速构建

案例:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {

    private int stuId;

    private String stuName;

    private String stuHobby;

    public Student(String stuName, String stuHobby) {
        this.stuName = stuName;
        this.stuHobby = stuHobby;
    }
}

解读:

  • @NoArgsConstructor注解:Lombok注解在编译时自动生成“无参的构造方法”。
  • @AllArgsConstructor注解:自动生成“全参的构造方法”。
  • @Data注解:自动生成“GetterSettertoStringequalshashCode”方法。

4. 编写API接口

案例:

public interface StudentMapper extends BaseMapper<Student> {

    @Select("select * from student")
    public List<Student> findAll();

    @Insert("insert into student (stu_name,stu_hobby) value(#{stuName},#{stuHobby})")
    public void save(Student student);
}

5. 编写单元测试方法(业务)

在 test文件夹下 => java文件夹下 => 创建包 =>在包下创建测试类

案例: 

public class Test01 {
    SqlSession sqlSession = null;
    StudentMapper studentMapper = null;
    InputStream inputStream = null;

    @Before
    public void beforeMethod(){
        try {
            inputStream = Resources.getResourceAsStream("mybatis.xml");
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = sqlSessionFactoryBuilder.build(inputStream);
            sqlSession = factory.openSession(true);//开启事务自动提交
            studentMapper = sqlSession.getMapper(StudentMapper.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @After
    public void afterMethod(){
        try {
            sqlSession.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


     @Test
    public void show1(){
        studentMapper.save(new Student("会诚意","创可贴"));
    }

    @Test
    public void show2(){
        List<Student> all = studentMapper.findAll();
        for (int i = 0; i < all.size(); i++) {
            Student student =  all.get(i);
            System.out.println(student);
        }
    }
}

解读:

  • @Before @After 注解修饰的方法 会分别在每个测试方法(被 @Test 包围的方法)执行前和执行后允许。
  • 案例中@Before注解方法 :获取名为 “mybatis.xml” 的配置文件资源,创建SqlSessionFactorySqlSession以及相应的Mapper对象。
  • 案例中@After注解方法:关闭SqlSession并且关闭输入流。
  • 案例中@Test注解方法:表示它是一个测试方法,在一个测试类中,可以创建多个不同名,但被注解修饰的方法。

 Spring整合MyBatis-Plus

1. 在项目中导入依赖:

MySQL的依赖坐标:

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>

MyBatis-Plus的依赖坐标:

        <!--mybatis plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.1.1</version>
        </dependency>

Junit的依赖坐标:

        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

Lombok的依赖坐标:

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
        </dependency>

2. 配置数据源

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--开启全局配置-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--插件-->
    <plugins>
        <!--mp分页插件-->
        <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"></plugin>
    </plugins>

    <!--开发模式-->
    <environments default="env">
        <environment id="env">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/2307db?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--映射器注册-->
    <mappers>
        <package name="com.apesource.dao"/>
    </mappers>
</configuration>

总结:

  • 除了加入了
    <plugins>
        <!--mp分页插件-->
        <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"></plugin>
    </plugins>
    加入了MyBatis-Plus的分页插件外,其他配置与 Spring 整合 MyBatis 的大差不差。

3. 编写实体类

使用Lombok快速构建:与整合MyBatis不同的是使用了MP的注解

@NoArgsConstructor
@AllArgsConstructor
@Data
@TableName(value = "student")
public class Student {
    @TableId(value = "stu_id",type = IdType.AUTO)
    private int stuId;
    @TableField(value = "stu_name")
    private String stuName;
    @TableField(value = "stu_hobby")
    private String stuHobby;

    public Student(String stuName, String stuHobby) {
        this.stuName = stuName;
        this.stuHobby = stuHobby;
    }
}

解读:

  • @TableName(value = "student"):用于指定实体对应的表名。
  • @TableId(value = "stu_id",type = IdType.AUTO):用于表示主键字段,并且设置了主键自增。
  • @TableField(value = "stu_name") @TableField(value = "stu_hobby"):用于指定实体类字段和数据库表字段的映射关系。将实体类字段 stuName  stuHobby 分别映射到数据库表中的列 stu_name  stu_hobby

4. 编写API接口与编写单元测试方法(业务)

MP是在MyBatis上做了扩展,所以编写接口和编写实现业务和MyBatis差不多,这里不再一一赘述,后面更新MP在这两个方面上对MyBatis的扩展。


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

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

相关文章

电大搜题:开启学习新时代

身处信息化时代&#xff0c;学习的方式已经发生了巨大的变革。在这个多元化的学习环境中&#xff0c;传统的学习模式已经无法满足现代学习者的需求。然而&#xff0c;电大搜题应运而生&#xff0c;为学习者提供了一个高效、便捷的学习途径。 电大搜题&#xff0c;作为黑龙江开…

“智慧农业新篇章:AI大模型引领生态与气象科研的未来“

AI大模型引领未来智慧科研暨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用 以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数…

鸿蒙开发实现弹幕功能

鸿蒙开发实现弹幕功能如下&#xff1a; 弹幕轮播组件&#xff1a;BannerScroll import type { IDanMuInfoList, IDanMuInfoItem } from ../model/DanMuData //定义组件 Component export default struct BannerScroll {//Watch 用来监视状态数据的变化&#xff0c;包括&#…

【Git版本控制系统】:起步

目录 前言 版本控制 集中式与分布式的区别 Windows安装Git 核心 文件状态 工作区域 基本工作流程 配置用户信息 获取帮助 在线资源 前言 本篇文件的环境是Windows环境下实现。 在日常工作中git少不了&#xff0c;所以编写本篇文章介绍Git基础&#xff0c;专栏会不…

【DAY3 3.16】

1.【刷题】 【知识点与思路】 用乘法求余公式&#xff0c;暴力计算最大的m。 ans1,2,6,24,120...。计算这些阶乘的和是否是能被ans其整除&#xff0c;也就是判断&#xff1a; A[1]!%ansA[2]!%ans....A[n]!%ans0 要是不行的话&#xff0c;就输出当前ans对应的阶乘数。 【代码】 …

为什么国外客户在你跟进的过程中“消失”了?

看着别人跟的客户终于下单了&#xff0c;再看看自己的&#xff0c;怎么跟着跟着就没了。很多时候我们的客户就是不知不觉就被我们给跟丢了&#xff0c;因为我们的跟进方法是有问题的&#xff0c;下面给大家一些比较好的跟进方式和思路。 首先要跟进哪些客户&#xff1f; 不是所…

解压即用,2024最简单好用AI开源换脸应用,整合包已备好

软件整合包&#xff1a;点击下载 关键词&#xff1a;#AI换脸 #开源应用 #可视化界面 #实时换脸 #高清修复 #多个模型 #人脸遮挡处理 #模糊修复 #性能优化 #操作简单 总结&#xff1a;本软件是一款2024年最强大、最易用的AI换脸开源应用。该应用界面经过汉化&#xff0c;操作简…

数字万用表 (Digital Multimeter)

数字万用表 [Digital Multimeter] 1. Product parameters2. 交流频率测量3. 面板介绍4. 背光屏References 1. Product parameters 2. 交流频率测量 在交流 750V 档处按 HOLD 键切换到市电频率 3. 面板介绍 4. 背光屏 ​ References [1] Yongqiang Cheng, https://yongqiang…

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

【leetcode-53最大子数组和】

题目&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] …

Java关于物联网消息引擎:EMQ X

1.背景 1、5G 时代&#xff0c;万物互联 随着5G的到来&#xff0c;万物互联已经成为现实&#xff0c;物联网行业得以蓬勃发展&#xff0c;催生了很多的应用&#xff0c;比如&#xff1a;物联网pass平台&#xff0c;车联网&#xff0c;面向云平台的IOT-Hub&#xff0c;NB-IoT蜂…

更安全的C gets()和str* 以及fgets和strcspn的用法

#include <stdio.h>int main() {char *str;gets(str);puts(str);return(0); }可以说全是错误 首先char *str没有指向一个分配好的地址&#xff0c;就直接读入&#xff0c;危险 ps: 怎么理解char *str "Hello World" 是将一个存储在一个只读的数据段中字符串常…

进程学习--02

在C语言中&#xff0c;一般使用fork函数开辟进程&#xff0c;这个函数开辟进程后会返回一个进程号&#xff0c;在子进程中会返回0&#xff0c;在父进程中会返回子进程的进程号。 int main(){int ret fork();if(ret<0){fprintf(stderr, "pid error");exit(-1);}e…

【嵌入式实践】【芝麻】【硬件篇-4】从0到1给电动车添加指纹锁:IO电路简单介绍

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

linux最佳入门(笔记)

1、内核的主要功能 2、常用命令 3、通配符&#xff1a;这个在一些启动文件中很常见 4、输入/输出重定向 意思就是将结果输出到别的地方&#xff0c;例如&#xff1a;ls标准会输出文件&#xff0c;默认是输出到屏幕&#xff0c;但是用>dir后&#xff0c;是将结果输出到dir文…

基于springboot+vue实现艺术水平考级报名系统【项目源码+论文说明】计算机毕业设计

基于springbootvue实现艺术水平考级报名系统演示 摘要 本次毕业设计基于SpringBoot框架开发了一款艺术水平考级报名管理系统。该系统为考生提供了线上报名、准考证管理等核心功能&#xff0c;并为系统管理员提供了在线发布考试信息、对报名考生进行审核等管理功能。通过该系统…

一文搞懂PCL中自定义点云类型的构建与函数使用

上周猛男快乐开发时遇到个bug&#xff0c;要用pcl的函数对自定义的点云进行处理。一起解决问题时遇到了很多问题&#xff0c;解决后整理出来分享给各位参考&#xff0c;以免踩一样的坑&#x1f60a;。文章中自定义的点我用PointT来表示&#xff0c;自定义点云一般指的是pcl::Po…

SaaS智慧校园管理平台,智能电子班牌源码,智慧校园建设方案

电子班牌是什么&#xff1f; 电子班牌是一种智能交互终端&#xff0c;电子班牌可以解决“走班教学”考勤管理问题&#xff0c;将大数据、物联网和人工智能等新兴技术和教学管理工作融合&#xff0c;提升学校管理水平和管理效率。 电子班牌是在学校各教室门口安装高清可视化和具…

实验室管理系统 |基于springboot框架+ Mysql+JSP技术+Tomcat的实验室管理系统 设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 用户后台功能模块 用户后台管理 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunw…

论文阅读FCN-Transformer Feature Fusion for PolypSegmentation

本文提出了一种名为Fully Convolutional Branch-TransFormer (FCBFormer)的图像分割框架。该架构旨在结合Transformer和全卷积网络&#xff08;FCN&#xff09;的优势&#xff0c;以提高结肠镜图像中息肉的检测和分类准确性。 1&#xff0c;框架结构&#xff1a; 模型采用双分…