mybatis-plus-为简化开发、提高效率而生

一只会飞的鱼儿 1年前 ⋅ 2471 阅读
ad

解决问题:

mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。

 

官网:

https://baomidou.com/guide/#%E7%89%B9%E6%80%A7

GitHub地址:

https://github.com/baomidou/mybatis-plus

Gitee地址:

https://gitee.com/baomidou/mybatis-plus

一、简介:

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

 

最新pom版本:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.4.0</version>
</dependency>

 

二、特性:
  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
三、springBoot整合mybatis-plus:

正如官方所说,mybatis-plus在mybatis的基础上只做增强不做改变,因此其与spring的整合亦非常简单。只需把mybatis的依赖换成mybatis-plus的依赖,再把sqlSessionFactory换成mybatis-plus的即可。接下来看具体操作:

1、pom.xml: 核心依赖如下:

<dependency>  
  <groupId>org.mybatis.spring.boot</groupId>  
  <artifactId>mybatis-spring-boot-starter</artifactId>  
  <version>2.0.1</version>
</dependency>
<dependency>  
    <groupId>com.baomidou</groupId>  
    <artifactId>mybatis-plus-boot-starter</artifactId> 
    <version>3.1.2</version>
</dependency>

2、实体类Entity写法:

@EqualsAndHashCode(callSuper = true)
@Data
@TableName("user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

3、编写Mapper类 UserMapper.java

public interface UserMapper extends BaseMapper<User> {


}

4、CRUD操作

添加测试类,进行功能测试:

select操作:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleTest {


    @Autowired
    private UserMapper userMapper;


    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        //User user = userMapper.selectById(1);//通过id单个查询
        //User user = userMapper.selectOne(null)//通过查询条件单个查询
        //List<User> users = userMapper.selectPage(new Page<>(1,2),null);//分页查询
        Assert.assertEquals(5, userList.size());
        userList.forEach(System.out::println);
    }
}
备注:单个条件查询,若是符合这个条件的记录不止一条,那么就会报错。
结合条件查询器EntityWrapper使

控制台输出:

User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)

insert操作:

    @Test
    public void testInsert(){
        User user = new User();
        user.setName("东方不败");
        user.setEmail("dfbb@163.com");
        user.setAge(20);
        userMapper.insert(user);   
        System.out.println(user.getId());
    }
    备注: mybatisplus会自动把当前插入对象在数据库中的id写回到该实体中
          执行添加操作,直接调用insert方法传入实体即可。

update操作:

    @Test
    public void testUpdate(){
        User user = new User();
        user.setId(1);
        user.setName("更新测试");
        userMapper.updateById(user);   
        //userMapper.update(user); 
        System.out.println(user.getId());
    }
    备注: 根据id进行更新,没有传值的属性就不会更新
          执行更新操作,直接调用update方法传入实体也可。

 

delete操作:

userMapper.deleteById(1);//id删除
userMapper.deleteBatchIds(idList);//批量id删除

 

四、条件构造器(EntityWrapper):

以上基本的 CRUD 操作,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法供使用, 可以极其方便的实现单一、批量、分页等操作,极大的减少开发负担。但是mybatis-plus的强大不限于此,请看如下需求该如何处理:

 需求: 我们需要分页查询 user 表中,年龄在 18~50 之间且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢?

 使用MyBatis : 需要在 SQL 映射文件中编写带条件查询的 SQL,并用PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。

 使用MP: 依旧不用编写 SQL 语句,MP 提供了功能强大的条件构造器 ------ EntityWrapper。

接下来就直接看几个案例体会EntityWrapper的使用。

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

List<User> users = userMapper.selectPage(new Page<User>(1,3),
     new EntityWrapper<User>().between("age",18,50)
        .eq("name","tom")
);

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

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

List<User> users = userMapper.selectList(
                new EntityWrapper<User>()               
               .like("name","老师")
                //.or()//和or new 区别不大
               .orNew().like("email","a")
);

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

3、查询根据age排序:

List<User> users = userMapper.selectList(
                new EntityWrapper<User>()                
                .orderBy("age")//直接orderby 是升序,asc
);

注:orderBy方法就是根据传入的column进行升序排序,若要降序,可以使用orderByDesc方法。

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

List<User> users = userMapper.selectList(
                Condition.create()                                   .between("age",18,50).eq("name","tom")
 );

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

5、根据条件更新:

@Test
public void testEntityWrapperUpdate(){
        User user = new User();        
        user.setName("苍老师");
        user.setEmail("cjk@sina.com");
        userMapper.update(user, new EntityWrapper<User>()                .eq("name","tom")
                .eq("age",25)
        );}

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

6、根据条件删除:

userMapper.delete(
        new EntityWrapper<User>().eq("name","tom")
        .eq("age",16)
);

其他方法例如:

CRUD更多操作,请参考官网

https://baomidou.com/guide/crud-interface.html#service-crud-%E6%8E%A5%E5%8F%A3

五、总结:

通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!

从以上步骤中,我们可以看到集成MyBatis-Plus非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。

但 MyBatis-Plus 的强大远不止这些功能,想要详细了解 MyBatis-Plus 的强大功能?去官网看看吧

 

关于Webfunny

Webfunny专注于前端监控系统,前端埋点系统的研发。 致力于帮助开发者快速定位问题,帮助企业用数据驱动业务,实现业务数据的快速增长。支持H5/Web/PC前端、微信小程序、支付宝小程序、UniApp和Taro等跨平台框架。实时监控前端网页、前端数据分析、错误统计分析监控和BUG预警,第一时间报警,快速修复BUG!支持私有化部署,Docker容器化部署,可支持千万级PV的日活量!

  点赞 0   收藏 0
  • 一只会飞的鱼儿
    共发布53篇文章 获得8个收藏
全部评论: 0