SpringBoot系列 整合MyBatisPlus入门

news2024/12/23 14:05:11

官网:

https://mybatis.plus/    

https://mp.baomidou.com/

由于MyBatisPlus并未被收录到idea的系统内置配置,无法直接选择加入

 pom

<dependency>    

        <groupId>com.baomidou</groupId>    

        <artifactId>mybatis-plus-boot-starter</artifactId>    

        <version>3.4.1</version>

</dependency>

定义数据接口

@Mapper

public interface UserDao extends BaseMapper<User> {

}

测试类测试:

@SpringBootTest

public class Mybatisplus01QuickstartApplicationTests {    

        @Autowired    

        private UserDao userDao;    

        @Test    

        public void  testGetAll() {        

                List<User> userList = userDao.selectList(null);                         userList.forEach(System.out::println);    

        }

}

功能                    自定义接口
新增                    boolean save(T t)
删除                    boolean delete(int id)
修改                    boolean update(T t)
根据id查询          T getById(int id)
查询全部             List<T> getAll()
分页查询             PageInfo<T> getAll(int page, int size)
按条件查询          List<T> getAll(Condition condition)

分页功能:

设置分页拦截器作为Spring管理的bean(分页功能基于拦截器实现,要加载分页功能对应的拦截器bean,分页查询的结果封装在IPage对象中)

@Configuration

public class MpCongfig {    

        @Bean    

        public MybatisPlusInterceptor pageInterceptor(){        

                MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();                         interceptor.addInnerInterceptor(new PaginationInnerInterceptor());        

                return interceptor;    

        }

}

执行分页查询

IPage page = new Page(2,3);

userDao.selectPage(page, null);

System.out.println("当前页码:"+page.getCurrent());

System.out.println("每页数据总量:"+page.getSize());

System.out.println("总页数:"+page.getPages());

System.out.println("数据总量:"+page.getTotal());

System.out.println("当前页数据:"+page.getRecords());

开启日志

mybatis-plus:  

  configuration:    

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

DQL编程控制

条件查询方式

QueryWrapper<User> qw = new QueryWrapper<User>();

List<User> userList = userDao.selectList(null);

System.out.println(userList);

格式一:常规格式

QueryWrapper<User> qw = new QueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

qw.lt("age",65); qw.ge("age",18);

List<User> userList = userDao.selectList(qw);

System.out.println(userList);

格式二:链式编程格式

QueryWrapper<User> qw = new QueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

qw.lt("age",65).ge("age",18);

List<User> userList = userDao.selectList(qw);

System.out.println(userList);

格式三:lambda格式

QueryWrapper<User> qw = new QueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

qw.lambda().lt(User::getAge,65).ge(User::getAge,18);

List<User> userList = userDao.selectList(qw);

System.out.println(userList);

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

lqw.lt(User::getAge,65).ge(User::getAge,18);

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

组合查询条件

and

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

lqw.lt(User::getAge,65).ge(User::getAge,18);

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

or

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

lqw.lt(User::getAge,65).or().ge(User::getAge,18);

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

null值处理

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();

lqw.ge(null != userQuery.getAge(),User::getAge,userQuery.getAge()) .lt(null != userQuery.getAge2(),User::getAge, userQuery.getAge2());

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

查询投影

只要部分字段:

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.select(User::getId,User::getName,User::getAge);

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

QueryWrapper<User> qm = new QueryWrapper<User>();

qm.select("count(*) as nums,gender");

qm.groupBy("gender");

List<Map<String, Object>> maps = userDao.selectMaps(qm);

System.out.println(maps);

查询条件设定

eq

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.eq(User::getName, userQuery.getName()).eq(User::getPassword, userQuery.getPassword()); User loginUser = userDao.selectOne(lqw);

System.out.println(loginUser);

le;ge

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.eq(User::getName, userQuery.getName()).eq(User::getPassword, userQuery.getPassword()); User loginUser = userDao.selectOne(lqw);

System.out.println(loginUser);

like

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.likeLeft(User::getTel,userQuery.getTel());

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

