MyBatis Plus 使用整理

MyBatis Plus 的学习使用

文章目录

  • MyBatis Plus 的学习使用
    • 引入
    • 一、查询
    • 二、修改
    • 三、删除
    • 四、增加
    • 五、条件构造器(EntityWrapper)

引入

  • pom.xml中引入依赖

    
            <dependency>
                <groupId>com.baomidougroupId>
                <artifactId>mybatis-plusartifactId>
                <version>2.3version>
            dependency>
    
  • springDao.xml 配置mybatisPlus的sqlsessionFactory

        
        
        <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="configLocation" value="classpath:mybatis-config.xml"/>
            <property name="typeAliasesPackage" value="com.zhu.mybatisplus.entity"/>
        bean>
    
  • 创建数据表实体类

    /**
     * Created by IntelliJ IDEA.
     * User: LvHaoIT (asus)
     * Date: 2021/12/27
     * Time: 14:09
     */
    @Data
    @TableName("da_manage") //指定表名
    //这个注解的作用就是自动的给model bean实现equals方法和hashcode方法。
    @EqualsAndHashCode(callSuper = false)
    //开启链式编程
    @Accessors(chain = true)
    
    /**
     * @ApiModel
     * 使用场景
     * 在实体类上边使用,标记类时swagger的解析类
     */
    @ApiModel(value = "da_manage对象", description = "da_manage对象")
    public class DAManage {
         
        // 指定主键生成策略为不含中划线的UUID
        @TableId(type = IdType.ASSIGN_UUID)
        //value与数据库主键列名一致,若实体类属性名与表主键列名一致可省略value
        //@TableId(value = "id",type = IdType.AUTO)//指定自增策略
        @ApiModelProperty(value = "uuid")
        private String id;
    
        @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        @ApiModelProperty(value = "建档时间")
        private Date daTime;
    
        @ApiModelProperty(value = "草稿状态,0草稿,1完成状态")
        private String daStatus;
    
        //若没有开启驼峰命名,或者表中列名不符合驼峰规则,可通过该注解指定数据库表中的列名,exist标明数据表中有没有对应列
        @TableField(value = "last_name",exist = true)
        @ApiModelProperty(value = "是否删除")
        private Integer isDel;
    
        private String temp;
    
    
    //    @TableField(exist = false)
    //    private List list;
    
    
    }
    
    
  • 实体类的mapper层

    /** map需要继承BaseMapper<实体类> 
     */
    @Repository
    public interface DAManageMapper extends BaseMapper<DAManage> {
        
    }
    

这样就完成了mybatis-plus与spring的整合。

  1. 首先是把mybatis和mybatis-spring依赖换成mybatis-plus的依赖,
  2. 然后把sqlsessionfactory换成mybatis-plus的,
  3. 然后实体类中添加@TableName@TableId等注解,
  4. 最后mapper继承BaseMapper即可。

如果需要在service层中直接使用curd方法,需要额外让service的实现类继承

ServiceImpl,这样就可以在service中使用例如:sava()removeByIds(asList)

public class DAManageServiceImpl extends ServiceImpl<DAManageMapper, DAManage> implements DAManageService {
    
}

一、查询

  • 根据id查询

    Employee employee = emplopyeeDao.selectById(1);
    
  • 根据条件查询 单条数据

    Employee employeeCondition = new Employee();
    employeeCondition.setId(1);
    employeeCondition.setLastName("更新测试");
    //若是数据库中符合传入的条件的记录有多条,那就不能用这个方法,会报错
    Employee employee = emplopyeeDao.selectOne(employeeCondition);
    
  • 根据条件查询多条数据

    Map<String,Object> columnMap = new HashMap<>();
    columnMap.put("gender","1");//写表中的列名
    columnMap.put("last_name","123");
    List<Employee> employees = emplopyeeDao.selectByMap(columnMap);
    System.out.println(employees.size());
    

    *注意:查询条件用map集合封装,columnMap,写的是数据表中的列名,而非实体类的属性名。比如属性名为lastName,数据表中字段为last_name,这里应该写的是last_name。selectByMap方法返回值用list集合接收。

  • 通过id批量查询

    List<Integer> idList = new ArrayList<>();
    idList.add(1);
    idList.add(2);
    idList.add(3);
    List<Employee> employees = emplopyeeDao.selectBatchIds(idList);
    System.out.println(employees);
    

    **注:**把需要查询的id都add到list集合中,然后调用selectBatchIds方法,传入该list集合即可,该方法返回的是对应id的所有记录,所有返回值也是用list接收。

  • 分页查询

    //service接口 
    IPage<DAManage> queryPageDAM(DAMAccpet daManage);
    
    //service实现
        public IPage<DAManage> queryPageDAM(DAMAccpet daManage) {
            Page<DAManage> page = new Page<>(daManage.getPageNo(), daManage.getPageSize());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            try {
                if (daManage.getDaTime() != null) {
                    daManage.setDaTime(sdf.parse(sdf.format(daManage.getDaTime())));
                }
                if (daManage.getAddTime() != null) {
                    daManage.setAddTime(sdf.parse(sdf.format(daManage.getAddTime())));
                }
            } catch (ParseException e) {
                System.out.println("日期转换异常");
            }
            return daManageMapper.queryPageDAM(page, daManage);
        }
    
    //mapper层 page一定要是这个方法的 第一个参数,其中必须有pageNO,pageSIze
        IPage<DAManage> queryPageDAM(@Param("page") Page<DAManage> page, @Param("daManage") DAMAccpet daManage);
    

