MyBatisPlus 之一:Spring 整合 MyBatisPlus 及雪花算法

news2025/1/13 15:53:20

1. Mybatis-Plus简介

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考https://mp.baomidou.com/。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

2. Spring整合Mybatis-Plus

正如官方所说,mybatis-plus 在 mybatis 的基础上只做增强不做改变,因此其与 spring 的整合亦非常简单。

只需把 mybatis 的依赖换成 mybatis-plus 的依赖,再把 sqlSessionFactory 换成 mybatis-plus 的即可。

注意: 实际应用中,更多的是 SpringBoot 整合 MyBatis-Plus 相对较少。

1) 配置 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring_mybatisplus</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <java.version>11</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.5</version>
        </dependency>
        <!--MyBatis-Plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <!--用于配置连接池数据源-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!--用于spring集成测试-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.5</version>
        </dependency>
        <!--打印SQL日志需要-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!--只能在test目录下才能使用-->
            <!--            <scope>test</scope>-->
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2) db.properties

连接数据库的配置信息,以 MySQL8 为例。

resources/目录下:

url=jdbc:mysql://127.0.0.1:3306/wdzldb?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
driver=com.mysql.cj.jdbc.Driver
dbuname=root
password=root

3) log4j.properties

如果需要打印输出执行过程中的 SQL 日志,配置 log4j

需要下面配置

指定自己的包名:log4j.logger.com.wdzl=debug

其他全局的配置:log4j.rootLogger=warn, stdout

# Global logging configuration  debug  info warn  error 
log4j.rootLogger=warn, stdout
# MyBatis logging configuration...
log4j.logger.org.apache.ibatis=debug

## MySelf Package
log4j.logger.com.wdzl=debug
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.Target=System.out
#log4j.appender.stdout.layout.ConversionPattern=%5p %d [%t] - %m%n
log4j.appender.stdout.layout.ConversionPattern=%3p - %m%n

4) spring-mybatis.xml

整合配置基本顺序:数据源-->--SessionFactory-->--Dao

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--配置连接数据库的属性文件-->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!-- DataSource: URL Driver Username Password -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${dbuname}"/>
        <property name="password" value="${password}"/>
    </bean>
    <!-- SessionFactory 注意这里所在包,和之前mybatis整合不同。同时,plus 版本不同,这个类位置也有不同 -->
    <bean id="sessionFactory"
          class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="com.wdzl.pojo"/>
    </bean>
    <!-- Dao -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描基包下的所有的接口,生成对应的实现代理对象-->
        <property name="basePackage" value="com.wdzl.dao" />
        <property name="sqlSessionFactoryBeanName"
                  value="sessionFactory"></property>
    </bean>

    <!--注意 启动注解扫描  注意 -->
    <context:component-scan base-package="com.wdzl"/>
</beans>

注意:

SessionFactoy 不是 spring+mybatis 整合时的工厂bean;

com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean

5) 编写 pojo 类

// 驼峰命名的属性,默认生成sql字段时,会变成 book_Id 需要映射

  • @TableId("bookid")

  • 如果数据库表主键自增的,则不添加此@TableId 注解,执行insert 时,是可以的

    但是通过主键查询时,会出现 where null=? 问题。

  • 所以需要配置@TableId

  • 配置注解后的问题

    • 1.不指定 type type = IdType.NONE ,自己设置主键。如果不给主键,默认指定long的唯一主键
    • 2.type = IdType.AUTO : 数据库指定主键。保存时给主键与否,都会采用数据库自增策略
    • 3.ASSIGN_ID 等同NONE : 程序指定主键
      • a.手动设置有值,则使用设置的主键
      • b.如果没有指定,则框架默认使用雪花算法生成主键
/**
 *
 */
@Data
@TableName("Book")
public class Book {

    @TableId(value = "bookid",type = IdType.ASSIGN_ID)
//    @TableField("bookid")//注意:使用TabelId后,@TableField同时使用无效
    private Integer bookId;

    @TableField("bookName")
    private String bookName;

    private String author;

    @TableField("pubDate")   // @TableField 可以设置忽略 exist=true 
    private Date pubDate;

    private Float price;
}

6) DAO接口

注意:

  • @Repository 注解
  • BaseMapper<Book> 泛型
@Repository
public interface IBookDao extends BaseMapper<Book> {
}

只需要自定义接口继承 BaseMapper 接口同时指定泛型即可。

7) 使用测试

需要依赖 Junit4 以上版本和 spring-test

注意:junit 依赖配置

<dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
            <!--只能在test目录下才能使用-->
            <!--<scope>test</scope>-->
</dependency>

