mybaits-plus通用CRUD详解及代码案例(下)

简介: mybaits-plus通用CRUD详解及代码案例

根据条件更新(可以更新NULL)


上边根据id更新 根据条件更新的方法只能将对象中不为NULL的属性更新到表中,下边通过UpdateWrapper进行更新,将birthday字段更新为NULL。


    //根据条件进行更新,可以将为NULl的值更新到数据库
    @Test
    public void testUpdate3(){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("name","曹操").set("birthday",null);
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.update(null,updateWrapper);
        System.out.println(i);
    }



还可以同时更新多个属性


    //根据条件进行更新,可以将为NULl的值更新到数据库
    @Test
    public void testUpdate4(){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("name","曹操").set("age", 999).set("birthday",null);
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.update(null,updateWrapper);
        System.out.println(i);
    }



删除操作


根据id删除


方法定义:


/**
*根 据 ID 删 除
*
*@param id 主键ID
*/
int deleteById(Serializable id);


删除步骤:


  1. 指定要删除记录的主键值。


  1. 调用deleteById方法执行删除。


测试用例:


@Test
public void testDeleteById() {
//执行删除操作
  int result = this.userMapper.deleteById(6L); 
  System.out.println("result = " + result);
}


根据 entity 条件删除


方法定义:


/**
*根据 entity 条件,删除记录
*
*@param wrapper 实体对象封装操作类(可以为 null)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);


删除步骤:


根据条件删除步骤:


  1. 定义对象,设置属性值,指定删除条件 ,可指定多个删除条件注意:删除条件只匹配对象中不为NULL的属性值


  1. 设置QueryWrapper


  1. 执行删除


测试案例:


    @Test
    public void testDelete(){
        //设置条件
        User user = new User();
        user.setAge(999);
        user.setName("曹操1");
        QueryWrapper<User> queryWrapper  =new QueryWrapper<>(user);
        //根据条件删除
        int delete = userMapper.delete(queryWrapper);
        System.out.println(delete);
    }


注意:定义QueryWrapper可以不包装模型对象,手动设置条件,如下:


    @Test
    public void testDelete(){
        //设置条件
        QueryWrapper<User> queryWrapper  =new QueryWrapper<>();
        queryWrapper.eq("age",999);
        queryWrapper.eq("name","曹操1");
        //根据条件删除
        int delete = userMapper.delete(queryWrapper);
        System.out.println(delete);
    }


上面两种写法是一样的,运行结果如下:



影响了一行,看一下数据库前后,确实删掉了:




根据ID 批量删除


方法定义:


/**
*删除(根据ID 批量删除)
*
*@param idList 主键ID列表(不能为 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);


删除步骤:


批量删除操作步骤:


  1. 指定 id列表


  1. 执行删除


测试案例:


删除id为101、102、103的


    //批量删除
    @Test
    public void testDelete2(){
        //根据条件删除
        int delete = userMapper.deleteBatchIds(Arrays.asList(101L,102L,103L));
        System.out.println(delete);
    }


查询操作


MP提供了多种查询操作,包括根据id查询 批量查询 查询单条数据 查询列表 分页查询等操作。


根据id查询


方法定义:


/**
*根 据 ID 查 询
*
*@param id 主键ID
*/
T selectById(Serializable id);


查询步骤:


根据id查询步骤:


  1. 设置查询记录的主键值。


  1. 执行查询。


  1. 查询结果返回一个对象。


注意:这里返回的就是对象了,之前都是返回影响的行数。


测试用例:


@Test
public void testSelectById() {
  //根据id查询数据
  User user = this.userMapper.selectById(2L);
  System.out.println("result = " + user);
}


查询结果:



根据id批量查询


方法定义:


/**
*查询(根据ID 批量查询)
*
*@param idList 主键ID列表(不能为 null 以及 empty)
*/
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);


查询步骤:


根据id列表查询:


  1. 设置id列表


  1. 执行查询


  1. 查询对象返回List


注意:这里返回的就是对象list了


测试案例:


@Test
public void testSelectBatchIds() {
  //根据id集合批量查询
  List<User> users = this.userMapper.selectBatchIds(Arrays.asList(2L, 3L, 10L)); 
  for (User user : users) {
    System.out.println(user);
  }
}


查询结果:



根据 entity 条件查询一条记录


方法定义:


/**
*根据 entity 条件,查询一条记录
*
*@param queryWrapper 实体对象封装操作类(可以为 null)
*/
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);


查询步骤:


  1. 设置QueryWrapper对象,设置查询条件,可以设置多个条件


  1. 执行查询


注意:如果查询结果为多条记录则报错(TooManyResultsException)。


测试案例:


    @Test
    public void testSelectOne(){
        QueryWrapper<User> queryWrapper  =new QueryWrapper<>();
        queryWrapper.eq("name","张三");
        //根据条件查询,只能查询出一条记录,否则报错
        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);
    }


查询结果:



根据 Wrapper 条件查询总记录数


方法定义:


/**
*根据 Wrapper 条件,查询总记录数
*
*@param queryWrapper 实体对象封装操作类(可以为 null)
*/
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);


测试案例:


