MyBatisPlus Mapper层的CRUD

会当凌绝顶,一览众山小

| @Author:TTODS

MyBatisPlus框架系列文章目录:

前言

<<Springboot整合Mybatisplus>>的例子中我们使用了UserMapperselectById方法,但是我们并没有实现这个方法,也没有写xml文件。这是因为我们继承了mybatis-plus提供的通用Mapper接口BaseMapper<T>.

Mybatis-plus通过BaseMapper<T>接口提供了Mapper层基本的增删改查操作。本文我们继续来看一下这个BaseMapper<T>提供了哪些CRUD方法,以及如何使用这些方法.

insert方法
  • insert

        int insert(T entity);// 插入一条记录
    
        @Test
        public void testInsert(){
            // 新建一个对象
            User user = new User();
            user.setName("Frank");
            user.setAge(35);
            user.setGender(1);
            user.setEmail("frank@gmail.com");
            // 调用插入方法(执行出错请往下看)
            userMapper.insert(user);
        }
    

    报错:Could not set property ‘id’ of ‘class com.example.pojo.User’ with value ‘1452179065226420225’

    原因是我们没有为user对象设置id的值,虽然我们在数据库中设置了其为自增字段,但是Mybatis-plus不知道,所以 自作主张的设置了一个随机值,我们为User类中的id字段添加@TableId注解,并将其type属性设置为IdType.Auto.告诉mybatis-plus这个字段是表的主键,且该主键设置了自增.

        @Data
        public class User {
            @TableId(type = IdType.AUTO)
            private Integer id;
            private String name;
            private Integer age;
            private Integer gender;
            private String email;
        }
    

    再次运行测试代码,即可运行成功。

    检查数据库,成功插入。
    在这里插入图片描述

delete方法
int deleteById(Serializable id); //根据 ID 删除

int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); //根据 columnMap 条件,删除记录

int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); // 根据 entity 条件,删除记录

int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 删除(根据ID 批量删除)

关于delete方法的使用请对照下文的select方法。

update方法
int updateById(@Param(Constants.ENTITY) T entity); // 根据 ID 修改

int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); //根据 whereEntity 条件,更新记录
  • updateById

    @Test
        public void testUpdateById(){
    		// 将id为1的用户年龄加1
            User user = userMapper.selectById(1);
            Integer age = user.getAge();
            user.setAge(age +1);
            userMapper.updateById(user);
        }
    

    生成的sql语句及输出:

    ==>  Preparing: SELECT id,name,age,gender,email FROM user WHERE id=?
    ==> Parameters: 1(Integer)
    <==      Total: 1
    ==>  Preparing: UPDATE user SET name=?, age=?, gender=?, email=? WHERE id=?
    ==> Parameters: Alice(String), 16(Integer), 0(Integer), alice@gmail.com(String), 1(Integer)
    <==    Updates: 1
    

    查看数据库,修改成功。
    在这里插入图片描述

  • update

        @Test
        public void testUpdate(){
            // 将id为1的用户年龄加1
            User user = userMapper.selectById(1);
            UpdateWrapper<User> wrapper = new UpdateWrapper<>();
            wrapper.set("age",user.getAge()+1).eq("id",1);
            userMapper.update(null,wrapper);
        }
    

    生成的sql语句及输出:

    ==>  Preparing: SELECT id,name,age,gender,email FROM user WHERE id=?
    ==> Parameters: 1(Integer)
    <==      Total: 1
    ==>  Preparing: UPDATE user SET age=? WHERE (id = ?)
    ==> Parameters: 17(Integer), 1(Integer)
    <==    Updates: 1
    

    查看数据库,修改成功。
    在这里插入图片描述
    关于Wrapper的更多信息请查阅官方文档

