帮别人做网站交税/东莞企业网站设计公司

帮别人做网站交税,东莞企业网站设计公司,淄博企业网站建设公司,广州网站优化网站建设一、什么是MyBatis-plus? MyBatis-plus是MyBatis的增强工具,在MyBatis基础上只做增强不做改变,可以简化基础的CRUD操作(通过继承 BaseMapper 接口可直接使用预定义的增删改查方法) 二、MyBatis-plus快速入门 2.1 准备…

一、什么是MyBatis-plus?

MyBatis-plus是MyBatis的增强工具,在MyBatis基础上只做增强不做改变,可以简化基础的CRUD操作(通过继承 BaseMapper 接口可直接使用预定义的增删改查方法)


二、MyBatis-plus快速入门

2.1 准备工作

2.1.1 数据库数据准备
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;-- 使用数据库
USE mybatis_test;-- 创建表[用户表]
DROP TABLE IF EXISTS user_info;CREATE TABLE `user_info` (`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,`username` VARCHAR ( 127 ) NOT NULL,`password` VARCHAR ( 127 ) NOT NULL,`age` TINYINT ( 4 ) NOT NULL,`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-女 0-默认',`phone` VARCHAR ( 15 ) DEFAULT NULL,`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常,1-删除',`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now(),PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;-- 添加用户信息
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone ) 
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone ) 
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone ) 
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone ) 
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

2.1.2 项目准备

1.创建SpringBoot项目;

2.添加MyBatis-plus和MySQL依赖,配置数据库连接信息。

一、添加MyBatis-plus依赖(SpringBoot 3)和MySQL依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version>
</dependency>
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>

二、配置数据库连接信息

# 数据库连接配置 
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

2.2 代码准备

 一、创建实体类UserInfo与表中字段对应

@Data
public class UserInfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;}

 二、创建Mapper接口并继承BaseMapper

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}

查看BaseMapper,可以发现其中已经准备了各种基础的SQL对应的方法:

这也就是为什么使用MyBatis-plus无需手动编写SQL以及对应方法的原因。


2.3 CRUD单元测试

@SpringBootTest
class DemoApplicationTests {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid selectById() {UserInfo userInfo = userInfoMapper.selectById(1);System.out.println(userInfo);}@Testvoid selectByIds() {List<UserInfo> userInfos = userInfoMapper.selectByIds(List.of(22,23,24));System.out.println(userInfos);}@Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("王五");userInfo.setPhone("381200");userInfo.setGender(3);userInfo.setAge(19);userInfoMapper.insert(userInfo);}@Testvoid deleteById() {userInfoMapper.deleteById(1);}@Testvoid update() {UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setUsername("宫本");userInfoMapper.updateById(userInfo);}}

测试结果如下:

全部执行成功


三、MyBatis-plus复杂操作

 3.1 Mybatis-plus常见注解

在上面的代码中,MyBatis是如何知道我们操作的是哪个表的?表中又有那些字段?观察一下前面的Mapper接口:

BaseMapper指定了一个泛型,这个UserInfo就是与相应表对应的实体类,Mybatis-plus会根据实体类来推断表的信息,默认情况下:

1.表名:由驼峰表示法转换为蛇形表示法(如UserInfo->user_info)

2.字段名:也是驼峰表示法转换为蛇形表示法(如deleteFlag->delete_flag)

3.主键:默认为id

当然,如果设计表时或编写实体类时没有按照标准定义类名/表名、属性名/字段名,MyBatis-plus就无法正确推断,此时就需要注解来标识类名对应的表名(或属性名对应的字段名)


3.1.1 @TableName

@TableName用于标识类所对应的表名是什么

我们先将类名UserInfo改为Userinfo:

现在,再次测试selectByIds方法:

可以看到结果报错了,提示userinfo这个表并不存在,可以看到由于命名的不规范导致MyBatis-plus无法正确推断表名,接下来使用注解@TableName标识:

@Data
@TableName("user_info")//告知MyBatis-plus这个类对应的是哪个表
public class Userinfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

再次测试selectByIds方法:

程序执行成功。


3.1.2 @TableField

 @TableName用于标识属性所对应的字段名是什么

将属性deleteFlag改为deleteflag:

测试insert方法:

报错,提示字段deletefalg不存在,接下来,使用注解@TableFiled标识类中属性对应的字段名:

@Data
@TableName("user_info")
public class Userinfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;//告知MyBatis-plus这个属性对应的字段是什么@TableField("delete_flag")private Integer deleteflag;private Date createTime;private Date updateTime;
}

再次测试:

执行成功。


3.1.3 @TableId

 @TableId用于标识表中主键对应的属性是什么,一般将属性名id作为主键,但是,如果将id修改为userId,MyBatis-plus就无法识别了,此时可以使用@TableId注解的value属性标识主键,如:

测试方法和上面的两个注解类似,这里就不再测试了,下面我们要介绍的是@TableId的另一个重要属性——type

我们先测试insert方法,往user_info中插入一个新数据并观察:

可以看到,新插入的数据id是一个非常小的负数,这是因为@TableId注解的type属性默认值为IdType.ASSIGN_ID一般来说,主键默认为自增的,但是type属性的默认值并不是自增,接下来,修改type属性的值为IdType.AUTO

public class Userinfo {//将id设置为自增@TableId(type = IdType.AUTO)private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

再次测试insert方法:

可以看到,修啊给type后,id正常自增


3.2 打印MyBatis-plus日志

 在配置文件中添加以下配置即可:

mybatis-plus:configuration: # 配置打印 MyBatis⽇志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.3 条件构造器(Wrapper)

前面只是使用MyBatis-plus进行一些简单的CRUD操作,但是在实际应用中,可能还会在SQL语句中加入一些条件(如 id!=10 等),对于这种情况,MyBatis-plus为我们提供了一套强大的条件构造器(Wrapper),下面是主要的Wrapper类:

AbstractWrapper⼀个抽象基类,提供了所有Wrapper类共有的方法和属性
QueryWrapper⽤于构造查询条件,在AbstractWrapper的基础上拓展了⼀个select⽅法,允许指定查询字段
UpdateWrapper⽤于构造更新条件,可以在更新数据时指定条件
LambdaQueryWrapper基于Lambda表达式的查询条件构造器,它通过Lambda表达式来引用实体类的属性,从而避免了硬编码字段名
LambdaupdateWrapper基于Lambda表达式的更新条件构造器,它允许你使⽤Lambda表达式来指定更新字段和条件,同样避免了硬编码字段名的问题
3.3.1 QueryWrapper

 QueryWrapper只是一个条件构造器,并不是只能用于查询语句,其它的删除、更新语句也同样可以使用。

一、查询
使用构造器构造如下SQL:

SELECT id,username,password,age FROM user_info WHERE age = 18 AND username 
"%min%"

在测试代码中构造:

	@Testvoid testQueryWrapper(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().select("id","username","age","password").eq("age",18).like("username","%min%");List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);userInfos.forEach(System.out::println);}

二、更新

使用构造器构造如下SQL:

UPDATE user_info SET delete_flag=? WHERE age < 20

测试代码:

@Testvoid testQueryWrapper2(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().lt("age",20);UserInfo userInfo = new UserInfo();userInfo.setDeleteFlag(0);userInfoMapper.update(userInfo,queryWrapper);}

三、删除

使用构造器构造如下SQL:

DELETE FROM user_info WHERE age = 18

测试代码:

   @Testvoid testQueryWrapper3() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().eq("age",18);userInfoMapper.delete(queryWrapper);}

在上面使用构造器的代码中,涉及到一些缩写的方法,这里列举出常见的缩写方法的含义:

       lt“less than” 的缩写,表示小于
       le“less than or equal to” 缩写,表示小于或等于
       ge“greater than or equal to”缩写 ,表示大于或等于
       gt“greater than”缩写,表示大于
       eq“equals”缩写,表示等于
       ne“not equals”缩写,表示不等于

 


3.3.2 UpdateWrapper

对于更新语句,可以直接使用UpdateWrapper构造器进行构造,这要就不必创建对应的实体类(相较于QueryWrapper,多了一个set和setSql方法)

一、set方法

使用UpdateWrapper构造器构造如下SQL:

UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)

测试代码:

    @Testvoid testUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag",0).in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);}

二、setSql方法(基于SQL更新)

  @Testvoid testUpdateWrapper2(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.setSql("age = age + 10").eq("id",1);userInfoMapper.update(updateWrapper);}

3.3.3 LambdaQueryWrapper

 前面的QueryWrapper和UpdateWrapper都有一个共同特点,就是将字段名写死了,如果后续字段名发生变化,这里也不会报错,对此MyBatis-Plus 给我们提供了一种基于Lambda表达式的条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名,也提高了代码的可读性和可维护性.

使用LambdaQueryWrapper构造以下SQL:
 

UPDATE user_info SET delete_flag=? WHERE age < 20

测试代码:

@Testvoid lambdaQueryWrapper(){LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();UserInfo userInfo = new UserInfo();userInfo.setDeleteFlag(0);lambdaQueryWrapper.in(UserInfo::getId,List.of(1,2,3));userInfoMapper.update(userInfo,lambdaQueryWrapper);}

3.3.4 LambdaUpdateWrapper

 使用LambdaUpdateWrapper构造以下SQL:

UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)

测试代码:
 

  @Testvoid lambdaUpdateWrapper(){LambdaUpdateWrapper<UserInfo> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.set(UserInfo::getDeleteFlag,5).set(UserInfo::getAge,5).in(UserInfo::getId,List.of(1,2,3));userInfoMapper.update(lambdaUpdateWrapper);}

3.4 自定义SQL

 对于更加复杂的查询语句(如子查询),可能无法直接使用条件构造器完成,因此,MyBatis-plus提供了自定义SQL的功能,可以利用Wrapper构造查询条件,再结合Mapper编写SQL

使用自定义SQL完成以下查询:

select id,username,password,age FROM user_info WHERE username = "admin"

对应的Mapper:

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {@Select("select id,username,password,age from user_info ${ew.customSqlSegment}")List<UserInfo> selectUserInfoByCondition (@Param(Constants.WRAPPER) Wrapper<UserInfo> ew);
}

测试代码:
 

  @Testvoid selectUserInfoByCondition() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lt("age",20);userInfoMapper.selectUserInfoByCondition(queryWrapper).forEach(System.out::println);}

 使用自定义SQL,由几个注意事项:

• 参数命名:在自定义 SQL 时, 传递 Wrapper 对象作为参数时, 参数名必须为 ew ,或者使用注解 @Param(Constants.WRAPPER) 明确指定参数为 Wrapper 对象. 

• 使用 ${ew.customSqlSegment} 在 SQL 语句中,使用 ${ew.customSqlSegment} 来 引用 Wrapper 对象生成的 SQL 片段. 

• 不支持基于 entity 的 where 语句自定义 SQL 时,Wrapper 对象不会基于实体类自动生成  where 子句,你需要手动编写完整的 SQL 语句.

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

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

相关文章

【算法基础】递归与递推

目录 递归实现指数型枚举 题目 算法解析 递归实现排列型枚举 题目 算法解析 费解的开关 题目 算法解析 递归实现组合型枚举 题目 算法解析 带分数 题目 算法解析 飞行员兄弟 题目 算法解析 翻硬币 题目 算法解析 递归实现指数型枚举 题目 算法…

Java 大视界 -- Java 大数据在智慧矿山设备故障预测与预防性维护中的技术实现(163)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

综合实验一

实验拓扑图&#xff1a; 实验要求&#xff1a; 1,内网IP地址使用172.16.0.0/16分配 2,SW1和SW2之间互为备份 3,VRRP/STP/VLAN/Eth-trunk均使用 4,所有PC均通过DHCP获取IP地址 5,ISP只能配置IP地址 6,所有电脑可以正常访问ISP路由器环回 实验步骤&#xff1a; 步骤1&…

snort检测端口扫描工具

前面两篇文章介绍了snort3相关知识和Ubuntu上的安装配置Ubuntu22.04上Snort3的安装与基本配置 -CSDN博客 和Snort规则定义并进行的简单的测试Snort规则定义与测试 -CSDN博客&#xff0c;接下来我将介绍如何编写一个简单的检测端口扫描的规则进行检测 一、实验环境 攻击机&…

【行测】资料分析

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;读不在三更五鼓&#xff0c;功只怕一曝十寒。 > 目标&#xff1a;掌握 资料分析 基本题型&#xff0c;并能运用到例题中。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! …

工地扬尘监测仪:守护蓝天白云的重要工具

在城市化进程加速推进的背景下&#xff0c;建筑工地数量呈现持续增长态势&#xff0c;扬尘污染问题亦愈发显著。扬尘不仅对空气质量造成负面影响&#xff0c;更对周边居民的健康状况及生活质量构成威胁。在此情形下&#xff0c;工地扬尘监测仪作为建筑工地环境管理中不可或缺的…

Windows10 下QT社区版的安装记录

0. 介绍 踩了一些坑&#xff0c;记录一下&#xff0c;主要是镜像源的问题。 1. 安装 首先你先要在qt官网上有一个自己的账号。 然后点右上角的下载 打开后&#xff0c;我们需要选择社区版本&#xff1b;如果选择直接下载的话&#xff0c;出来的就是商业版本。 点开后&…

VS Code C/C++项目设置launch.json中的environment参数解决支持库路径问题

问题描述 Windows 11 VS Code C/C 开发环境搭建分别写了c和cpp两个示例代码&#xff0c;在运行过程中c代码没有发现问题&#xff08;可能简单&#xff0c;没有用到太多支持&#xff09;&#xff0c;但使用了stl的cpp代码并没有运行出来&#xff0c;如下图&#xff1a; 出问题…

随机2级域名引导页HTML源码

源码介绍 随机2级域名引导页HTML源码,每次点进去都随机一个域名前缀。 修改跳转域名在 350 行代码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行 效果预览 源码免费获取 随机2级域名引导页…

Nginx — nginx.pid打开失败及失效的解决方案

1、场景一&#xff1a;nginx.pid文件或者目录不存在 1.1、报错详情 [rootmaster conf]# ../sbin/nginx -s reload nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory) #nginx.pid文件或目录不存在。 原因&#xff1a; 1、文件…

AireOS WLC安装License报错

1.概述 本文主要记录在AireOS的WLC上安装License错误的情况。License的类型也是传统的License&#xff0c;因为设备的型号已经EOL&#xff0c;相关的资料应该较少&#xff0c;这里进行可能问题的记录。 2.适用场景 型号&#xff1a;WLC2500&#xff0c;WLC5508 License类型…

利用 Excel 函数随机抽取(附示例)

RANDARRAY 是 Excel 365 和 Excel 2021 引入的一个函数&#xff0c;用于生成一个随机数数组。它的语法如下&#xff1a; RANDARRAY([rows], [columns], [min], [max], [whole_number])参数详解 rows&#xff08;可选&#xff09; 要生成的行数&#xff08;默认值为 1&#xff…

Python:爬虫概念与分类

网络请求&#xff1a; https://www.baidu.com url——统一资源定位符 请求过程&#xff1a; 客户端&#xff0c;指web浏览器向服务器发送请求 请求&#xff1a;请求网址(request url)&#xff1b;请求方法(request methods)&#xff1b;请求头(request header)&…

HO与OH差异之Navigation三

在上一篇内容中我们介绍了HO与OH差异之Navigator&#xff0c;我们也了解了Navigator的基本概念和大致了解了一下他的基础用法&#xff0c;既然谈到差异肯定就不止这两种差异&#xff0c;今天就让我们来了解第三种差异NavRouter&#xff0c;其中在HO中我们并没有这种路由方式但是…

ZGC初步了解

ZGC ZGC和G1&#xff0c;CMS一样都是一种垃圾回收器。那其实G1已经很不错了 为什么还需要ZGC呢 ZGC&#xff08;The Z Garbage Collector&#xff09;是JDK 11中推出的一款低延迟垃圾回收器&#xff0c;它的设计目标包括&#xff1a; 停顿时间不超过10ms&#xff1b; 停顿时…

Tof 深度相机原理

深度相机(TOF)的工作原理_tof相机原理-CSDN博客 深度剖析 ToF 技术&#xff1a;原理、优劣、数据纠错与工业应用全解析_tof技术-CSDN博客 飞行时间技术TOF_tof计算公式-CSDN博客 深度相机&#xff08;二&#xff09;——飞行时间&#xff08;TOF&#xff09;_飞行时间技术-C…

跟着StatQuest学知识08-RNN与LSTM

一、RNN &#xff08;一&#xff09;简介 整个过程权重和偏置共享。 &#xff08;二&#xff09;梯度爆炸问题 在这个例子中w2大于1&#xff0c;会出现梯度爆炸问题。 当我们循环的次数越来越多的时候&#xff0c;这个巨大的数字会进入某些梯度&#xff0c;步长就会大幅增加&…

HarmonyOS 之 @Require 装饰器自学指南

在 HarmonyOS 应用开发工作中&#xff0c;我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里&#xff0c;要是无法确保必要参数在构造时准确传入&#xff0c;就极易引发运行时错误&#xff0c;而且排查起来费时费力。一次偶然的机会&#xff0c;我接触到了 Require 装饰…

【身份安全】OAuth 2.0工作原理(一)

目录 OAuth 授权框架一、OAuth 角色二、协议流程三、应用注册&#xff08;Application Registration&#xff09;用户 ID&#xff08;Client ID&#xff09; 和 用户密码&#xff08;Client Secret&#xff09; 四、权限授予1、授权码链接2、用户授权申请3、应用程序接收授权码…

大疆上云api直播功能如何实现

概述 流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下: 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流…