官网的条件查看:

条件构造器 | MyBatis-Plus

字段映射与表名映射

当代码字段和数据库字段不匹配时,一般都不改数据库,而是在代码上处理对应字段:

//当前类对应与数据库表进行映射,tbl_user是数据库的表名

@TableName("tbl_user")

public class User {  

        // pwd为数据库中的字段

        @TableField(value="pwd")    

        //如果有不想被查出来的数据,如密码,就将select属性设置为false

        @TableField(value="pwd",select = false)

        private String password;  

        //online是代码中有,而数据库中没有的字段

        @TableField(exist = false)    

        private Integer online;  

}

DML编程控制

id生成策略控制,

AUTO(0):使用数据库id自增策略控制id生成

NONE(1):不设置id生成策略

INPUT(2):用户手工输入id

ASSIGN_ID(3):雪花算法生成id(可兼容数值型与字符串型)

        0   00100110111011010101100001101010011000110   10000   10001   000000000010

   占位                        时间戳(41)                                                机器码(5+5)        序列号(12)

ASSIGN_UUID(4):以UUID生成算法作为id生成策略

public class User {    

        @TableId(type = IdType.AUTO)    

        private Long id;

}

全局配置id和表前缀

mybatis-plus:  

  global-config:    

    db-config:      

      id-type: auto      

      table-prefix: tbl_

批量操作:

删除

List<Long> ids= Arrays.asList(new Long[]{2,3});

userDao.deleteBatchIds(ids);

查询

List<Long> ids= Arrays.asList(new Long[]{2,3});

List<User> userList = userDao.selectBatchIds(ids);

逻辑删除

数据库中添加一个字段用来标记数据是否可用。

public class User {    

        private Long id;    

        @TableLogic    

        private Integer deleted;    

配置逻辑删除字面值

mybatis-plus:  

  global-config:    

    db-config:      

      logic-delete-field: deleted      

      logic-not-delete-value: 0      

      logic-delete-value: 1  #删除后的值

实际执行的sql是这样的:UPDATE tbl_user SET deleted=1 WHERE id=? AND deleted=0

乐观锁

应对并发问题。

数据库表中添加锁标记字段:

public class User {    

        private Long id;    

        @Version    

        private Integer version;

配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装:

@Configuration

public class MpConfig {    

        @Bean    

        public MybatisPlusInterceptor mpInterceptor() {        

                MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();                         mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());        

                return mpInterceptor;    

        }

}

使用乐观锁

在修改前先获取到对应数据的verion方可用到乐观锁功能。

代码生成器

<dependency>    

        <groupId>com.baomidou</groupId>    

        <artifactId>mybatis-plus-generator</artifactId>    

        <version>3.4.1</version>

</dependency>

<dependency>    

        <groupId>org.apache.velocity</groupId>    

        <artifactId>velocity-engine-core</artifactId>    

        <version>2.3</version>

</dependency>

CodeGenerator

public class CodeGenerator {
    public static void main(String[] args) {
        //1.获取代码生成器的对象
        AutoGenerator autoGenerator = new AutoGenerator();

        //设置数据库相关配置
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);

        //设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/mybatisplus_04_generator/src/main/java");    //设置代码生成位置
        globalConfig.setOpen(false);    //设置生成完毕后是否打开生成代码所在的目录
        globalConfig.setAuthor("joshua");    //设置作者
        globalConfig.setFileOverride(true);     //设置是否覆盖原始生成的文件
        globalConfig.setMapperName("%sDao");    //设置数据层接口名,%s为占位符,指代模块名称
        globalConfig.setIdType(IdType.ASSIGN_ID);   //设置Id生成策略
        autoGenerator.setGlobalConfig(globalConfig);

        //设置包名相关配置
        PackageConfig packageInfo = new PackageConfig();
        packageInfo.setParent("com.aaa");   //设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
        packageInfo.setEntity("domain");    //设置实体类包名
        packageInfo.setMapper("dao");   //设置数据层包名
        autoGenerator.setPackageInfo(packageInfo);

