【Java】MybatisPlus

MybatisPlus

MybatisPlus是在mybatis基础上的一个增强型工具。它对mybatis的一些操作进行了简化,能够提高开发的效率。

springboot整合了mybatis之后,其实已经非常方便了,只需要导入mybatis的包后,在配置文件中编写数据源信息,然后在数据层接口上添加@Mapper注解。

但是,现在还有一个不完美的地方:数据层接口需要自己写方法,并且需要写注解写sql语句。这些都是增删改查的sql,其实重复性很大,如果能够让框架负责这部分代码的生成就完美了。

MybatisPlus正是这样的一门技术。

1、MybatisPlus快速入门

去除mybatis的依赖,转而导入MybatisPlus的依赖。

dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version>
/dependency>

然后将dao接口继承BaseMapper<实体类>。dao层接口不再需要写任何查询方法,已经具有了增删改查的方法。

mp具有动态sql的功能。比方说updateById方法是传入一个实体类,这个实体类中要有id信息,会根据id去修改对应的记录。但是,如果除了id以外其他属性不置任何值,那么修改的记录不会有任何改变。如果除了id以外还有一个属性被set了(假设总共有10个属性),其他九个属性都是空的,那么修改的记录只会修改被修改的那个值而不会改变其他属性。

2、标准数据层开发

  • 标准分页功能制作

    mp有一个分页拦截器专门用来做分页,没有配置这个拦截器就没有分页功能,配上了才有分页功能。

    在这里插入图片描述

//当前页第1页,每页条数2条
IPage<Brand> iPage=new Page<>(1,2);
brandDao.selectPage(iPage,null);
System.out.println("当前页:"+iPage.getCurrent());
System.out.println("一页条数:"+iPage.getSize());
System.out.println("一共多少页:"+iPage.getPages());
System.out.println("一共多少条数据:"+iPage.getTotal());
System.out.println("具体数据:"+iPage.getRecords());
  • 条件查询

需要创建一个容器,并填入查询条件然后交给数据层接口的方法进行查询。

QueryWrapper<Emp> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(Emp::getId, empId).eq(Emp::getEmpStatus, "1");
Emp emp = empMapper.getOne(wrapper);
  • 动态条件查询

在条件中设置不为空或者不为null才能添加条件即可。

LambdaQueryWrapper<Emp> wrapper = new LambdaQueryWrapper<Emp>().eq(!"".equals(vo.getEmpEmail()), Emp::getEMail, vo.getEmpEmail()).eq(!"".equals(vo.getEmpName()), Emp::getName, vo.getEmpName()).eq(!"".equals(vo.getEmpPhone()), Emp::getMobilePhone, vo.getEmpPhone()).eq(!"".equals(vo.getEmpPosition()), Emp::getPosition, vo.getEmpPosition()).eq(!"".equals(vo.getStoreId()), Emp::getStoreId, vo.getStoreId()).eq(Emp::getUserId, userId);
  • 逻辑删除

逻辑删除并不是真的删除,而是添加了一个表示删除的字段,如果这个字段被标记为1,就表示被删除,如果这个字段被标记为0,就表示不被删除。之后进行查询也是通过这个删除字段确定查询内容。

在这里插入图片描述

设置完逻辑删除字段以及加上注解之后,接下来使用deleteById方法,不会将记录删除,只会将逻辑删除字段的值置为1。查询时也会默认自动加上逻辑删除字段的条件,只会查询逻辑删除为1的内容。

如果有太多实体,也可以在springboot的配置文件中添加全局配置,将所有实体中的对应字段都设置为逻辑删除字段。实体中就不用加上注解了。

在这里插入图片描述

  • 复杂逻辑查询

虽然mp主要是为了简化sql语句,但是对于复杂的逻辑,还是要写sql语句的。

所以仍然可以使用在接口中定义方法进行注解的方式查询,仍然可以使用sql映射文件编写复杂的逻辑。

3、字段映射以及表名映射

这一部分主要是应用于实体类中的。

  • 表名映射

在实体类名上方使用@TableName(“数据库中的表名称”)来进行映射。

  • 字段映射

在实体类的属性(非主键)上方使用@TableField(字段名,被查询时是否展示,在表中是否存在)

在实体类的属性(主键)上方使用@TableId(字段名,type=id生成方式)

id生成方式可以自己指定。具体有以下类型:

在这里插入图片描述

注意选择雪花算法生成id类型要是long。不然存不下。

