Mybatis-Plus实现简单的增删改查 实体类上的注解

写在前面在这里插入图片描述🛫更多知识总结见Mybatis-Plus专栏
🚕内容总结自尚硅谷杨博超老师的视频
🚒博主对于该知识尚在学习阶段
🚄如果发现存在问题请毫不吝啬的指出
🚀🚀扎哇太枣糕的博客首页🚀🚀

文章目录

  • 1 注解
    • 1.1 @TableName
    • 1.2 @TableId
    • 1.3 @TableField
    • 1.4 @TableLogic
  • 2 mapper层的CRUD方法
    • 2.1 增(insert)
    • 2.2 删(delete)
    • 2.3 改(update)
    • 2.4 查(select)
  • 3 service层的CRUD方法
    • 3.1 批量添加或者更新
    • 3.2 查询表中总记录数

1 注解

1.1 @TableName

  之前在入门案例中我们分析过:使用mp底层方法生成的SQL语句中,表名为mapper或者service接口传入的泛型首字母小写,表中字段名为泛型类的封装属性,如果表名与泛型名不对应的话,这个时候就需要在实体类上使用@TableName注解来修改实体类绑定的表

@TableName("对应的表名")

  有些时候我们会将一个项目所用的所有表在命名上使用一个公共前缀,使用配置文件设置之后就会在所有的实体类所对应的的表名上拼接该前缀

mybatis-plus:global-config:db-config:table-prefix: 表名的公共前缀

1.2 @TableId

  mp中会默认将实体类中命名为id的属性作为主键与表的id主键相对应,但是如果实体类属性与表中的主键命名一致但不是id而是cid或者uid等的话,就会因为找不到主键而无法实现功能报错。于是就需要在实体类的属性上使用@TableId注解标注该属性对应的表中字段为该表的主键

@TableId

  现在有这么一个情况,如果实体类中的属性与表中主键不一样的话,就该在实体类的属性上使用@TableId注解的value属性将两者对应起来

@TableId(value = "该属性在表中对应的字段名")

  通过上一篇博客对mapper接口的insert方法测试发现,通过insert方法插入的记录,如果不设置id主键值的情况下,mp默认使用雪花算法(下面有拓展)生成一个id号插入到表中。如果想要将生成的id设置成根据表中主键值进行自增插入的话,首先应该将表中的主键字段设置成自增,然后将实体类的属性上使用@TableId注解的value属性设置

@TableId(type = IdType.AUTO)

  除了使用注解单个设置实体类的主键生成策略之外,还可以通过配置文件设置所有实体类的主键生成策略

mybatis-plus:global-config:db-config:id-type: auto

雪花算法
  雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表主键的不重复性,以及相同表主键的有序性。通过雪花算法生成的id长度共64bit(一个long型)。

  • 最高1bit是符号位正0负1,id一般是正数
  • 41bit时间截(毫秒级)
  • 10bit作为机器的ID
  • 12bit作为毫秒内的流水号

优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高在这里插入图片描述

1.3 @TableField

  mp会默认将表中的字段名里的下划线转换成驼峰命名,也就是将实体类中的userName属性与数据库中的user_name字段相对应。主键不对应的话使用@TableId注解,普通字段对应不上的话,就可以在实体类的属性上使用@TableField注解

@TableField("表中对应的字段名")

1.4 @TableLogic

  @TableLogic注解就是设置字段为伪删除,也就是在执行删除方法的时候将该字段对应的值设置为1,再查询记录时不显示该字段为1的记录。
  首先应该在数据库的表中创建一个字段用来标记是否删除(默认值为0即不删除),实体类创建相应的属性上用注解标注:

@TableLogic
private Integer isDeleted;

使用@TableLogic注解之后,所有的删除操作都是伪删除,就是将标记字段的值改为1

 @Test
public void deleteBatchIdsTest() {List<Long> list = Arrays.asList(26L, 27L, 28L);// UPDATE user SET is_deleted=1 WHERE cid IN ( ? , ? , ? ) AND is_deleted=0int result = mapper.deleteBatchIds(list);System.out.println("受影响的行数: " + result);
}

查询的时候会加入一个判断条件,就是标记字段的值要是0才显示

@Test
public void selectListTest() {// SELECT cid AS uid,name,age,email,is_deleted FROM user WHERE is_deleted=0List<User> users = mapper.selectList(null);users.forEach(System.out::println);
}

  在MP中mapper和service定义了很多的CRUD方法,可以像使用常见类API的方式直接调用使用,这些方法有很多按照方法参数的不同主要分为两大类,一种参数是wrapper放在下一章中进行讲解,另一种是接下来讲解的参数不是wrapper的方法