        //策略设置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("tbl_user");  //设置当前参与生成的表名,参数为可变参数
        strategyConfig.setTablePrefix("tbl_");  //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名  例如: User = tbl_user - tbl_
        strategyConfig.setRestControllerStyle(true);    //设置是否启用Rest风格
        strategyConfig.setVersionFieldName("version");  //设置乐观锁字段名
        strategyConfig.setLogicDeleteFieldName("deleted");  //设置逻辑删除字段名
        strategyConfig.setEntityLombokModel(true);  //设置是否启用lombok
        autoGenerator.setStrategy(strategyConfig);
        //2.执行生成操作
        autoGenerator.execute();
    }
}

Generator

public class Generator {
    public static void main(String[] args) {

        //创建代码生成器对象,执行生成代码操作
        AutoGenerator autoGenerator = new AutoGenerator();

        //数据源相关配置:读取数据库中的信息,根据数据库表结构生成代码 DataSourceConfig

        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);

        autoGenerator.execute();
    }
}
 

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

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

相关文章

【string类的简单模拟实现】

目录 1 类中成员变量的声明 2 迭代器 3 一些常用接口 4 六大默认函数 4.1 构造 4.2 拷贝构造 4.3 赋值运算符重载 4.4 析构 5 开空间&&增删查改 6 其他运算符重载 1 类中成员变量的声明 通过上一篇文章对string类的简单使用相信大家对于string类中成员变量已…

Android so库开发——Swig工具使用(五)

SWIG 是一种软件开发工具&#xff0c;它将 C 和 C 编写的程序与各种高级编程语言连接起来。这里我们用它来将 C/C 转换成 Java。 一、Swig安装 1、下载 官网&#xff1a;SWIG官网下载 源码链接 GitHub&#xff1a;https://github.com/swig/swig.git 这两个地址可能会出现无…

关于Java中的BigDecimal

文章目录为什么用BigDecimalBigDecimal构造方法通过静态方法创建BigDecimal对象BigDecimal常用API关于除法运算的roundingMode将BigDecimal转换为基本类型代码展示小结其他文章为什么用BigDecimal 使用float、double及其对应的包装类时&#xff0c;运算精度可能不满足需求 flo…

scrollTo() 无效问题处理

需求&#xff1a; 实现访问当前页面直接滚动到最底部 方案&#xff1a;window对象的scrollTo()方法 API介绍&#xff1a; 参数接收一个点&#xff08;文档坐标&#xff09;&#xff0c;让该点位于左上角。 可选参数为behavior(设置滚动的效果&#xff09; 错误案例&#xff1a;…

【My Electronic Notes系列——数制与编码】

目录 序言&#xff1a; &#x1f3c6;&#x1f3c6;人生在世&#xff0c;成功并非易事&#xff0c;他需要破茧而出的决心&#xff0c;他需要永不放弃的信念&#xff0c;他需要水滴石穿的坚持&#xff0c;他需要自强不息的勇气&#xff0c;他需要无畏无惧的凛然。要想成功&…

剑指 Offer II 005单词长度的最大乘积

给定一个字符串数组 words&#xff0c;请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时&#xff0c;它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串&#xff0c;返回 0。 示例 1: 输入: words ["abcw"…

前端CSS第二阶段-001

&#x1f60a;博主页面&#xff1a;鱿年年 &#x1f449;博主推荐专栏&#xff1a;《WEB前端》&#x1f448; ​&#x1f493;博主格言&#xff1a;追风赶月莫停留&#xff0c;平芜尽处是春山❤️ 目录 第二阶段学习目标 一、Emmet语法 1.快速生成HTML结构语法 2.快速生成…

在Runtime下,IL2CPP与Mono打包对应的PSS内存占用问题

1&#xff09;在Runtime下&#xff0c;IL2CPP与Mono打包对应的PSS内存占用问题 ​2&#xff09;获得AssetBundle内部依赖关系的方法 3&#xff09;Unity 2019 Streaming Mipmap在某些情况下采样等级错误 4&#xff09;根据RenderDoc的数据&#xff0c;计算渲染量 这是第322篇UW…

