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

相关文章
|
2月前
|
Java 数据库连接 微服务
若依微服务的Mybatis-plus集成过程:一份详细的入门教程。
以上就是Spring Boot项目中集成MyBatis Plus的详细步骤。集成成功后,你就可以使用Mybatis-plus提供的强大功能,让你的增删改查操作更为简单。以上步骤简单易懂,非常适合初学者使用。希望对您有所帮助。
229 20
|
6月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
233 2
|
7月前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
455 13
|
9月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
204 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
9月前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
412 0
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
10月前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
10月前
|
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
|
18天前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
Spring boot 使用mybatis generator 自动生成代码插件
|
4月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
97 0
|
9月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
324 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。