MyBatis Plus 使用整理

MyBatis Plus 的学习使用

引入

  • pom.xml中引入依赖

    <!-- mp 依赖 -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus</artifactId>
                <version>2.3</version>
            </dependency>
    
  • springDao.xml 配置mybatisPlus的sqlsessionFactory

        <!-- mybatis的sqlsessionFactorybean:org.mybatis.spring.SqlSessionFactoryBean-->
        <!-- 3、配置mybatis-plus的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<String> 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<DAManageMapper, DAManage>,这样就可以在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("dfbb@163.com");
            employee.setGender(1);
            employee.setAge(20);
            emplopyeeDao.insert(employee);
            //mybatisplus会自动把当前插入对象在数据库中的id写回到该实体中
            System.out.println(employee.getId());
        }
    

五、条件构造器(EntityWrapper)

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

List<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(1,3),
     new EntityWrapper<Employee>()
        .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<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
               .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<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
                .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<Employee> employees = emplopyeeDao.selectPage(
                new Page<Employee>(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("cjk@sina.com");
        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的所有用户删除。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mybatis Plus 是 Mybatis 的一个增强工具包,提供了许多实用的功能,例如自动分页、自动填充、逻辑删除、多租户等。下面简单介绍一下使用 Mybatis Plus 的步骤: 1. 引入 Mybatis Plus 的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.1</version> </dependency> ``` 2. 配置数据源,可以使用 Mybatis Plus 提供的 `MybatisPlusInterceptor` 实现自动分页: ```java @Configuration @MapperScan("com.example.mapper") public class MybatisPlusConfig { @Autowired private DataSource dataSource; @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); sqlSessionFactory.setDataSource(dataSource); // 添加分页插件 MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); sqlSessionFactory.setPlugins(interceptor); return sqlSessionFactory.getObject(); } } ``` 3. 创建实体类和对应的 Mapper 接口: ```java @Data @AllArgsConstructor @NoArgsConstructor @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; } public interface UserMapper extends BaseMapper<User> { } ``` 4. 使用 Mybatis Plus 提供的通用方法进行 CRUD 操作: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> list() { return userMapper.selectList(null); } public User getById(Long id) { return userMapper.selectById(id); } public boolean save(User user) { return userMapper.insert(user) > 0; } public boolean updateById(User user) { return userMapper.updateById(user) > 0; } public boolean removeById(Long id) { return userMapper.deleteById(id) > 0; } } ``` 以上就是使用 Mybatis Plus 的简单步骤,更多详细的使用方法可以参考官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LvhaoIT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值