2024年部分MBA/MEM项目提面日程已经开启,气氛已然开始渐涨了

进入到二月份&#xff0c;一切都将愈发生机盎然&#xff01;全国范围内的MBA/MEM/MPA项目都有各自的招生节奏和特点&#xff0c;提前批面试作为项目招考的重要方式之一&#xff0c;每年都会从年初开始陆续开放申请&#xff0c;而对于像浙大等名校来说&#xff0c;提前批面试的批…

mysql:数据库调优策略,sql调优

mysql&#xff1a;数据库调优策略。 硬件&#xff0c;系统配置&#xff0c;数据库表结构&#xff0c;sql及索引通过这些方面来优化项目的数据库层面。 越往后成本越低&#xff0c;但是效果确实越好。 第1步&#xff1a;选择适合的 DBMS第2步&#xff1a;优化表设计第3步&#…

【Java】面向对象笔记(下)

static关键字 static 静态 什么是静态 主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象&#xff0c;也能使用属性和调用方法&#xff01; static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何…

数字授权如何满足工业软件多样化需求?

前言数字化转型的洪流正在不断对工业软件提出新的要求。在包括“智能工厂”、“智能生产”以及“智能物流”在内的主要领域里&#xff0c;工业软件正逐渐向智能化、嵌入式、分布式、互联化的方向演进。传统的软件保护和授权方式并不能适应工业软件新形式的需求。一方面&#xf…

蓝桥杯 stm32 RTC实时时钟

文章代码使用 HAL 库。 文章目录前言一、RTC 重要特性&#xff1a;二、CubeMX 创建工程。三、读取系统日期 函数。四、读取系统时间 函数。四、在 LCD 上显示 时间。总结实验效果前言 RTC (Real Time Clock)&#xff1a; 实时时钟。 RTC 模块拥有一个连续计数的 计数器&#…

mysql:有哪些索引,什么时候创建索引,什么时候不创建索引,创建索引的原则有哪些。

最近学习mysql&#xff0c;学习的索引的一些总结。 1.哪些索引 普通索引唯一性索引主键索引单列索引多列(组合、联合)索引全文索引补充&#xff1a;空间索引 小结&#xff1a;不同的存储引擎支持的索引类型也不一样 InnoDB &#xff1a;支持 B树。MyISAM &#xff1a; 支持…

基于JavaWeb的校园故障报修系统

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

Java里面为什么搞了双重检查锁,写完这篇文章终于真相大白了

双重检查锁定与延迟初始化 在 java 程序中&#xff0c;有时候可能需要推迟一些高开销的对象初始化操作&#xff0c;并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧&#xff0c;否则很容易出现问题。比如…

城市POI数据爬取-百度地图版

1 API说明 目前百度地图的最新版为地图检索V2.0服务。详细介绍可以通过开发文档-web服务Api-地点检索V2.0获取。 在使用API前需要提前注册账号获取ak。对于免费账号&#xff1a;目前的每日访问次数是100次&#xff0c;最多可以获取2000条数据。 如不需讲解仅需要下载代码&am…

阿里软件架构师手写JDK源码,看完真的膜拜

最近有不少小伙伴在后台留言&#xff0c;说 Java 的面试越来越难了&#xff0c;尤其是技术面&#xff0c;考察得越来越细&#xff0c;越来越底层。 通过和大厂的面试官聊了一下发现&#xff0c;现在大厂特别爱考底层的一些原理&#xff0c;因为一些底层是不涉及到语言的&#x…

【Linux】进程状态的理解

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》&#x1f448; 猛戳订阅 &#x1f525; &#x1f4ad; 写在前面&#xff1a;本章我们专门讲解进程的状态。我们先学习具体的 Linux 系统状态&#xff0c;再去介绍 OS 学科面对的概念如何理解 —— 运行态、终止态、阻…

二叉树的基础应用

二叉树 树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点…