热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Springboot+MybatisPlus高效实现增删改查,阿里Java笔试

3.运行生成器代码控制台提示输入表名时输入表名回车即可生成生成完整目录如下:三、配置Mybatis-Plus在使用Mybatis-Plus之前我们还需要进行一些配置

在这里插入图片描述

3.运行生成器代码

控制台提示输入表名时输入表名回车即可生成

在这里插入图片描述

生成完整目录如下:

在这里插入图片描述

三、配置Mybatis-Plus


在使用Mybatis-Plus之前我们还需要进行一些配置,包括springboot启动类、数据库连接和Mybatis-Plus的配置。

1.springboot启动类:


@SpringBootApplicationpublic class UserServiceApp {public static void main(String[] args) {SpringApplication.run(UserServiceApp.class, args);}}

2.application.yml文件:


server:port: 8092spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.67.129:3306/mybatis_plus?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&nullCatalogMeansCurrent=trueusername: rootpassword: rootmybatis-plus:mapper-locations: classpath*:mapper/**/*.xml#实体扫描,多个package用逗号或者分号分隔type-aliases-package: com.huangtl.user.entityconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

主要配置了数据库连接和mybatis-plus的扫描,dao层的Mapper扫描还需要一个配置类。

3.MybatisPlusConfig类:


package com.huangtl.user.config;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Configuration;@Configuration@MapperScan({"com.huangtl.user.mapper*"})public class MybatisPlusConfig {}

@Configuration说明是springboot的配置类。

@MapperScan指定扫描指定位置的Mapper接口。

好了,这样你就可以使用顺利使用Mybatis-Plus的代码操作数据库了,接下去看下Mybatis-Plus的使用示例。

四、CURD示例


生成的代码结构上面已经解释了,我们这里主要看下service层的类,这里包含了几乎所有的新增改查方法。

先看下service实现类。

在这里插入图片描述

这里主要是继承了Mybatis-Plus的一个service实现类,通过泛型的方式将Dao层Mapper类和实体类引入。增删改查方法都在该类。我们可以直接调用该父类方法操作数据库,比如根据id获取一个用户信息方法:


User byId = this.getById(1);

后面的的例子中都在UserServiceImpl中,所以都使用this关键字调用,如果需要其他类调用只需要注入该类即可。

1.新增


public void testInsert(){User user = new User();user.setNickName("程序员柳大侠");user.setAge(90);this.save(user);}

效果:

在这里插入图片描述

2.修改


public User testUpdate(int id){User user = new User();user.setId(id);user.setNickName("柳大侠");user.setAge(20);this.updateById(user);return user;}

效果:

在这里插入图片描述

其他修改方式:


//1.新增或修改this.saveOrUpdate(user);//2.lambda表达式修改this.update(Wrappers.lambdaUpdate(User.class).set(User::getNickName,"柳大侠").eq(User::getId,id));//3.数据库原字段修改this.update(new UpdateWrapper().set("nick_name","柳大侠").eq("id",id));//4.批量修改List list &#61; new ArrayList<>();list.add(user);this.updateBatchById(list);

3.删除

  • 物理删除

默认都是物理删除&#xff0c;会删除数据库中的该条记录。


public void remove(int id){this.removeById(id);}

其他方式&#xff1a;


//lambda表达式方式this.remove(Wrappers.lambdaQuery(User.class).eq(User::getId,id));//数据库原字段方式this.remove(new QueryWrapper().eq("id",id));//批量删除this.removeByIds(ids);

  • 逻辑删除

逻辑删除不会删除数据库中的记录&#xff0c;只会修改删除标志字段。

使用方式&#xff0c;在字段上加上&#64;TableLogic注解。


&#64;TableLogicprivate Integer deleted;

默认1为已删除&#xff0c;0为未删除。

当你调用删除方法比如removeById时不会删除记录&#xff0c;只会把deleted字段改为1&#xff1b;

你也可以配置已删除/未删除的标志值。


mybatis-plus:global-config:db-config:logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置注解&#64;TableLogic)logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

4.查询

查询方式可以查询单条记录信息和多条信息&#xff0c;示例如下&#xff1a;


