Mybatis-Plus 进阶开发 -- Mybatis-Plus 入门教程(二)(2)

简介: Mybatis-Plus 进阶开发 -- Mybatis-Plus 入门教程(二)

4. 查询投影

  1. 如果我们只希望返回某些列的数据,而不是所有列的数据,我们可以用SELECT 列1, 列2, 列3 FROM …,让结果集仅包含指定列。这种操作称为【投影查询

2.lambda表达式查询指定字段

@Test
    void testGetAll() {
        //查询投影
        //创建LambdaQueryWrapper类对象,并指定泛型
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //lambda表达式查询指定字段
        lqw.select(User::getId, User::getAge);
        //将条件Wrapper<T>类型的参数传入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
  • 运行结果

  1. 如果使用的不是lambda表达式,就需要手动指定字段
@Test
    void testGetAll() {
        //查询投影
        //创建QueryWrapper类对象,并指定泛型
        QueryWrapper<User> lqw = new QueryWrapper<User>();
        //非lambda表达式查询指定字段
        lqw.select("age", "id", "password");
        //将条件Wrapper<T>类型的参数传入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
  • 运行结果

  1. 聚合查询 selectMaps()(count、max、min、avg、sum)
@Test
    void testGetAll() {
        //查询投影
        //创建QueryWrapper类对象,并指定泛型
        QueryWrapper<User> lqw = new QueryWrapper<User>();
        //聚合查询(count、max、min、avg、sum),lambda无法做聚合查询
        //as 起别名
        //查询表中有多少条记录
        lqw.select("count(*) as count");
        //将条件Wrapper<T>类型的参数传入selectMaps()方法中
        List<Map<String, Object>> userList = userDao.selectMaps(lqw);
        System.out.println(userList);
    }
  • 运行结果(结果集 Map 中 count 是 key, 4 是value)

  1. 分组查询( gruopBy() )
@Test
    void testGetAll() {
        //查询投影
        //创建QueryWrapper类对象,并指定泛型
        QueryWrapper<User> lqw = new QueryWrapper<User>();
        //分组查询(groupby)
        //as 起别名
        //按电话分组并分别计数
        lqw.select("count(*) as count, tel");
        lqw.groupBy("tel");
        //将条件Wrapper<T>类型的参数传入selectMaps()方法中
        List<Map<String, Object>> userList = userDao.selectMaps(lqw);
        System.out.println(userList);
    }
  • 运行结果

  1. 模糊查询(like)
@Test
    void testGetAll() {
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //模糊匹配 like, Left 和 Right指的是%在左边还是右边
        lqw.likeRight(User::getName,"J");
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
  1. 更多请见【官方条件构造器详解】【查询投影详解

5.映射匹配兼容性(@TableField()和@TableName())

  1. 问题一 :表字段与编码属性设计不匹配
  • 如图表字段为 ‘pwd’ ,而实体类为 ‘password’,查询会出现异常,可以在实体类中通过 @TableField(value = “pwd”) 注解将实体类属性与表名进行映射匹配

  1. 问题二 :编码中添加了数据库中未定义的属性
    如图,实体类中有用于判断用户是否在线的online属性,而数据库中没有相应的字段,查询会出现异常,可以通过 @TableField(exist = false) 设置该属性在数据库中不存在

  1. 问题三 :采用默认查询开发了更多字段查看权限
    如图,用户密码默认在查询字段中,而该字段并不随便对外开放,可以用**@TableField(select = false)**将该字段的查询权限关闭

  1. 问题四 :表名与编码开发设计不同步
    可以通过 @TableName(“tbl_user”) 注解将实体类名与数据库表名关联起来

6.id生成策略(@TableId()或全局配置)

  1. Mybatis-plus提供了多种主键生成策略, 可以在Pojo类中主键上加注解进行配置,例如数据库主键自增 @TableId(type=IdType.AUTO)
  2. 不同的表应用不同的id生成策略:
日志:自增(1,2,3,4,……)
 购物订单:特殊规则(FQ23948AK3843)
 外卖单:关联地区日期等信息(10 04 20200314 34 91)
 关系表:可省略id
 ……
  1. 策略种类

  1. 全局配置id生成策略

假设我们希望默认全部都使用 AUTO 策略(数据库ID自增),那么可以在 application.yml 中添加如下配置进行修改:

mybatis-plus.global-config.db-config.id-type=auto

7.多数据操作(_BatchIds())

  1. 应用场景
    购物车删除多条记录
  2. 在testSave()方法中添加两条新纪录,效果如图

  1. 删除多条记录( deleteBatchIds ( Collection<> ) )
  • 代码
@Test
    void testDelete(){
        //删除指定多条数据
        List<Long> list = new ArrayList<>();
        list.add(12L);
        list.add(13L);
        userDao.deleteBatchIds(list);
    }
  • 运行结果

  1. 查询多条记录
  • 代码

  • 运行结果

六、CRUD进阶开发II

1.逻辑删除( @TableLogic() 或者 全局配置)

  1. 应用场景
  • 假如编号为1的员工辞职了,他的姓名,工号等信息要删除,但是他工作的合同编号,成交日期,金额等信息需要保留,如果直接执行按id删除操作,会把所有相关的数据删除掉,逻辑删除可以解决这个问题。
  • 逻辑删除指的是修改数据的某个字段,使其表示为已删除状态,而非删除数据,保留该数据在数据库中,但是查询时不显示该数据(查询时过滤掉该数据)。
  1. 在navicat中右键user表,点击设计表选项添加字段delete, 并设置默认值为0,代表未进行逻辑删除,然后点击保存

3.在对应的user实体类中添加逻辑删除字段 deleted , 并通过 @TableLogic() 注解设置未进行逻辑删除的值 value 和 逻辑删除的值 delval

//lombok
@Data
@TableName("user")
public class User {
    //设置主键生成策略
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    @TableField(value = "pwd",select = false)
    private String password;
    private Integer age;
    private String tel;
    //逻辑删除字段,标记当前记录是否被删除
    @TableLogic(value = "0" ,delval = "1")
    private Integer deleted;
}
  1. 在测试类中的 testDelete() 方法方法中删除id为1的记录
  • 代码
@Test
    void testDelete(){
        //模拟逻辑删除
        userDao.deleteById(1L);
    }
  • 运行结果

从控制台输出以及表更新后的情况来看,可以知道逻辑删除做的其实是更新操作,并且此时查询全部不设置条件会默认查询 逻辑删除字段 deleted = 0(自定义的值)的记录

  1. 在全局配置中配置逻辑删除相关信息
  • 在注解中的字符串里配置容易出错,我们可以在全局配置文件中配置逻辑删除的相关参数

  • MyBatisPlus全局配置示例
global-config:
    db-config: 
       #全局配置逻辑删除字段名
       logic-delete-field: deleted
       #逻辑已删除值(默认1)
       logic-delete-value: 1
       #逻辑未删除值(默认0)
       logic-not-delete-value: 0

相关文章
|
3天前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
28 13
|
2月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
78 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
2月前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
177 0
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
3月前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
3月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
4月前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
302 0
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
152 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
81 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
2月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
558 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
2月前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
31 0
mybatis使用二:springboot 整合 mybatis,创建开发环境