2 mapper层的CRUD方法

  mapper层接口继承BaseMapper接口并传入需要操作的实体类泛型

// spring框架创建mapper接口相对应的接口实现类
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

2.1 增(insert)

@Test
public void insertTest() {User user = new User();user.setName("张三");user.setAge(20);// sql语句:INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )int result = mapper.insert(user);System.out.println("受影响的行数 " + result);
}

主键id不设置的话默认使用雪花算法生成

2.2 删(delete)

根据主键删除单条记录(deleteById)

@Test 
public void deleteByIdTest() {// DELETE FROM user WHERE id=?int result = mapper.deleteById(1502966571370401793L);System.out.println("受影响的行数: " + result); 
}

根据主键删除多条记录(deleteBatchIds)

@Test 
public void deleteBatchIdsTest() {List<Long> list = Arrays.asList(1L, 2L, 3L);// DELETE FROM user WHERE id IN ( ? , ? , ? )int result = mapper.deleteBatchIds(list);System.out.println("受影响的行数: " + result); 
} 

多条件删除(deleteByMap)

@Test 
public void deleteByMapTest() {HashMap<String, Object> map = new HashMap<>();map.put("name", "张三");map.put("age", 23);// DELETE FROM user WHERE name = ? AND age = ?int result = mapper.deleteByMap(map);System.out.println("受影响的行数: " + result);   
} 

2.3 改(update)

根据主键id修改(updateById)

@Test 
public void updateByIdTest() {User user = new User();user.setId(4L);user.setName("张三");user.setAge(20);// UPDATE user SET name=?, age=? WHERE id=?int result = mapper.updateById(user);System.out.println("受影响的行数: " + result); 
}

2.4 查(select)

根据主键id查找一条记录(selectById)

@Test public void selectTest() {// SELECT id,name,age,email FROM user WHERE id=?User user = mapper.selectById(4L);System.out.println("查询结果为:" + user); 
}

根据主键id查找多条记录(selectBatchIds)

@Test 
public void selectByBatchIdsTest() {List<Long> list = Arrays.asList(4L, 5L);// SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )List<User> users = mapper.selectBatchIds(list);System.out.print("查询结果为:");users.forEach(System.out::println); 
} 

多条件查询(selectByMap)

@Test 
public void selectByMapTest() {HashMap<String, Object> map = new HashMap<>();map.put("name", "张三");map.put("age", 20);// SELECT id,name,age,email FROM user WHERE name = ? AND age = ?List<User> users = mapper.selectByMap(map);System.out.print("查询结果为:");users.forEach(System.out::println); 
}

查询表中所有的记录(selectList)

@Test 
public void selectListTest() {// SELECT id,name,age,email FROM userList<User> users = mapper.selectList(null);users.forEach(System.out::println); 
} 

mapper层增删改查方法中的小知识点

⚠ 所有的增删改方法返回值都是受影响的行(记录)数
⚠ 以上都是单表的简单增删改查操作,如果这些功能无法满足你的需求,可以自定义SQL。可以在默认的路径(resources文件夹下的mapper文件夹)下创建mapper映射文件,或者在别的地方创建映射文件使用配置文件指定(mybatis-plus.mapper-locations),其他的操作和mybatis一样(接口方法、映射文件、调用方法)

3 service层的CRUD方法

  service层接口继承IService接口并传入需要操作的实体类泛型

public interface UserService extends IService<User> {
}

  service接口的实现类除了实现接口之外,还要继承ServiceImpl类并传入传泛型(mapper层接口,实体类),这样做的好处是还可以在实现类里实现自定义业务方法

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

3.1 批量添加或者更新

批量添加saveBatch

@Test
public void saveBatchTest() {// INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )List<User> list = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setName("tom" + i);user.setAge(20 + i);list.add(user);}boolean b = userService.saveBatch(list);System.out.println(b);
}

批量添加或者更新saveOrUpdateBatch
  第二个方法既可以用于批量添加还可以皮力量更新,判断是批量添加还是更新的依据是:看传入的列表中实体类对象是否设置了id属性或者说这个id值在表中是否存在,如果设置了id且id在表中存在的话就是批量更新,如果不设置id属性或者表中没有这个字段值的话就是批量添加。简而言之,有则改无则添

// 批量修改(因为user对象设置的id属性在表中存在)
@Test
public void saveOrUpdateBatchTest() {// UPDATE user SET name=?, age=? WHERE id=?List<User> list = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId(10L + i);user.setName("jack" + i);user.setAge(20 + i);list.add(user);}boolean b = userService.saveOrUpdateBatch(list);System.out.println(b);
}