//单个查询User user &#61; this.getById(id);//lambda表达式User user &#61; this.getOne(Wrappers.lambdaQuery(User.class).eq(User::getId,id));//数据库原字段User user &#61; this.getOne(new QueryWrapper().eq("id",id));//查询多条记录List ids &#61; new ArrayList();ids.add(1);ids.add(2);List users &#61; this.listByIds(ids);//查询20岁到30岁之间的用户List users &#61; this.list(Wrappers.lambdaQuery(User.class).ge(User::getAge,20).le(User::getAge,30));//查询20岁或者30岁之间的用户List users &#61; this.list(Wrappers.lambdaQuery(User.class).eq(User::getAge,20).or().eq(User::getAge,30));//查询年龄最小的10条记录List users &#61; this.list(Wrappers.lambdaQuery(User.class).orderByAsc(User::getAge).last("limit 10"));

可以使用func方法根据参数指定对应的sql语句&#xff1a;


String orderColumn &#61; "age";List users &#61; this.list(Wrappers.lambdaQuery(User.class).func(w->{//如果排序列是年龄则根据年龄排序if("age".equals(orderColumn)){w.orderByAsc(User::getAge);}else if("nickName".equals(orderColumn)){//如果排序列是昵称则根据昵称排序w.orderByAsc(User::getNickName);}}));

五、分页


在3.4.0版本以前使用的是PaginationInterceptor&#xff0c;只需要在配置类中定义&#xff1a;


&#64;Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor &#61; new PaginationInterceptor();return paginationInterceptor;}

3.4.0以后使用的是MybatisPlusInterceptor&#xff1a;


&#64;Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor &#61; new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}

接口写法&#xff1a;


&#64;GetMapping()public Page queryPage(&#64;RequestBody Page page){page &#61; userService.page(page, Wrappers.lambdaQuery(User.class).orderByAsc(User::getAge));return page;}

这里主要使用到了userService的page方法&#xff0c;也是Mybatis-Plus提供的&#xff0c;返回的也是一个Page对象。

Page类对应的是

com.baomidou.mybatisplus.extension.plugins.pagination.Page;

主要属性如下&#xff1a;

**records&#xff1a;返回记录

total&#xff1a;总页数

size&#xff1a;每页显示条数

current&#xff1a;当前页

pages&#xff1a;总页数**

前端请求体如下&#xff1a;


{"size":10,"current":1}

一般前端只需要传size和current即可。

返回内容体如下&#xff1a;


{"records": [{"id": 2,"nickName": "程序员柳大侠","age": 90}],"total": 1,"size": 10,"current": 1,"orders": [],"optimizeCountSql": true,"hitCount": false,"countId": null,"maxLimit": null,"searchCount": true,"pages": 1}

扩展分页参数

一般来讲我们需要前端传一些自定义参数&#xff0c;而不仅是page中的参数&#xff0c;那么可以这样子写。

比如我们需要多传一个maxAge最大年龄查询参数。

定义一个请求参数体继承Page类。


