• Mybatis-plus笔记(一)


    Mybatis-plus学习笔记

    在Springboot中使用mp并测试

    在pom文件中引入如下依赖:(mp依赖和mysq依赖)

    <!--mybatis-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
    	<version>3.1.1</version>
    </dependency>
    <!--mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    

    基础配置:

    在application.yml中配置基本数据连接信息:

    # DataSource Config
    spring:
        datasource:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost:3306/mp?useSSL=false&serverTimezone=GMT%2B8
            username: root
            password: root
    
    # Logger Config
    logging:
        level:
          com.neo: warn
          com.neo.mapper: trace
        pattern:
            console: '%p%m%n'
    

    调入测试数据库脚本:

    /*
     Navicat Premium Data Transfer
    
     Source Server         : 本地数据库
     Source Server Type    : MySQL
     Source Server Version : 50726
     Source Host           : localhost:3306
     Source Schema         : mp
    
     Target Server Type    : MySQL
     Target Server Version : 50726
     File Encoding         : 65001
    
     Date: 02/02/2020 21:11:32
    */
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user`  (
      `id` bigint(20) NOT NULL COMMENT '主键',
      `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
      `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
      `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
      `manager_id` bigint(20) NULL DEFAULT NULL COMMENT '直属上级id',
      `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
      PRIMARY KEY (`id`) USING BTREE,
      INDEX `manager_fk`(`manager_id`) USING BTREE,
      CONSTRAINT `manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES (1087982257332887553, '大boss', 40, 'boss@baomidou.com', NULL, '2019-01-11 14:20:20');
    INSERT INTO `user` VALUES (1088248166370832385, '王天风', 25, 'wtf@baomidou.com', 1087982257332887553, '2019-02-05 11:12:22');
    INSERT INTO `user` VALUES (1088250446457389058, '李艺伟', 28, 'lyw@baomidou.com', 1088248166370832385, '2019-02-14 08:31:16');
    INSERT INTO `user` VALUES (1094590409767661570, '张雨琪', 31, 'zjq@baomidou.com', 1088248166370832385, '2019-01-14 09:15:15');
    INSERT INTO `user` VALUES (1094592041087729666, '刘红雨', 32, 'lhm@baomidou.com', 1088248166370832385, '2019-01-14 09:48:16');
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    

    在Springboot的测试包中创建测试类,测试配置是否成功:

    package com.neo;
    
    import com.neo.mapper.UserMapper;
    import com.neo.model.User;
    import org.junit.Assert;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.sql.SQLOutput;
    import java.util.List;
    
    /**
     * @author Alex
     * @create 2020-02-02 20:37
     **/
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SimpleTest {
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void select(){
            List<User> users = userMapper.selectList(null);
            Assert.assertEquals(5,users.size());
            users.forEach(System.out::println);
        }
    
    }
    

    测试结果:

    User(id=1087982257332887553, name=大boss, age=40, email=boss@baomidou.com, managerId=null, createTime=2019-01-11T14:20:20)
    User(id=1088248166370832385, name=王天风, age=25, email=wtf@baomidou.com, managerId=1087982257332887553, createTime=2019-02-05T11:12:22)
    User(id=1088250446457389058, name=李艺伟, age=28, email=lyw@baomidou.com, managerId=1088248166370832385, createTime=2019-02-14T08:31:16)
    User(id=1094590409767661570, name=张雨琪, age=31, email=zjq@baomidou.com, managerId=1088248166370832385, createTime=2019-01-14T09:15:15)
    User(id=1094592041087729666, name=刘红雨, age=32, email=lhm@baomidou.com, managerId=1088248166370832385, createTime=2019-01-14T09:48:16)
    

    通用mapper

    新增(Create)

    ◆新增方法

    UserMapper代码:

    package com.neo.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.neo.model.User;
    import org.apache.ibatis.annotations.Mapper;
    
    //要使用mp,就要集成BaseMapper
    @Mapper
    public interface UserMapper extends BaseMapper<User> {
    
    }
    

    在测试方法中调用userMapper中的insert方法:

     @Test
        public void insert(){
            User user = new User();
            user.setName("黄小明");
            user.setAge(20);
            user.setManagerId(1088248166370832385L);
            user.setCreateTime(LocalDateTime.now());
            int rows = userMapper.insert(user);
            System.out.println("影响记录数:"+rows);
    
        }
    

    测试结果:

    DEBUG==>  Preparing: INSERT INTO user ( id, name, age, manager_id, create_time ) VALUES ( ?, ?, ?, ?, ? ) 
    DEBUG==> Parameters: 1223961279246393345(Long), 黄小明(String), 20(Integer), 1088248166370832385(Long), 2020-02-02T21:28:03.621(LocalDateTime)
    DEBUG<==    Updates: 1
    影响记录数:1
    

    ◆常用注解

    @TabName注解

    当修改数据库表明却不想修改实体类型时,可以通过@TabName("数据库表名")来指定表名,否则会运行报错

    @Data
    @TableName("mp_user")
    public class User {
        //主键
        private Long id;
        //姓名
        private String name;
        //年龄
        private Integer age;
        //邮箱
        private String email;
        //直属上级
        private Long managerId;
        //创建时间
        private LocalDateTime createTime;
    }
    

    @TabId注解

    当实例中主键与数据库中的主键名称不一致时(例如实例中为驼峰命名,数据库表中为下划线命名),可使用该注解

    @TableField注解

    当实例中的字段与数据库中的字段不同时,就可以使用该注解映射,如下例:

     @TableField("name")
     private String realName;
    

    ◆排除非表字段的三种方式

    第一种方法:在声明类属性时使用 transient 关键字声明

    第二种方法:如上方法可能无法序列化该字段,故可以在声明类属性时:使用 static 关键字声明为静态变量(注意,用static 声明的静态变量lombok不会为其添加set和get方法)

    第三种方法:使用@TableField(exist = true)注解注解 其中括号中的 exist = true 表示该字段不是数据库表中的字段,无需映射

    查询(Retrieve)

    ◆基本查询方法

    通过id查询:selectById()方法

     @Test
        public void selectById() {
            User user = userMapper.selectById(1094590409767661570L);
            System.out.println(user);
    
        }
    

    批量查询:selectBatchIds()

    @Test
        public void selectByIds() {
            List<Long> idsList = Arrays.asList(1094592041087729666L, 1223961279246393345L, 1088250446457389058L);
            List<User> users = userMapper.selectBatchIds(idsList);
            users.forEach(System.out::println);
        }
    

    通过map查询:

       @Test
        public void selectByMap() {
            Map<String,Object> columnMap = new HashMap<>();
            columnMap.put("name","王天风");
            columnMap.put("age",25);
            //通过此map会执行类似 where name="王天风" and age=25 的sql
            List<User> userList = userMapper.selectByMap(columnMap);
            userList.forEach(System.out::println);
        }
    

    注意:此map中的键名为数据表中列名,并非实体类中的属性名

    ◆以条件构造器为参数的查询方法

     /* 查询要求:
            1、名字中包含雨并且年龄小于40
            name like '%雨%' and age<40
         */
        @Test
        public void selectByWrapper() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            //等同于
            //QueryWrapper<User> query = Wrappers.<User>query();
            queryWrapper.like("name","雨").lt("age",40);
            //注意:此处的键名依旧为数据库中的列名
            List<User> userList = userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    
     /*
        2、名字中包含雨年并且龄大于等于20且小于等于40并且email不为空
       name like '%雨%' and age between 20 and 40 and email is not null
    
         */
        @Test
        public void selectByWrapper2() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            //等同于
            //QueryWrapper<User> query = Wrappers.<User>query();
            queryWrapper.like("name","雨").between("age",20,40).isNotNull("email");
            //注意:此处的键名依旧为数据库中的列名
            List<User> userList = userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    
    /*
        3、名字为王姓或者年龄大于等于25,按照年龄降序排列,年龄相同按照id升序排列
       name like '王%' or age>=25 order by age desc,id asc
    
         */
        @Test
        public void selectByWrapper3() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            //等同于
            //QueryWrapper<User> query = Wrappers.<User>query();
            queryWrapper.likeRight("name","王").or()
                    .ge("age",25).orderByDesc("age").orderByAsc("id");
    
            //注意:此处的键名依旧为数据库中的列名
            List<User> userList = userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    
    /*
        4、创建日期为2019年2月14日并且直属上级为名字为王姓
          date_format(create_time,'%Y-%m-%d')='2019-02-14' and manager_id in (select id from user where name like '王%')
         */
        @Test
        public void selectByWrapper4() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            //等同于
            //QueryWrapper<User> query = Wrappers.<User>query();
            queryWrapper.apply("date_format(create_time,'%Y-%m-%d')={0}","2019-02-14")
                    .inSql("manager_id","select id from user where name like '王%'");
    
            //注意:此处的键名依旧为数据库中的列名
            List<User> userList = userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    //注意:以上方法查询为推荐查询,不建议写如下方式查询:会导致sql注入风险
    //queryWrapper.apply("date_format(create_time,'%Y-%m-%d')="2019-02-14")
    
    /*
        5、名字为王姓并且(年龄小于40或邮箱不为空)
        name like '王%' and (age<40 or email is not null)
         */
        @Test
        public void selectByWrapper5() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            //等同于
            //QueryWrapper<User> query = Wrappers.<User>query();
            queryWrapper.likeRight("name","王").
                    and(wq->wq.lt("age",40)
                    .or().isNotNull("email"));
            //注意:此处的键名依旧为数据库中的列名
            List<User> userList = userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    
      /*
        6、名字为王姓或者(年龄小于40并且年龄大于20并且邮箱不为空)
        name like '王%' or (age<40 and age>20 and email is not null)
         */
        @Test
        public void selectByWrapper6() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            //等同于
            //QueryWrapper<User> query = Wrappers.<User>query();
            queryWrapper.likeRight("name","王")
                    .or(wq->wq.lt("age",40).gt("age",20).isNotNull("email"));
    
            //注意:此处的键名依旧为数据库中的列名
            List<User> userList = userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    
    /*
        7、(年龄小于40或邮箱不为空)并且名字为王姓
        (age<40 or email is not null) and name like '王%'
         */
        @Test
        public void selectByWrapper7() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            //等同于
            //QueryWrapper<User> query = Wrappers.<User>query();
            queryWrapper.nested(wq->wq.lt("age",40).or().
                    isNotNull("email"))
                    .likeRight("name","王");
            //注意:此处的键名依旧为数据库中的列名
            List<User> userList = userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    
      /*
        8、年龄为30、31、34、35
        age in (30、31、34、35)
    
         */
        @Test
        public void selectByWrapper8() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            //等同于
            //QueryWrapper<User> query = Wrappers.<User>query();
          queryWrapper.in("age",Arrays.asList(30,31,34,35));
            //注意:此处的键名依旧为数据库中的列名
            List<User> userList = userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    

    ◆select中字段不全出现的处理方法

    并非每次查询都要查询所有字段,测试可用如下方法查询

     /*
              10、名字中包含雨并且年龄小于40(需求1加强版)
            第一种情况:select id,name
                           from user
                           where name like '%雨%' and age<40
    
           */
          @Test
          public void selectByWrapperSuper() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("id","name").like("name","雨").lt("age",40);
            List<User> userList =userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
          }
          /*
          第二种情况:select id,name,age,email
                           from user
                           where name like '%雨%' and age<40
           */
        @Test
        public void selectByWrapperSuper2() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.like("name","雨").lt("age",40)
            .select(User.class,info->!info.getColumn().equals("create_time")
                    &&!info.getColumn().equals("manager_id"));
            List<User> userList =userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    

    ◆条件构造器中condition作用

    @Test
        public void testCondition() {
            String name="王";
            String email="";
            condition(name,email);
        }
    
        public void condition(String name,String email){
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //       if(StringUtils.isNotEmpty(name)){
    //           queryWrapper.like("name",name);
    //       }
    //        if(StringUtils.isNotEmpty(email)){
    //            queryWrapper.like("email",email);
    //        }
            //以上代码过于臃肿,可采用如下代码代替
            queryWrapper.like(StringUtils.isNotEmpty(name),"name",name)
                    .like(StringUtils.isNotEmpty(email),"email",email);
    
            List<User> userList =userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    

    ◆创建条件构造器时传入实体对象

      @Test
        public void selectByWrapperEntity() {
            User whereUser = new User();
            whereUser.setName("刘红雨");
            whereUser.setAge(32);
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>(whereUser);
            List<User> userList =userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    

    ◆条件构造器中allEq用法

     @Test
        public void selectByWrapperAllEq() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            Map<String,Object> params = new HashMap<String,Object>();
            params.put("name","王天风");
            params.put("age","25");
            queryWrapper.allEq(params);
            List<User> userList =userMapper.selectList(queryWrapper);
            userList.forEach(System.out::println);
        }
    

    ◆其他以条件构造器为参数的查询方法

      @Test
        public void selectByWrapperMaps() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
            queryWrapper.select("id","name").like("name","雨").lt("age",40);
            List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
            maps.forEach(System.out::println);
    
        }
    

    selectMaps:

    /*
                按照直属上级分组,查询每组的平均年龄、最大年龄、最小年龄。
                并且只取年龄总和小于500的组。
                select avg(age) avg_age,min(age) min_age,max(age) max_age
                from user
                group by manager_id
                having sum(age) <500
         */
        @Test
        public void selectByWrapperMaps2() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    
            queryWrapper.select("avg(age) avg_age","min(age) min_age","max(age) max_age")
            .groupBy("manager_id").having("sum(age)<{0}",500);
    
            List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
            maps.forEach(System.out::println);
    
        }
    

    selectObjs:

    @Test
        public void selectByWrapperObjs() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    
            queryWrapper.select("id","name").like("name","雨").lt("age",40);
            List<Object> userList = userMapper.selectObjs(queryWrapper);
            userList.forEach(System.out::println);
    
        }
    

    selectCount :

      @Test
        public void setUserMapperCount() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    
            queryWrapper.like("name","雨").lt("age",40);
            int count = userMapper.selectCount(queryWrapper);
            System.out.println(count);
        }
    

    ◆Lambda条件构造器

    创建lambda条件构造器有两种方法

    ​ 第一种:

    LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
    
    

    第二种:直接new 一个lambda条件构造器

    LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
    
    

    第三种:

    LambdaQueryWrapper<User> LambdaQuery = Wrappers.<User>lambdaQuery();
    
    
      @Test
        public void selectLambda() {
    //        LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
    //        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
            LambdaQueryWrapper<User> lambdaQuery = Wrappers.<User>lambdaQuery();
    
            lambdaQuery.like(User::getName,"雨").lt(User::getAge,40);
            //where name like '%雨%' and age <40
            List<User> userList = userMapper.selectList(lambdaQuery);
            userList.forEach(System.out::println);
        }
    
    

    ◆使用条件构造器的自定义SQL

    (要求版本大于等于3.0.7)

    在UserMapper中定于接口方法(采用注解的方式)

     @Select("select * from user ${ew.customSqlSegment}")
     List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
    

    在测试中使用自定义方法:

        @Test
        public void selectMy() {
    //        LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
    //        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
            LambdaQueryWrapper<User> lambdaQuery = Wrappers.<User>lambdaQuery();
    
            lambdaQuery.like(User::getName,"雨").lt(User::getAge,40);
            //where name like '%雨%'
            List<User> userList = userMapper.selectAll(lambdaQuery);//此处使用自定义接口方法
            userList.forEach(System.out::println);
    
        }
    

    如果不想把自定义sql写在接口中,例如写在xml中,还可以采用如下方法:

    第一步:在yml配置文件中配置接口对应的xml路径

    Mybatis-plus:
      mapper-locations: classpath:mp/mapper/*.xml
    

    ​ 在配置路径下新建UserMapper.xml文件,同时去除接口中的注解sql

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.neo.mapper.UserMapper" >
        <select id="selectAll" resultType="com.neo.model.User">
            select * from user ${ew.customSqlSegment}
        </select>
    </mapper>
    

    ◆MyBatis分页介绍

    mybatis中提供分页方法,但是该分页是逻辑分页,而非物理分页。

    ◆MP分页插件实现物理分页

    新建配置包(com.neo.configuration)并新建配置分页类MybatisPlusConfig:

    @Configuration
    public class MybatisPlusConfig {
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    }
    

    测试(selectPage):

     @Test
        public void selectPage() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
            queryWrapper.ge("age", 26);
            Page<User> page = new Page<>(1, 2);
            IPage<User> iPage = userMapper.selectPage(page, queryWrapper);
            System.out.println("总页数:" + iPage.getPages());
            System.out.println("总记录数:" + iPage.getTotal());
            List<User> userlist = iPage.getRecords();
            userlist.forEach(System.out::println);
        }
    
    运行日志:
    
    DEBUG==>  Preparing: SELECT COUNT(1) FROM user WHERE age >= ? 
    DEBUG==> Parameters: 26(Integer)
    TRACE<==    Columns: COUNT(1)
    TRACE<==        Row: 7
    DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE age >= ? LIMIT ?,? 
    DEBUG==> Parameters: 26(Integer), 0(Long), 2(Long)
    TRACE<==    Columns: id, name, age, email, manager_id, create_time
    TRACE<==        Row: 1087982257332887553, 大boss, 40, boss@baomidou.com, null, 2019-01-11 14:20:20
    TRACE<==        Row: 1088250446457389058, 李艺伟, 28, lyw@baomidou.com, 1088248166370832385, 2019-02-14 08:31:16
    DEBUG<==      Total: 2
    总页数:4
    总记录数:7
    User(id=1087982257332887553, name=大boss, age=40, email=boss@baomidou.com, managerId=null, createTime=2019-01-11T14:20:20)
    User(id=1088250446457389058, name=李艺伟, age=28, email=lyw@baomidou.com, managerId=1088248166370832385, createTime=2019-02-14T08:31:16)
    

    测试(selectMapsPage):

        @Test
        public void selectPage() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    //        queryWrapper.ge("age",26);
            Page<User> page = new Page<>(1, 2);
    //        IPage<User> iPage = userMapper.selectPage(page, queryWrapper);
    //        System.out.println("总页数:"+ iPage.getPages());
    //        System.out.println("总记录数:"+ iPage.getTotal());
    //        List<User> userlist = iPage.getRecords();
            IPage<Map<String, Object>> iPage = userMapper.selectMapsPage(page, queryWrapper);
            System.out.println("总页数:"+ iPage.getPages());
            System.out.println("总记录数:"+ iPage.getTotal());
            List<Map<String, Object>> userlist = iPage.getRecords();
            userlist.forEach(System.out::println);
        }
    
    DEBUG==>  Preparing: SELECT COUNT(1) FROM user 
    DEBUG==> Parameters: 
    TRACE<==    Columns: COUNT(1)
    TRACE<==        Row: 13
    DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user LIMIT ?,? 
    DEBUG==> Parameters: 0(Long), 2(Long)
    TRACE<==    Columns: id, name, age, email, manager_id, create_time
    TRACE<==        Row: 1087982257332887553, 大boss, 40, boss@baomidou.com, null, 2019-01-11 14:20:20
    TRACE<==        Row: 1088248166370832385, 王天风, 25, wtf@baomidou.com, 1087982257332887553, 2019-02-05 11:12:22
    DEBUG<==      Total: 2
    总页数:7
    总记录数:13
    {createTime=2019-01-11 14:20:20.0, name=大boss, id=1087982257332887553, age=40, email=boss@baomidou.com}
    {createTime=2019-02-05 11:12:22.0, name=王天风, id=1088248166370832385, managerId=1087982257332887553, age=25, email=wtf@baomidou.com}
    

    从以上两个例子看以看出每个是执行了两条sql语句,如果只想要查询结果,不想要查询总数,只需要将page的第三个参数变为false,即可:

    Page<User> page = new Page<>(1, 2,false);
    

    当我们在做多表联查时,就不能使用如上方式查询了,此时可以在xml文件中自定义sql:

    更新(Update)

    ◆根据id更新

        @Test
        public void updateById(){
            User user= new User();
            user.setId(1088248166370832385L);
            user.setAge(26);
            user.setEmail("wtf2@baomidou.com");
            int rows = userMapper.updateById(user);
            System.out.println("影响记录数:"+ rows);
        }
    
    运行日志:
    
    DEBUG==>  Preparing: UPDATE user SET age=?, email=? WHERE id=? 
    DEBUG==> Parameters: 26(Integer), wtf2@baomidou.com(String), 1088248166370832385(Long)
    DEBUG<==    Updates: 1
    影响记录数:1
    
    

    ◆以条件构造器作为参数的更新方法

     @Test
        public void updateByWrapper(){
            UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
            updateWrapper.eq("name","李艺伟").eq("age",28);
            User user = new User();
            user.setEmail("lyw2020@baomidou.com");
            user.setAge(29);
            int rows = userMapper.update(user, updateWrapper);
            System.out.println("影响行数:"+rows
            );
    
        }
    运行日志:
    DEBUG==>  Preparing: UPDATE user SET age=?, email=? WHERE name = ? AND age = ? 
    DEBUG==> Parameters: 29(Integer), lyw2020@baomidou.com(String), 李艺伟(String), 28(Integer)
    DEBUG<==    Updates: 1
    影响行数:1
    

    ◆条件构造器中set方法使用

    (只修改少量字段时):

        @Test
        public void updateByWrapper(){
            UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
            //通过条件构造器的链式编程设置更新信息
            updateWrapper.eq("name","李艺伟").eq("age",29).set("email","liw888@qq.com");
    		//   User user = new User();
    
            int rows = userMapper.update(null, updateWrapper);
            System.out.println("影响行数:"+rows
            );
    
        }
    

    lambda条件构造器更新:

        @Test
        public void updateByWrapperLambda(){
            LambdaUpdateWrapper<User> lambdaUpdate = Wrappers.<User>lambdaUpdate();
            lambdaUpdate.eq(User::getName,"李艺伟").eq(User::getAge,29).set(User::getAge,31);
            int rows = userMapper.update(null, lambdaUpdate);
            System.out.println("影响行数:"+rows);
        }
    

    删除(Delete)

    ◆根据id删除的方法

      @Test
        public void deleteById() {
           int rows= userMapper.deleteById(1223976086888599553L);
            System.out.println("影响行数:"+rows);
        }
    

    根据id批量删除:

        @Test
        public void deleteBatchIds() {
            int rows =  userMapper.deleteBatchIds(
                    Arrays.asList(1223973741031141377L,
                    1223972327026405378L,1223970002606067714L));
    
            System.out.println("影响行数:"+rows);
        }
    

    ◆其他普通删除方法

        @Test
        public void deleteByMap() {
            Map<String,Object> columnMap= new HashMap<>();
            columnMap.put("name","向后");
            columnMap.put("age","31");
            int rows = userMapper.deleteByMap(columnMap);
            System.out.println("影响行数:"+rows);
        }
    

    ◆以条件构造器为参数的删除方法

    ActiveRecord模式

    AR探索

    ​ ◆AR模式简介

    ​ ◆MP中AR模式的实现

  • 相关阅读:
    Socket编程中的强制关闭与优雅关闭及相关socket选项
    怎样通过MSG_WAITALL设置阻塞时间,IO模式精细讲解: MSG_DONTWAIT 、 MSG_WAITALL
    RTSP、HTTP、HTTPS、SDP四种协议详解
    RTMP、RTSP、HTTP视频协议详解(附:直播流地址、播放软件)
    Idea连接服务器docker并部署代码到docker实现一键启动
    @Autowired注解和静态方法
    关于工具类静态方法调用@Autowired注入的service类问题
    @PostConstruct
    spring-boot-starter-mail技术总结
    使用SpringBoot发送mail邮件
  • 原文地址:https://www.cnblogs.com/sxblog/p/12286724.html
Copyright © 2020-2023  润新知