3.2 查询表中总记录数

@Test
public void getCountTest() {// SELECT COUNT( * ) FROM userlong count = userService.count();System.out.println(count);
}

这篇博客参加了几何大佬的社区活动
还望大家多多支持几何大佬的社区
            
CSDN社区 《创作达人》活动,只要参与其中并创作文章就有机会获得官方奖品:精品日历、新程序员杂志,快来参与吧!链接直达 https://bbs.csdn.net/topics/605272551

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

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

相关文章

conda失败说没有写权限_爱情中,为什么男生表白失败,女生还说可以继续做朋友,想过没有...

在爱情中&#xff0c;不是每个男生都是幸运的&#xff0c;也不是每次的表白都是如你所愿的。有成功总有失败&#xff0c;成功是喜悦的&#xff0c;但是失败却是痛苦的。不过有的时候男生和女生表白以后&#xff0c;女生对男生说了这样的一段&#xff0c;其实我希望以后我们还是…

Mybatis-Plus中Wrapper条件构造器的使用

写在前面 &#x1f6eb;更多知识总结见Mybatis-Plus专栏 &#x1f695;内容总结自尚硅谷杨博超老师的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680…

springboot设置默认值_线上Bug无法复现?老司机教你一招,SpringBoot远程调试不用愁!...

前言在部署线上项目时&#xff0c;相信大家都会遇到一个问题&#xff0c;线上的 Bug 但是在本地不会复现&#xff0c;多么无奈。此时最常用的就是取到前端传递的数据用接口测试工具测试&#xff0c;比如 POSTMAN&#xff0c;复杂不&#xff0c;难受不&#xff1f;今天陈某教你一…

Mybatis-Plus的分页 乐观锁插件 通用枚举 多数据源

写在前面&#x1f6eb;更多知识总结见Mybatis-Plus专栏 &#x1f695;内容总结自尚硅谷杨博超老师的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;…

等待的操作过时_不会过时的6种网站seo优化操作

SEO优化一直在变化&#xff0c;百度和谷歌的算法也在不断的迭代更新&#xff0c;所以竞争永远不会停止。今天小编就来给大家分享一下&#xff0c;6种不会过时的网站seo优化操作。1.保持正常优化为网站访客提供高质量的内容、卓越的用户体验和安全性以及卓越的技术网站。这可能需…

java的for循环取出数据只是拿到最后一个_一问SQL优化就无从藏身?那只是你对原理的精髓掌握不深

​曾几何时&#xff0c;我信誓旦旦的认为只要 SQL 写的好&#xff0c;面试过程永不倒。结果在一次又一次的征途中&#xff0c;「最终还是以完败落下帷幕」。结果都源于注重使用而忽略原理&#xff0c;从而不知也不了解「SQL」优化应如何面对。读文的你&#xff0c;如今可有这样…

SpringBoot前后端分离解决跨域问题的三种解决方案

&#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;** 文章目录&#x1f34a;什么是跨域&#x1f34a;跨域问题的解决策略&#x1f34a;三种解决方法&#x1f34a;什么是跨域 想要知道什么是跨域的话&#xff0c;我们可以通过一个小案例简单了解一下跨…

ant design vue 树形控件_官宣!vue.ant.design 低调上线

点击右上方&#xff0c;关注开源中国OSC头条号&#xff0c;获取最新技术资讯官宣&#xff01;官宣&#xff01;官宣&#xff01;是的&#xff0c;你没看错就是那个 https://vue.ant.design。至此&#xff0c;Ant Design 已经全面覆盖了 React、Angular、Vue 三大前端框架&#…

哪款笔记本电脑好_扫地机器人哪个牌子好?口碑最好的扫地机器人

随着智能家居的普及&#xff0c;让我们的生活变得越来越智能。扫地机器人的出现完美解决了宠物的毛发问题&#xff0c;为自己腾出了大量的时间。扫地机器人绝对能提升你的生活品质&#xff0c;通过机器内建的智能清洁模式、自定义规划区域进行打扫&#xff0c;使用手机APP进行控…

使用mybatisplus的通用枚举实现存储显示相分离

狡兔尚且三窟&#xff0c;多学一招总没错吧&#xff1f; &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680; &#x1f30f; 抛出问题 如果让你实现这么一个功能&#xff1a;将性别使用数字存储到数据库中&#xff0c;但是前端需要获取到的是具体的性…