测试用例代码:

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.wdzl.dao.IBookDao;
import com.wdzl.pojo.Book;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class BookService {

    @Autowired
    private IBookDao bookDao;

    @Test
    public void get(){
        Book book = bookDao.selectById(26);
        System.out.println(book);
    }

    @Test
    public void findAll(){
        bookDao.selectList(null).forEach(System.out::println);
    }
    @Test
    public void findByMap(){
        Map<String,Object> map = new HashMap<>();
        map.put("author","张宇昂");
        map.put("bookName","JavaEE框架");
        map.put("price",45f);

        // 转为等值条件查询
        bookDao.selectByMap(map).forEach(System.out::println);
    }

    @Test
    public void findByWrapper(){
        QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
        //选择要查询的列
        queryWrapper.select("bookname","price","author");
        //指定条件
        queryWrapper.ge("price",10);
        queryWrapper.le("price",100);
        queryWrapper.like("bookname","%Java%");
        queryWrapper.in("bookid",23,4,5,63);
        queryWrapper.between("price",23,89);

        bookDao.selectList(queryWrapper);
    }

    @Test
    public void findByIdList(){
        List<Integer> integers = Arrays.asList(23, 26, 47);
        bookDao.selectBatchIds(integers).forEach(System.out::println);
    }

    @Test
    public void insert(){
        Book book = new Book();
//        book.setBookId(49);
        book.setBookName("JavaEE框架");
        book.setAuthor("张宇昂");
        book.setPrice(45f);
        book.setPubDate(new Date());

        int insert = bookDao.insert(book);
        //插入成功后,默认可以自动获取主键
        System.out.println(insert+"==="+book.getBookId());
    }
}

8) 雪花算法

简介:

SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的

分布式ID的特点

全局唯一性:不能出现有重复的ID标识,这是基本要求。

递增性:确保生成ID对于用户或业务是递增的。

高可用性:确保任何时候都能生成正确的ID。

高性能性:在高并发的环境下依然表现良好。

分布式ID的常见解决方案
UUID

Java自带的生成一串唯一随机36位字符串(32个字符串+4个“-”)的算法。它可以保证唯一性,且据说够用N亿年,但是其业务可读性差,无法有序递增。

SnowFlake

今天的主角雪花算法,它是Twitter开源的由64位整数组成分布式ID,性能较高,并且在单机上递增

组成部分(64bit)

1.第一位 占用1bit,其值始终是0,没有实际作用。

2.时间戳 占用41bit,精确到毫秒,总共可以容纳约69年的时间。

3.工作机器id 占用10bit,其中高位5bit是数据中心ID,低位5bit是工作节点ID,做多可以容纳1024个节点。

4.序列号 占用12bit,每个节点每毫秒0开始不断累加,最多可以累加到4095,一共可以产生4096个ID。

SnowFlake算法在同一毫秒内最多可以生成多少个全局唯一ID呢:

: \同一毫秒的ID数量 = 1024 X 4096 = 4194304**

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

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

相关文章

腾讯云有免费服务器吗?在哪领取?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

力扣经典题:删除字符使字符串变好

char* makeFancyString(char* s) {int sizestrlen(s);char*arr(char*)malloc(sizeof(char)*size1);if(size<3){return s;}arr[0]s[0];arr[1]s[1];int p2;for(int j2;j<size;j){if(s[j]!s[j-1]||s[j]!s[j-2]){arr[p]s[j];p;}}arr[p]\0;return arr; } 此代码的细节很多&am…

小车倒立摆系统能控和能观性分析

一、能控性 系统的能控性&#xff08;Controllability&#xff09;是控制理论中的一个基本概念&#xff0c;它描述了系统状态是否能够在有限时间内&#xff0c;通过适当设计的输入&#xff08;或控制信号&#xff09;&#xff0c;从任何初始状态转移到任何期望的最终状态。如果…

无人机自动返航算法实现与优化

一、引言 随着无人机技术的快速发展&#xff0c;其在航拍、农业、救援等领域的应用越来越广泛。在这些应用中&#xff0c;无人机的自动返航功能显得尤为重要。一旦无人机失去控制或与遥控器失去连接&#xff0c;自动返航算法能够确保无人机安全返回起飞点&#xff0c;避免损失和…

Python爬取淘宝商品评价信息实战

文章目录 一、分析需要爬取的页面二、实现爬取商品评价信息的代码1、通过解析显示评价信息的元素获取商品评价信息2、通过mitmproxy代理进行流量抓包获取商品评价信息 三、附-完整代码 前期出了一个《爬取京东商品评价信息实战》的教程&#xff0c;最近又有网友提到要出一个爬淘…

