MybatisPlus自定义SQL用法

1、功能概述?

MybatisPlus框架提供了BaseMapper接口供我们使用,大大的方便了我们的基础开发,但是BaseMapper中提供的方法很多情况下不够用,这个时候我们依旧需要自定义SQL,也就是跟mybatis的用法相同,自定义xml映射文件。

本案例提供了三种比较经典的操作:查询全部数据/QueryWrapper使用方式/模糊查询

2、MyBatis-Plus概述

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

【技术储备】

拥有 Java 开发环境以及相应 IDE

熟悉 Spring Boot

熟悉 Maven

2.1、Mybatis-plus特性

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

损耗小:启动即会自动注入基本 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.2、数据库支持

任何能使用 MyBatis 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持。

MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift

达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库,星瑞格数据库

3、创建MybatisPlus -查询全部数据

3.1、工程结构

3.2、在IDEA中选择默认配置

选择默认的springboot配置+Lombok+mysql

3.3、工程的pom.xml文件

主要的包信息:springboot2.7.16+ mybatis-plus-boot-starter3.5.3.2+ mysql-connector-java5.1.42

<?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.7.16</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>mybatisplussql</artifactId><version>0.0.1-SNAPSHOT</version><name>mybatisplussql</name><description>mybatisplussql</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</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>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.42</version></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><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources></build></project>

3.4、创建数据库和表信息

CREATE DATABASE mybatisplus;USE mybatisplus;CREATE TABLE student(stu_id VARCHAR(50),stu_name VARCHAR(30),stu_sex VARCHAR(2),stu_age VARCHAR(4),stu_addr VARCHAR(50),stu_pwd VARCHAR(50))DEFAULT CHARSET=utf8;INSERT INTO student VALUES('1001','晓春','男','33','安徽合肥','1001');INSERT INTO student VALUES('1002','陈平安','男','18','安徽合肥','1002');

3.5、application.yml配置信息

主要配置数据库连接和修改mybatisplus默认配置信息:

log-impl控制台打印出mybatis执行时的具体sql、查询条件、返回值等

map-underscore-to-camel-casemybatisplus在查询数据库的时候回默认的开启数据库下划线驼峰命名转化,我们需要关闭。

spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatisplususername: rootpassword: 123456
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: false# 配置在src/main/java classpath:/com/*/*/mapper/*Mapper.xml# 配置在resource classpath:/mapper/**.xmlmapper-locations: classpath:/com/*/*/mapper/**.xml

3.6、创建bean对象

@TableId("stu_id")该属性如果不写,会导致mybatisplus中根据id查询数据的方法无法使用。

@TableName("student"):如果类名与表明相同,该属性可以不写

@Data
@AllArgsConstructor
@NoArgsConstructor
//定义映射数据表明,如果名称相同可以不写
@TableName("student")
public class Student {//定义student表主键@TableId("stu_id")private String stu_id;private String stu_name;private String stu_sex;private String stu_age;private String stu_addr;private String stu_pwd;
}

3.7、创建Mapper映射文件

MybatisPlus默认的配置文件是放在Resources下的mapper文件中。我们通过配置放在src目录下

具体配置在application.yml文件中:

mapper-locations: classpath:/com/*/*/mapper/**.xml

<?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.example.mybatisplussql.mapper.StudentMapper"><select id="findAll" resultType="com.example.mybatisplussql.bean.Student">select * from student</select>
</mapper>

3.8、映射文件配置注意点

如果映射文件配置在src的目录下,需要在pom文件中配置xml文件放行

<build >
<resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources>
</build>

3.9、创建mapper接口

我们在创建接口的时候,需要遵循一些规范,规范如下:

规范1、接口的方法名称与映射文件中的id相同

规范2、接口的传入参数类型与parameterType相同,没有传入参数不写。

规范3、接口的传输参数类型与resultType类型相同,resultType中只写单条数据的数据类型。

规范4、映射文件的namespace与接口的全限定名称相同。

public interface StudentMapper extends BaseMapper<Student> {
public  List<Student>  findAll();
}

3.10、在启动类中配置扫描mapper文件

@SpringBootApplication
@MapperScan("com.example.mybatisplussql.mapper")
public class MybatisplussqlApplication {public static void main(String[] args) {SpringApplication.run(MybatisplussqlApplication.class, args);}
}

3.11、创建测试类

我这个地方的测试类直接使用的是springmvc进行测试,返回json类型的数据

@Controller
public class StudentController {@Autowired(required = false)StudentMapper studentMapper;@RequestMapping("/findAll")@ResponseBodypublic List<Student> findAll(){List<Student> list= studentMapper.findAll();return list;}
}

3.12、返回值信息信息如下

4、MybatisPlus中QueryWrapper使用方式

其他配置使用上面的即可

我们可以通过QueryWrapper定义我们需要的条件查询,映射文件中程序通过ew.customSqlSegment获取数据。

说明:本案例的优点在于,mybatisplus可以通过QueryWrapper中定义的参数,生成动态SQL

4.1、在StudentMapper.xml中创建查询

<?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.example.mybatisplussql.mapper.StudentMapper">
<select id="findStudentByWrapper" resultType="com.example.mybatisplussql.bean.Student">select * from student ${ew.customSqlSegment}</select>
</mapper>

4.2、在StudentMapper.java中创建接口

public interface StudentMapper extends BaseMapper<Student> {public List<Student> findStudentByWrapper(@Param(Constants.WRAPPER) QueryWrapper<Student> queryWrapper);
}

4.3、创建测试程序

QueryWrapper.eq:表示精准检索 

QueryWrapper.like:表示模糊检索

@Controller
public class StudentController {@Autowired(required = false)StudentMapper studentMapper;@RequestMapping("/findStudentByWrapper")@ResponseBodypublic List<Student> findStudentByWrapper(){QueryWrapper wrapper = new QueryWrapper<Student>().eq("stu_id", "1001").like("stu_name", "晓春").eq("stu_sex","男");List<Student> list = studentMapper.findStudentByWrapper(wrapper);return list;}
}

4.4、测试后,后台SQL语句生成如下

从这个生成的语句可以看出,由于我们在QueryWrapper中给了三个条件,SQL生成中的where后就是三个条件。

4.5、浏览器返回值

5、根据姓名模糊查询信息

5.1、在StudentMapper.xml中创建查询

<?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.example.mybatisplussql.mapper.StudentMapper"><select id="findStudentByName" parameterType="student" resultType="student">select *from studentwhere stu_name like concat('%',#{stu_name},'%')</select></mapper>

5.2、在StudentMapper.java中创建接口

public interface StudentMapper extends BaseMapper<Student> {//根据stu_name模糊查询数据public List<Student> findStudentByName(Student stu);
}

5.3、创建测试程序

@Controller
public class StudentController {@Autowired(required = false)StudentMapper studentMapper;@RequestMapping("/findStudentByName")@ResponseBodypublic List<Student> findStudentByName(){Student stu=new Student();stu.setStu_name("晓春");List<Student> list = studentMapper.findStudentByName(stu);return list;}
}

5.4、测试后,后台SQL语句

5.5、浏览器请求返回值

6、源码下载

源码下载地址:源码是vip资源,介意不要点 

https://download.csdn.net/download/tangshiyilang/88380147

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

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

相关文章

lv5 嵌入式开发-8 内存映射

目录 1 内存映射基本使用 1.1 内存映射概念 1.2 内存映射的使用 2 共享内存&#xff08;古老的 System V IPC&#xff09; 2.1 基本概念 2.2 共享内存使用步骤 2.3 共享内存使用 掌握&#xff1a;内存映射概念、内存映射使用、内存映射注意事项、了解SYSTEM V 共享内存概…

nodejs+vue中国非物质文化遗产网站设计与实现elementui

前端页面&#xff1a; 导航栏借鉴下面的 1首页&#xff1a;带有一个全屏轮播图和其他的内容 2咨询页&#xff1a;有关中国非物质文化遗产的一些新闻咨询网站对于记录非遗这种无形的、动态的文化资源有着其他技术无可替代的优势。用户可以在该网站浏览、了解和学习非遗文化&…

uni-app:canvas-绘制图形4(获取画布宽高,根据画布宽高进行图形绘制)

效果 代码 var width ; var height ; const query uni.createSelectorQuery(); //获取宽度 query.select(#firstCanvas).fields({ size: true }, (res) > { width res.width; height res.height; }).exec(); console.log(宽度width); console.log(高…

关于Pod的内存使用率一直很高的问题分析

生产环境中在流量高峰期出现pod内存使用率很高&#xff0c;pod批量重启&#xff0c;错误日志中还有OOM相关信息。 查看堆内存的使用值 Pod使用的内存不能直接在pod中通过top命令查看&#xff0c;这种方式看到的是pod所在node的资源使用情况。想查看pod的资源使用情况需要用ku…

SEO的优化教程(百度SEO的介绍和优化)

百度SEO关键字介绍&#xff1a; 百度SEO关键字是指用户在搜索引擎上输入的词语&#xff0c;是搜索引擎了解网站内容和相关性的重要因素。百度SEO关键字可以分为短尾词、中尾词和长尾词&#xff0c;其中长尾词更具有针对性和精准性&#xff0c;更易于获得高质量的流量。蘑菇号-…

【Matplotlib画图】使用Python Matplotlib画三维的子图

文章目录 1. 代码2. 画图效果写在最后 1. 代码 在matlab转过来&#xff0c;之前一直不知道python的写法&#xff0c;以为是像matlab一样返回一个句柄然后在上面添加元素&#xff1b; 其实是应该先创建一个画布&#xff0c;然后再在上面添加子图&#xff0c;然后再使用返回的句…

解决 MyBatis-Plus 中增加修改时,对应时间的更新问题

问题&#xff1a;在添加修改时&#xff0c;对应的 create_time 与 insert_time 不会随着添加修改而自动的更新时间 第一步&#xff1a;首先在对应的属性上&#xff0c;加上以下注解 如果只添加以下注解&#xff0c;在增加或者修改时&#xff0c;可能对应的 LocalDateTime 会出…

基于微信小程序的公交信息在线查询系统小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

支付宝支付模块开发

生成二维码 使用Hutool工具类生成二维码 引入对应的依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.5</version> </dependency><dependency><groupId>com.go…

数码产品数码配件无线键盘等出口欧盟CE-RED认证测试办理

数码产品数码配件无线键盘CE-RED认证测试办理 无线产品CE-RED认证进入东欧市场规定&#xff1a; 在通信终端设备和无线产品在这些/地区合法销售之前&#xff0c;必须按照 RED 指令进行测试&#xff0c;并且还必须提供 CE 标志。无线远程控制产品必须符合 RED 指令的 REDEU 要…

华为云HECS云服务器docker环境下安装nginx

前提&#xff1a;有一台华为云服务器。 华为云HECS云服务器&#xff0c;安装docker环境&#xff0c;查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx查看镜像 dock…

JS对象数组去重

JS对象数组去重 一、数组去重1.使用 new Set()2.使用 indexOf 去重3.使用 includes 去重4.使用 hasOwnProperty5.使用 filter6.使用递归7.利用 Map 数据结构去重8.使用用 reduce includes9.使用 new Set() 的简化 二、对象数组去重1.使用 new Map() 和 filter2.使用reduce3.使…

【JVM】第四篇 垃圾收集器ParNewCMS底层三色标记算法详解

导航 一. 垃圾收集算法详解1. 分代收集算法2. 标记-复制算法3. 标记-清除算法4. 标记-整理算法二. 垃圾收集器详解1. Serial收集器2. Parallel Scavenge收集器3. ParNew收集器4. CMS收集器三. 垃圾收集底层三色标记算法实现原理1. 垃圾收集底层使用三色标记算法的原因?2. 垃圾…

计算机竞赛 深度学习图像分类算法研究与实现 - 卷积神经网络图像分类

文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

1.centos7 安装显卡驱动、cuda、cudnn

安装conda 参考 python包 2.安装conda python库-CSDN博客 1.安装显卡驱动 步骤1&#xff1a;安装依赖 yum -y install kernel-devel yum -y install epel-release yum -y install gcc 步骤2&#xff1a;查询显卡版本 lspci | grep VGA 找到2230号码&#xff0c;进入如下网…

Swift data范围截取问题

文章目录 一、截取字符串的几种方法1. 截取前几位2. 截取后几位3. subData4. 下标截取 二、subData(in:) 报错 EXC_BREAKPOINT 一、截取字符串的几种方法 1. 截取前几位 mobileID.prefix(32)2. 截取后几位 mobileID.suffix(3)3. subData data.subdata(in: 0..<4)4. 下标…

大学生登记国家证书软件著作权提升就业资质

大学生登记国家证书软件著作权提升就业资质 随着信息技术的快速发展&#xff0c;软件行业成为了许多大学生就业的热门选择之一。然而&#xff0c;在竞争激烈的就业市场中&#xff0c;除了掌握专业知识和技能外&#xff0c;如何提升自己的就业资质也显得尤为重要。其中&#xff…

postman接口测试系列: 时间戳和加密

在使用postman进行接口测试的时候&#xff0c;对于有些接口字段需要时间戳加密&#xff0c;这个时候我们就遇到2个问题&#xff0c;其一是接口中的时间戳如何得到&#xff1f;其二就是对于现在常用的md5加密操作如何在postman中使用代码实现呢&#xff1f; 下面我们以一个具体的…

selenium不定位元素直接使用键盘操作(如弹框操作)

今天在使用selenium进行定位时&#xff0c;发现直接定位不了chrome的弹框&#xff0c;如这种弹框&#xff1a; 使用的是下面这行代码 driver.switch_to.alert.accept() 运行报错&#xff0c;说是没有 alert windown。。。。 啊&#xff1f;难道chrome的弹框不是用alert写的&…

冲刺十五届蓝桥杯P0001阶乘求和

文章目录 题目描述思路分析代码解析 题目描述 思路分析 阶乘是蓝桥杯中常考的知识。 首先我们需要知道 int 和long的最大值是多少。 我们可以知道19的阶乘就已经超过了long的最大值&#xff0c;所以让我们直接计算202320232023&#xff01;的阶乘是不现实的。 所以我们需要…