public class pageDto extends Page {private int maxAge;public int getMaxAge() {return maxAge;}public void setMaxAge(int maxAge) {this.maxAge &#61; maxAge;}}

定义接口使用自定义的请求体


&#64;GetMapping("/page")public Page queryPage(&#64;RequestBody pageDto page){page &#61; userService.page(page, Wrappers.lambdaQuery(User.class).le(User::getAge,page.getMaxAge()).orderByAsc(User::getAge));return page;}

前端请求参数


{"size":10,"current":1,"maxAge":100}

如果不想使用上面的写法&#xff0c;Page也提供了许多构造函数&#xff0c;当前页和显示条数你可以自己定义参数&#xff0c;然后通过Page的构造函数new Page(…)出来&#xff0c;最后再调用userService.page(E page, Wrapper queryWrapper)即可。


new Page(long current, long size);new Page(long current, long size, long total);newPage(long current, long size, boolean isSearchCount);......

六、扩展功能


这里讲两个常用的扩展功能&#xff0c;分别是自动填充属性和枚举属性。

1.自动填充属性

有时候我们需要在新增或更新数据库时自动给一些字段赋值&#xff0c;比如新增时自动赋值创建时间&#xff0c;更新时自动赋值更新时间。

先写各配置类。


package com.huangtl.user.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.springframework.context.annotation.Configuration;import org.springframework.stereotype.Component;import java.time.LocalDateTime;/*** &#64;Description 参数填充* &#64;Author 程序员柳大侠**/&#64;Configuration&#64;Componentpublic class MybatisMetaObjectHandler implements MetaObjectHandler {&#64;Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)}&#64;Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)}}

定义了新增和更新填充方法&#xff0c;光这样还不行&#xff0c;你需要在实体类的字段上添加&#64;TableField注解并指定fill属性&#xff0c;如下&#xff1a;


&#64;TableField(value &#61; "create_time",fill &#61; FieldFill.INSERT)private LocalDateTime createTime;

FieldFill.INSERT代表新增时会赋值。如果希望新增时也赋值更新时间字段&#xff0c;可以使用fill &#61; FieldFill.INSERT_UPDATE 。


&#64;TableField(value &#61; "update_time",fill &#61; FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;

我们来试试&#xff0c;给user表增加create_time和update_time字段。

在这里插入图片描述

执行新增方法


User user &#61; new User();user.setNickName("程序员柳大侠");user.setAge(90);this.save(user);

可以看到已经自动填充了创建时间和更新时间

在这里插入图片描述

我们再来执行下更新方法。


User user &#61; new User();user.setId(id);user.setNickName("柳大侠");user.setAge(20);this.updateById(user);

需要注意的是&#xff0c;有部分更新方法无法自动填充&#xff0c; 可以使用updateById方法。

在这里插入图片描述

2.枚举属性

有时候我们有一些字段只会出现固定的值&#xff0c;我们可以用枚举属性来表示&#xff0c;比如性别只有男女&#xff0c;数据库我们可能用0和1表示。

首先需要修改下配置文件&#xff0c;增加一个

mybatis-plus.typeEnumsPackage参数&#xff0c;扫描你的枚举所在的包位置


mybatis-plus:mapper-locations: classpath*:mapper/**/*.xml#实体扫描&#xff0c;多个package用逗号或者分号分隔type-aliases-package: com.huangtl.user.entitytypeEnumsPackage: com.huangtl.user.enumsconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

我们以性别属性为例&#xff0c;我们新增一个sex字段和枚举类。示例如下&#xff1a;


package com.huangtl.user.enums;import com.baomidou.mybatisplus.annotation.EnumValue;import com.fasterxml.jackson.annotation.JsonValue;import java.util.HashMap;import java.util.Map;public enum SexEnum {MAN(0,"男"),WOMAN(1,"女"),;SexEnum(int code, String desc) {this.code &#61; code;### 最后给大家送一个小福利![](https://img-blog.csdnimg.cn/img_convert/58031cadf4a2194c51223083c9f1b164.png)资料都是免费分享的&#xff0c;附送高清脑图&#xff0c;高清知识点讲解教程&#xff0c;以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。**[点我免费领取](https://codechina.csdn.net/m0_60958482/java-p7)&#xff01;&#xff01;&#xff01;**![](https://img-blog.csdnimg.cn/img_convert/ec33e17b2f22b76ca9e289ad5520f21e.png)ckage参数&#xff0c;扫描你的枚举所在的包位置

mybatis-plus:

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

#实体扫描&#xff0c;多个package用逗号或者分号分隔

type-aliases-package: com.huangtl.user.entity

typeEnumsPackage: com.huangtl.user.enums

configuration:

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

我们以性别属性为例&#xff0c;我们新增一个sex字段和枚举类。示例如下&#xff1a;

package com.huangtl.user.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;

import com.fasterxml.jackson.annotation.JsonValue;

import java.util.HashMap;

import java.util.Map;

public enum SexEnum {

MAN(0,"男"),WOMAN(1,"女"),;SexEnum(int code, String desc) {this.code &#61; code;

最后

给大家送一个小福利

[外链图片转存中…(img-yuVFBI74-1630071393093)]

资料都是免费分享的&#xff0c;附送高清脑图&#xff0c;高清知识点讲解教程&#xff0c;以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。点我免费领取&#xff01;&#xff01;&#xff01;

[外链图片转存中…(img-fWnNVoNP-1630071393094)]


推荐阅读
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 1.使用通用mapper时实体类的mapper接口(即普通的dao接口)继承了通用mapper接口后,在依赖注入实体类的mapper接口时 ... [详细]
author-avatar
漫瀚聆静
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有