除了在注解中指定使用id生成策略以外,可以使用在springboot的配置文件中设置全局配置:

在这里插入图片描述

3、代码生成器
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;/*** @author* @since*/
public class CodeGenerator {@Testpublic void run() {// 1、创建代码生成器AutoGenerator mpg = new AutoGenerator();// 2、全局配置GlobalConfig gc = new GlobalConfig();
//        String projectPath = System.getProperty("user.dir");//生成代码的位置gc.setOutputDir("目录");//gc.setOutputDir("D:\\IDEA2020\\Project\\2023fuchuang\\system\\intelligent_schedule_system-master\\service\\schedule_service" + "/src/main/java");gc.setAuthor("作者名");gc.setOpen(false); //生成后是否打开资源管理器gc.setFileOverride(false); //重新生成时文件是否覆盖gc.setServiceName("%sService");	//去掉Service接口的首字母Igc.setIdType(IdType.ID_WORKER_STR); //主键策略gc.setDateType(DateType.ONLY_DATE); //定义生成的实体类中日期类型gc.setSwagger2(true);//开启Swagger2模式mpg.setGlobalConfig(gc);// 3、数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localHost/iss_schedule?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf8");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("123456");dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 4、包配置PackageConfig pc = new PackageConfig();pc.setParent("com.iss");//包名pc.setModuleName("schedule"); //包名pc.setController("controller");pc.setEntity("entity");pc.setService("service");pc.setMapper("mapper");mpg.setPackageInfo(pc);// 5、策略配置StrategyConfig strategy = new StrategyConfig();//要生成的表strategy.setInclude("schedule_search");strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作strategy.setRestControllerStyle(true); //restful api风格控制器strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符mpg.setStrategy(strategy);// 6、执行mpg.execute();}
}

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

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

相关文章

机器人总动员拟人后_WALL·E 机器人总动员——又是一部让名字耽误的高分电影...

WALLE 机器人总动员(2008)导演&#xff1a; 安德鲁斯坦顿简单&#xff0c;却惹人落泪的动画电影。名字叫做机器人总动员&#xff0c;说实话&#xff0c;这部电影高高的挂在豆瓣的排行榜上&#xff0c;但却因为名字被我总是忽视掉&#xff0c;我好像就是这么肤浅的人呀~电影是由…

Java DataInputStream readBoolean()方法(带示例)

DataInputStream类readBoolean()方法 (DataInputStream Class readBoolean() method) readBoolean() method is available in java.io package. readBoolean()方法在java.io包中可用。 readBoolean() method is used to check whether this stream read the boolean value or n…

python—列表

1 . 什么是列表&#xff1a; 列表形如[‘saf’,‘sf’,5,哈哈‘]&#xff0c;是一个可以储存任意数据类型的集合。需要注意的是&#xff0c;列表和数组不同&#xff0c;数组是储存统一数据类型的集合。 创建一个列表&#xff1a; zero_li [ ] #建立一个空列表li [ ‘http’…

更新SQL Server实例所有数据库表统计信息

引出问题 自从上次菜鸟为老鸟解决了《RDS SQL SERVER 解决中文乱码问题》问题&#xff0c;老鸟意犹未尽&#xff0c;决定再想个招来刁难刁难菜鸟&#xff1a;“我最近做T-SQL性能调优的时候&#xff0c;经常发现执行计划中的统计信息不准确&#xff0c;导致SQL Server查询性能低…

职工考勤管理信息系统数据库课设_数据库课程设计--职工考勤管理信息系统

目录1概述........................................................................................................................................ 11.1设计背景..................................................................................................…

python—元组

1 . 元组的创建&#xff1a; 1 . 简介 &#xff1a;元组与列表类似&#xff0c;可以存储任意数据类型。不同之处在于元组的元素不能修改。属于不可变数据类型&#xff0c;没有增删改。 2 . 创建一个元组&#xff1a; t ([1, 2, 3], ssh, True) #和列表不同是&#xff0c;元组…

java clock计时_Java Clock类| systemDefaultZone()方法与示例

java clock计时Clock Class systemDefaultZone()方法 (Clock Class systemDefaultZone() method) systemDefaultZone() method is available in java.time package. systemDefaultZone()方法在java.time包中可用。 systemDefaultZone() method is used to get the current inst…

从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

从0开始搭建SQL Server AlwaysOn 第四篇&#xff08;配置异地机房节点&#xff09; 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnblogs.com/lyhabc/p/4682028.html第三篇http://www.cnblogs.com/lyhabc/p/4682986.html第四篇http://www.cnblogs.com…

vue 左侧菜单隐藏_vue.js 左侧二级菜单显示与隐藏切换的实例代码

vue点击切换显示隐藏*{padding: 0;margin: 0;font-size: 14px;}ul{width: 200px;height: auto;}h2{background: green;border: 1px solid #fff;color: #fff;height: 30px;line-height: 30px;text-indent: 24px;}h3{background: #999;height: 24px;line-height: 24px;border: 1p…

Java LocalDateTime类| 带示例的getMinute()方法

LocalDateTime类getMinute()方法 (LocalDateTime Class getMinute() method) getMinute() method is available in java.time package. getMinute()方法在java.time包中可用。 getMinute() method is used to get minute-of-hour field value from this date-time object. getM…

python—集合

1. 集合的概念和建立&#xff1a; Python中的集合和数学中的集合类似&#xff0c;可以保存不重复的元素。它有可变集合&#xff08;set&#xff09;和不可变集合&#xff08;frozenset&#xff09;两种。 集合是不重复的并且无序的序列。 集合创建可以使用{}以及set()的方式。…

第十九天

今天是学习js的第三天&#xff0c;已经感觉脑内存不够用了。 想想后续还有这么多Php的课程要学习&#xff0c;真心有点怕怕的。希望以后时间过的慢一些&#xff0c;让我好好的掌握这门技术吧。 另外&#xff0c;学习js里面还有好多的应用需要自己去掌握&#xff0c;我希望能够通…

弹性理论法研究桩基受力计算公式_竖向荷载下群桩的承载力分析

竖向荷载下群桩的承载力分析桩基础在工程建设当中得到广泛地应用,从安全性上考虑,对群桩承载力的研究尤为重要。文章结合一工程实例,根据现场取得的静载荷试验数据,(本文共4页)阅读全文>>墙体顶部斜裂缝问题一直是困扰设计和施工人员的重要课题,以往的研究往往将这种斜裂…

Java LocalDate类| getChronology()方法与示例

LocalDate类getChronology()方法 (LocalDate Class getChronology() method) getChronology() method is available in java.time package. getChronology()方法在java.time包中可用。 getChronology() method is used to return the IsoChronology of this LocalDate object. …

python—字典

1.字典的含义&#xff1a; 字典和列表类似&#xff0c;是可变序列&#xff0c;与列表不同的是&#xff0c;字典是无序的可变序列&#xff0c;保存的内容是以 键值对 的形式存放的。键是唯一的&#xff0c;而值可以是多个。值可以取任意数据了类型&#xff0c;但键必须是不可变…

js中加“var”和不加“var”的区别,看完觉得这么多年js白学了

Javascript声明变量的时候&#xff0c;虽然用var关键字声明和不用关键字声明&#xff0c;很多时候运行并没有问题&#xff0c;但是这两种方式还是有区别的。可以正常运行的代码并不代表是合适的代码。var num 1&#xff1b; 是在当前域中声明变量. 如果在方法中声明&#xff0…

解决方案_智能工厂全套解决方案

最近弱电社群资料更新情况&#xff1a;1、弱电学习圈VIP群资料整理-希望对您有用&#xff01;2、弱电学习圈VIP技术交流2群成立&#xff0c;欢迎您加入&#xff01;3、智慧校园整体解决方案&#xff01;4、智能化弱电项目管理表单大全-弱电项目经理必备&#xff01;5、弱电项目…

退火算法 贪婪算法_算法贪婪策略简介

退火算法 贪婪算法介绍 (Introduction) The solution is determined by a sequence of steps each step has given a particular solution and later a complete solution to given the problem can be achieved. In short, while making a choice there should be a greed for…

windows 2008 R2系统安装拨号v p n详细配置

windows 2008 R2系统单网卡安装拨号v p n系统环境&#xff1a;windows 2008 R2操作步骤首先设置服务端在服务器管理器中添加角色“网络策略和访问服务”&#xff0c;并安装以下角色服务右击路由与远程访问&#xff0c;选择“配置并启用路由和远程访问”右击路由与远程访问&…

python—函数

1. 函数的定义&#xff1a; 1 . 含义&#xff1a;我们把实现某一功能的代码定义为一个函数&#xff0c;在需要使用时&#xff0c;随时调用&#xff0c;十分方便。对于函数&#xff0c;简单理解就是可以完成某功能的代码块&#xff0c;可反复使用。 Python提供了许多内建函数&a…