解决google Chorme 隐私设置错误

问题&#xff1a; 我们在使用浏览器的时候&#xff0c;出现隐私设置错误“您的链接不是私密连接”&#xff0c;如下图所示&#xff1a; 第一步开始来解决隐私设置错误&#xff0c;打开浏览器之后&#xff0c;点击右上方的三点图标&#xff0c;选择设置&#xff0c;如下图所示&…

24考研数学最大教训❗️660/880过时了?

我没看错吧&#xff0c;说660题和880题过时了&#xff1f; 660题和880题好好用&#xff0c;这俩很经典不会过时。 660题是客观题训练必刷的一本题集&#xff0c;而880是强化阶段非常好的一本综合性题集。我本身在考研的时候使用的也是这两本题集&#xff0c;所以对这两本题集…

Nginx部署项目,上传文件报错413,如何解决?

报错场景 我搭建的wordpress&#xff0c;上传主题无法上传&#xff0c;报错413 解决思路 报错413是因为Nginx对上传大小做了限制&#xff08;Nginx默认限制上传大小为1MB&#xff09;&#xff0c;所以我们需要通过修改配置文件的方式来去除这个限制&#xff0c;或者说是提高这…

el-dialog弹框遮罩层问题

先看一下出现的bug&#xff0c;点击按钮出现弹框的时候&#xff0c;遮罩层出现在弹框上层&#xff0c;不知道是那个同事写的全局样式影响的&#xff0c;这个时候我们需要在el-dialog标签上添加一个属性就行 :modal-append-to-body“false” 下图是出现的问题&#xff0c;遮罩层…

SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)

文章目录 1.整合MyBatis1.需求分析2.数据库表设计3.数据库环境配置1.新建maven项目2.pom.xml 引入依赖3.application.yml 配置数据源4.Application.java 编写启动类5.测试6.配置类切换druid数据源7.测试数据源是否成功切换 4.Mybatis基础配置1.编写映射表的bean2.MonsterMapper…

PHP序列化基础知识储备

一、序列化与反序列化 1、概念 PHP中的序列化是指将复杂的数据类型转换为可存储或可传输的字符串&#xff0c;而反序列化则是将这些字符串重新转换回原来的数据类型。 序列化通常使用 serialize() 函数完成&#xff0c;它可以将数组、对象、字符串等复杂数据类型压缩到一个字…

m3u8,一个超酷的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - m3u8。 Github地址&#xff1a;https://github.com/globocom/m3u8 在网络视频传输中&#xff0c;HLS&#xff08;HTTP Live Streaming&#xff09;是一…

后端系统开发之——创建SpringBoot工程

原文地址&#xff1a;后端框架系统开发之——创建SpringBoot工程 - Pleasure的博客 下面是正文内容&#xff1a; 前言 现在的市场环境&#xff0c;如果你单单只是作为前端工程师或者是后端工程师&#xff0c;在开发Web应用的时候都需要去读取企业提供的接口文档。而当你前后端…

python--剑指offer--中等--07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如&#xff0c;给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a; 3/ 9 20 / 15 7 …

数字后端 EDA 软件分享

数字后端 EDA 软件分享 推荐这几家的EDA工具吧&#xff0c;虽说我也支持国产工具&#xff0c;但是我还是选择了这几家的工具 apache cadence mentor synopsys 下图我现在用的eda环境&#xff0c;利用网上的资源&#xff0c;自己独立在vmware上搭建好的EDA环境 除去pdk&#…

mybatis项目中配置sql提示

2023版的idea好像内置了这个功能。 第一步&#xff1a; 第二步&#xff1a;第一步完成后user会爆红&#xff0c;这时我们需要连接数据库。

AI预测-一文解析AI预测数据工程

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

Mock 测试入门:什么是 Mock 测试

Mock测试 什么是 Mock &#xff1f; Mock 的意思就是&#xff0c;当你很难拿到源数据时&#xff0c;你可以使用某些手段&#xff0c;去获取到跟源数据相似的假数据&#xff0c;拿着这些假数据&#xff0c;前端可以先行开发&#xff0c;而不需要等待后端给了数据后再开发。 Mo…

【Spark编程基础】RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作&#xff1b; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

2024年5家香港服务器推荐,性价比top5

​​香港服务器是中小企业建站、外贸建站、个人博客建站等领域非常受欢迎的服务器&#xff0c;2024年有哪些云厂商的香港服务器是比较有性价比的&#xff1f;这里根据小编在IT领域多年服务器使用经验&#xff0c;给大家罗列5家心目中最具性价比的香港服务器厂商。 这五家香港服…