select方法
 	T selectById(Serializable id); //根据 ID 查询

    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 查询(根据ID 批量查询)

    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);	//查询(根据 columnMap 条件)

    T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); //根据 entity 条件,查询一条记录

    Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); //根据 Wrapper 条件,查询总记录数

    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 根据 entity 条件,查询全部记录

    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); //根据 Wrapper 条件,查询全部记录

    /**
     * 根据 Wrapper 条件,查询全部记录
     * <p>注意: 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

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

    /**
     * 根据 Wrapper 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类
     */
    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

mybatis-plus提供的select操作可以分为几个大类:基于Id的、基于Map的、基于Wrapper条件的还有包含分页功能的。

基于id的select方法
  • selectById

        @Test
        public void testSelectById(){
            userMapper.selectById(1);
            System.out.println(userMapper);
        }
    

    生成的sql语句及输出:

    ==>  Preparing: SELECT id,name,age,gender,email FROM user WHERE id=?
    ==> Parameters: 1(Integer)
    <==      Total: 1
    User(id=1, name=Alice, age=15, gender=0, email=alice@gmail.com)
    
  • selectBatchIds

        @Test
        public void selectBatchIds(){
            List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3, 4));
            for (User user : users) {
                System.out.println(user);
            }
        }
    

    生成的sql语句及输出:

    ==>  Preparing: SELECT id,name,age,gender,email FROM user WHERE id IN ( ? , ? , ? , ? )
    ==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer)
    <==      Total: 4
    User(id=1, name=Alice, age=15, gender=0, email=alice@gmail.com)
    User(id=2, name=Bob, age=18, gender=1, email=bob@gmail.com)
    User(id=3, name=Colin, age=12, gender=1, email=colin@gmail.com)
    User(id=4, name=David, age=25, gender=1, email=david@gmail.com)
    
基于Map的select方法

作为参数的Map应该是一个<String,Object>的Map,key表示字段名,value表示对应字段的值。Map将被拼接成形如

select field1,field2 ... from tableName where `key1`=value and `key2`=value2 ...

的sql语句。

  • selectByMap

      @Test
        public void testSelectByMap(){
            // 查询表中的性别为男(gender 字段为 1)的用户
            HashMap<String, Object> conditions = new HashMap<>();
            conditions.put("gender",1);
            List<User> users = userMapper.selectByMap(conditions);
            for (User user : users) {
                System.out.println(user);
            }
        }
    

    生成的sql语句及输出:

    ==>  Preparing: SELECT id,name,age,gender,email FROM user WHERE gender = ?
    ==> Parameters: 1(Integer)
    <==      Total: 4
    User(id=2, name=Bob, age=18, gender=1, email=bob@gmail.com)
    User(id=3, name=Colin, age=12, gender=1, email=colin@gmail.com)
    User(id=4, name=David, age=25, gender=1, email=david@gmail.com)
    User(id=6, name=Frank, age=35, gender=1, email=frank@gmail.com)
    
基于Wrapper的select方法

Wrapper是mybatis-plus中非常强大的条件选择器,我们可以使用wrapper来构造一些比较否则的sql语句。

  • selectList

        @Test
        public void testSelectTestByQueryMapper(){
            // 查询表中 年龄大于16岁的男性(gender字段为1)用户
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            wrapper.eq("gender",1).gt("age",16);
            List<User> users = userMapper.selectList(wrapper);
            for (User user : users) {
                System.out.println(user);
            }
        }
    

    生成的sql语句及输出:

    ==>  Preparing: SELECT id,name,age,gender,email FROM user WHERE (gender = ? AND age > ?)
    ==> Parameters: 1(Integer), 16(Integer)
    <==      Total: 3
    User(id=2, name=Bob, age=18, gender=1, email=bob@gmail.com)
    User(id=4, name=David, age=25, gender=1, email=david@gmail.com)
    User(id=6, name=Frank, age=35, gender=1, email=frank@gmail.com)
    

    关于Wrapper的更多信息请查阅官方文档

包含分页功能的select

请阅读MyBatisPlus提供的分页功能


上一篇:Springboot整合MybatisPlus
下一篇:MyBatisPlus Service层的CRUD

- THE END -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值