二、修改

  • service修改操作 updateById 方法

     /*  *
         * 逻辑批量修改
         * @param asList
         */
        @Transactional(rollbackFor = Exception.class)
        @Override
        public void deleteBatch(List<String> asList) {
    //        removeByIds(asList);
            DAManage daManage = new DAManage();
            for (String s : asList) {
                daManage.setId(s);
                daManage.setIsDel(1);
                updateById(daManage);
            }
        }
    
    @Test
    public void testUpdate(){
            Employee employee = new Employee();
            employee.setId(1);
            employee.setLastName("更新测试");
            //emplopyeeDao.updateById(employee);//根据id进行更新,没有传值的属性就不会更新
            emplopyeeDao.updateAllColumnById(employee);//根据id进行更新,没传值的属性就更新为null
    }
    

三、删除

  • 根据id删除

    emplopyeeDao.deleteById(1);
    
  • 根据条件删除

    Map<String,Object> columnMap = new HashMap<>();
    columnMap.put("gender",0);
    columnMap.put("age",18);
    emplopyeeDao.deleteByMap(columnMap);
    
  • 批量删除

    //可以用此方法将前端传来的数组toString的json字符串转换成String数组
    Arrays.asList(daManage.getListStr().split(","));
    
    public void deleteBatch(List<String> asList) {
            removeByIds(asList);
        }
    
    
     List<Integer> idList = new ArrayList<>();
     idList.add(1);
     idList.add(2);
     emplopyeeDao.deleteBatchIds(idList);
    

四、增加

  • service增加操作 sava 方法 id会根据主键增长原则自动生成

        @Override
        @Transactional(rollbackFor = Exception.class)
        public String addDAM(DAMAccpet daManage) {
            try {
                DAManage daManage1 = new DAManage();
                BeanUtils.copyProperties(daManage, daManage1);
                save(daManage1);
                return "新增成功";
            } catch (Exception e) {
                return "新增失败";
            }
        }
    
  • mapper中使用 insert 方法

        @Autowired
        private EmplopyeeDao emplopyeeDao;
        @Test
        public void testInsert(){
            Employee employee = new Employee();
            employee.setLastName("东方不败");
            employee.setEmail("[email protected]");
            employee.setGender(1);
            employee.setAge(20);
            emplopyeeDao.insert(employee);
            //mybatisplus会自动把当前插入对象在数据库中的id写回到该实体中
            System.out.println(employee.getId());
        }
    

五、条件构造器(EntityWrapper)

1、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:

List employees = emplopyeeDao.selectPage(new Page(1,3),
     new EntityWrapper()
        .between("age",18,50)
        .eq("gender",0)
        .eq("last_name","tom")
);

**注:**由此案例可知,分页查询和之前一样,new 一个page对象传入分页信息即可。至于分页条件,new 一个EntityWrapper对象,调用该对象的相关方法即可。between方法三个参数,分别是column、value1、value2,该方法表示column的值要在value1和value2之间;eq是equals的简写,该方法两个参数,column和value,表示column的值和value要相等。注意column是数据表对应的字段,而非实体类属性字段。

2、查询gender为0且名字中带有老师、或者邮箱中带有a的用户:

List employees = emplopyeeDao.selectList(
                new EntityWrapper()
               .eq("gender",0)
               .like("last_name","老师")
                //.or()//和or new 区别不大
               .orNew()
               .like("email","a")
);

**注:**未说分页查询,所以用selectList即可,用EntityWrapper的like方法进行模糊查询,like方法就是指column的值包含value值,此处like方法就是查询last_name中包含“老师”字样的记录;“或者”用or或者orNew方法表示,这两个方法区别不大,用哪个都可以,可以通过控制台的sql语句自行感受其区别。

3、查询gender为0,根据age排序,简单分页:

List employees = emplopyeeDao.selectList(
                new EntityWrapper()
                .eq("gender",0)
                .orderBy("age")//直接orderby 是升序,asc
                .last("desc limit 1,3")//在sql语句后面追加last里面的内容(改为降序,同时分页)
);

**注:**简单分页是指不用page对象进行分页。orderBy方法就是根据传入的column进行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是将last方法里面的value值追加到sql语句的后面,在该案例中,最后的sql语句就变为select ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以进行降序排序和分页。

4、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:
条件构造器除了EntityWrapper,还有Condition。用Condition来处理一下这个需求:

 List employees = emplopyeeDao.selectPage(
                new Page(1,2),
                Condition.create()
                        .between("age",18,50)
                        .eq("gender","0")
 );

**注:**Condition和EntityWrapper的区别就是,创建条件构造器时,EntityWrapper是new出来的,而Condition是调create方法创建出来。

5、根据条件更新:

@Test
public void testEntityWrapperUpdate(){
        Employee employee = new Employee();
        employee.setLastName("苍老师");
        employee.setEmail("[email protected]");
        employee.setGender(0);
        emplopyeeDao.update(employee,
                new EntityWrapper<Employee>()
                .eq("last_name","tom")
                .eq("age",25)
        );
}

**注:**该案例表示把last_name为tom,age为25的所有用户的信息更新为employee中设置的信息。

6、根据条件删除:

emplopyeeDao.delete(
        new EntityWrapper<Employee>()
        .eq("last_name","tom")
        .eq("age",16)
);

**注:**该案例表示把last_name为tom、age为16的所有用户删除。

你可能感兴趣的:(工具插件,java,数据库,spring,myBatis,plus)