JDK和JRE的区别?main方法的注意点?强制和自动类型转换?

&#x1f4a1;涉及的知识点速通&#x1f6eb; JDK和JRE傻傻分不清?&#x1f6eb; HelloWorld的输出都经历了啥&#xff1f;&#x1f6eb; Java的三个版本都是啥&#xff1f;&#x1f6eb; 关于main方法你都知道啥&#xff1f;&#x1f6eb; 强制and自动类型转换都是啥?各位小…

安卓10不支持qmc解码_Root神器支持安卓10 面具Magisk v20.4+Magisk Manager v7.5.1

Magisk的功能和xposed框架的功能差不多&#xff0c;也有很多插件可安装&#xff0c;而且自带root&#xff0c;刷入这个Magisk后你的rom同时也就有root了(支持安卓7.0&#xff0c;7.1&#xff0c;8.0&#xff0c;8.1,9,10)这也是目前安装8.1root的普遍方法&#xff0c;因为目前s…

==和equals判等、空串和null串、字符串常用API

&#x1f4a1;涉及的知识点速通&#x1f6eb; 关于变量和常量你都知道啥?&#x1f6eb; &和&&#xff06;、|和||有什么区别&#xff1f;&#x1f6eb; 关于字符串的问题你能答对几道&#xff1f;&#x1fa82; 可以修改一个字符串中的值吗?&#x1fa82; 字符串使用…

俩台电脑怎么设置同一局域网_方法 | 把手机上的照片传到电脑上

我想把手机上的照片/视频传到电脑上怎么办? 什么云盘&#xff0c;手机助手等等全扔到一边去&#xff0c;不用。请让我慢慢道来&#xff1a;现在&#xff0c;人们手机用的越来越多&#xff0c;即使在大街上&#xff0c;到处都是“低头族”。但是&#xff0c;有好多小伙伴问&…

数据持化技术的发展演变(SQL、JDBC、mybatis)

文章目录1 简单SQL语句1.1 查询1.2 新增1.3 修改1.4 删除1.5 多表查询2 JDBC2.1 什么是JDBC2.2 什么是jar和maven2.3 JDBC的使用2.4 JDBC总结3 mybatis3.1 什么是ORM?为什么是ORM不是JDBC&#xff1f;3.2 mybatis的使用3.3 mybatis总结4 mybatis与jdbc的逻辑相同处环境配置 j…

传统蒙文字体_蒙古要改回使用传统回鹘蒙文,这是种什么文字,蒙古为什么要改回...

喜欢就点关注吧!文字是一个国家的文化象征&#xff0c;也是其书面交流的主要工具&#xff0c;世界上的大多数国家都有自己独特的文字&#xff0c;我们的邻国蒙古也是如此&#xff0c;近日蒙古国实行了一场意义重大的文字改革&#xff0c;据新华社乌兰巴托3月18日报道&#xff0…

三态输出门实验报告注意事项_数电基础知识:各种IO输出的类型

集电极开路(OC)集电极开路输出的结构如图1所示&#xff0c;右边的那个三极管集电极什么都不接&#xff0c;所以叫做集电极开路&#xff1b;左边的三极管为反相之用&#xff0c;使输入为“0”时&#xff0c;输出也为“0”。对于图 1&#xff0c;当左端的输入为“0”时&#xff0…

数据持久化技术——MP

文章目录1 环境搭建1.1 创建一个maven的project1.2 pom.xml文件导入web开发依赖1.3 创建SpringBoot项目的主程序入口2 代码生成器3 配置数据库4 导入前端页面5 开始前端控制器的编码5.1 wrapper构造器mybatis-plus(简称 MP)是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基…

win7无法连接打印机拒绝访问_如何解决局域网无法访问SQL Server 2008 无法连接到(local)...

初次安装使用SQL server 2008时&#xff0c;可能会遇到无法连接到(local)的情况。那么&#xff0c;如何解决此问题&#xff1f;工具/原料: SQL server 2008方法/步骤1. 打开SQL server 配置管理器-->SQL server 网络配置-->实例名的协议(我的实例名为SQLEXPRESS)。2. 将S…

windows进程管理器_任务管理器就能搞定9成的电脑问题?方法在这里!

90% 对于电脑的不满&#xff0c;都逃不出这几个方面&#xff1a;电脑状态无法随时监测、运行卡顿、开机时间长、莫名黑屏、电池关键时刻不扛使(笔记本电池怎么保养&#xff1f;能不能一直插电源充电&#xff1f;可以戳这里→)&#xff0c;很多小伙伴就选择安装第三方软件来解决…