@Test
public void testSelectCount() {
  QueryWrapper<User> wrapper = new QueryWrapper<User>(); 
  wrapper.gt("age", 23); //年龄大于23岁
  //根据条件查询数据条数
  Integer count = this.userMapper.selectCount(wrapper); 
  System.out.println("count = " + count);
}


运行结果为:count = 2


点进gt方法的声明类里,还可以看到其的 Wrapper 条件:



根据 entity 条件查询全部记录


方法定义:


/**
*根据 entity 条件,查询全部记录
*
*@param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);


测试案例:


    @Test
    public void testSelectList() {
        QueryWrapper<User> wrapper = new QueryWrapper<User>();
        wrapper.gt("age", 23);
        //年龄大于23岁
        // 根据条件查询数据
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println("user = " + user);
        }
    }


运行结果为:



根据 entity 条件查询全部记录(并翻页)


方法定义:


/**
*根据 entity 条件,查询全部记录(并翻页)
*
*@param page  分页查询条件(可以为 RowBounds.DEFAULT)
*@param queryWrapper 实体对象封装操作类(可以为 null)
*/
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);


测试案例:


    @Test
    public void testSelectPage() {
        //条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("name","张三");//等于
        queryWrapper.gt("age", 20);//大于?
        //用构造方法设置当前页码,每页记录数
        int pageIndex = 2;//当前页码
        int size = 3;//每页记录数
        Page<User> page = new Page<>(pageIndex, size);
        IPage<User> userIPage = userMapper.selectPage(page, queryWrapper);
        // 打印一下记录信息
        long pages = userIPage.getPages();//总页数
        long total = userIPage.getTotal();//总记录数
        System.out.println("数据总条数 :" + total);
        System.out.println("总页数:" + pages);
        //记录列表
        List<User> records = userIPage.getRecords();
        System.out.println(records);
    }


运行结果:


2022-03-23 21:14:39.335 DEBUG 138796 --- [           main] c.b.m.e.p.p.o.JsqlParserCountOptimize    :  JsqlParserCountOptimize sql=SELECT  id,user_name,password,name,age,email,birthday  FROM tb_user 
 WHERE age > ?
2022-03-23 21:14:39.372 DEBUG 138796 --- [           main] c.i.mp.mapper.UserMapper.selectPage      : ==>  Preparing: SELECT COUNT(1) FROM tb_user WHERE age > ? 
2022-03-23 21:14:39.402 DEBUG 138796 --- [           main] c.i.mp.mapper.UserMapper.selectPage      : ==> Parameters: 20(Integer)
2022-03-23 21:14:39.558 DEBUG 138796 --- [           main] c.i.mp.mapper.UserMapper.selectPage      : ==>  Preparing: SELECT id,user_name,password,name,age,email,birthday FROM tb_user WHERE age > ? LIMIT ?,? 
2022-03-23 21:14:39.559 DEBUG 138796 --- [           main] c.i.mp.mapper.UserMapper.selectPage      : ==> Parameters: 20(Integer), 3(Long), 3(Long)
2022-03-23 21:14:39.715 DEBUG 138796 --- [           main] c.i.mp.mapper.UserMapper.selectPage      : <==      Total: 3
2022-03-23 21:14:39.716 DEBUG 138796 --- [           main] org.mybatis.spring.SqlSessionUtils       : Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7fd987ef]
数据总条数 :6
总页数:2
[User(id=5, userName=sunqi, password=123456, name=孙七, age=24, email=test5@itcast.cn, birthday=2022-03-09T00:00), User(id=1506541267385905153, userName=caocao, password=12222, name=曹操, age=999, email=null, birthday=null), User(id=1506541407249121282, userName=caocao, password=12222, name=曹操, age=999, email=null, birthday=null)]
相关文章
|
1月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
131 6
|
20天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
37 2
|
25天前
|
存储 数据挖掘 数据库
数据库数据恢复—SQLserver数据库ndf文件大小变为0KB的数据恢复案例
一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,数据库不可用。管理员试图恢复数据库,发现有数个ndf文件大小变为0KB。 虽然NDF文件大小变为0KB,但是NDF文件在磁盘上还可能存在。可以尝试通过扫描&拼接数据库碎片来恢复NDF文件,然后修复数据库。
|
25天前
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
46 3
|
1月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
46 15
|
28天前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
1月前
|
Oracle 关系型数据库 数据库
oracle数据恢复—Oracle数据库文件损坏导致数据库打不开的数据恢复案例
打开oracle数据库时报错,报错信息:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。急需恢复zxfg用户下的数据。 出现上述报错的原因有:控制文件损坏、数据文件损坏、数据文件与控制文件的SCN不一致等。数据恢复工程师对数据库文件做进一步检测分析后发现sysaux01.dbf文件有坏块。修复sysaux01.dbf文件,启动数据库依然有许多查询报错。export和data pump工具无法使用,查询告警日志并分析报错,确认发生上述错误的原因就是sysaux01.dbf文件损坏。由于该文件损坏,从数据库层面无法修复数据库。由于system和用户表空间的数据文件是正常的,
|
10天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
25 1
|
12天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
28 4
|
19天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
87 1