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月前
|
数据采集 Java 关系型数据库
Java代码高效连接数据库
Java代码高效连接数据库
20 2
|
1月前
|
存储 数据库 Python
用Python代码表示数据库
用Python代码表示数据库
15 0
|
4月前
|
数据库
电子好书发您分享《《阿里云数据库案例集客户案例集》电子书》
电子好书发您分享《《阿里云数据库案例集客户案例集》电子书》
203 2
|
4月前
|
SQL 弹性计算 关系型数据库
服务器数据恢复-华为ECS云服务器mysql数据库数据恢复案例
云服务器数据恢复环境: 华为ECS云服务器,linux操作系统,mysql数据库(innodb引擎)。作为网站服务器使用。 云服务器故障: 在执行mysql数据库版本更新测试时,误将本应该在测试库上执行的sql脚本执行在生产库上了,生产库上的部分表被truncate,部分表内有少量数据被delete。 需要恢复被truncate的表以及被少量数据被delete的表。
服务器数据恢复-华为ECS云服务器mysql数据库数据恢复案例
|
5天前
|
NoSQL MongoDB 数据库
MongoDB数据恢复—MongoDB数据库文件被破坏的数据恢复案例
服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分区进行了格式化操作,然后将数据库文件拷回原分区,重新启动MongoDB服务,服务无法启动。
|
17天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
1月前
|
SQL Oracle 关系型数据库
干货!sqlserver数据库所有知识点总结整理,含代码(挺全的)
干货!sqlserver数据库所有知识点总结整理,含代码(挺全的)
12 0
|
1月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库误truncate table的数据恢复案例
北京某国企客户Oracle 11g R2数据库误truncate table CM_CHECK_ITEM_HIS,表数据丢失,业务查询到该表时报错,数据库的备份不可用,无法查询表数据。 Oracle数据库执行Truncate命令的原理:在执行Truncate命令后ORACLE会在数据字典和Segment Header中更新表的Data Object ID,但不会修改实际数据部分的块。由于数据字典与段头的DATA_OBJECT_ID与后续的数据块中的并不一致,所以ORACLE服务进程在读取全表数据时不会读取到已经被TRUNCATE的记录,但是实际数据未被覆盖。
Oracle数据恢复—Oracle数据库误truncate table的数据恢复案例
|
1月前
|
存储 前端开发 安全
酒店客房管理系统设计与实现(代码+数据库+文档)
酒店客房管理系统设计与实现(代码+数据库+文档)
|
1月前
|
存储 JavaScript 前端开发
基于SpringBoot的医护人员排班系统(代码+数据库+文档)
基于SpringBoot的医护人员排班系统(代码+数据库+文档)

热门文章

最新文章