SpringBoot配置篇(二)--MybatisPlus(MP)

MybatisPlus 介绍

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

MP的特性

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

历史背景

问题1: 现在操作的数据库任然采用 sql语句的方式进行编辑. 操作sql的方式实质就是面对过程的操作方式.
需求: 由于传统的sql 开发效率低,并且无论多么简单的sql都需要程序员自己编辑.很繁琐(无趣).
想法: 能否以面向对象的方式操作数据库!!!

JPA说明

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中
Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

核心理念: 以面向对象的方式操作数据库.

MybatisPlus实现原理

核心:

  1. 表与对象建立关联关系

对象名称 ---------> 表名
对象的属性 -------> 数据表中的字段.

  1. 采用第三方接口 规范所有的单表操作规则.(封装思想)
  2. 将CURD接口方法,必须按照sql的规范转化为指定的sql语句.

理论依据:
userMapper.insert(user); //程序员只写到这里.
sql: insert into 表名(字段名…) values (属性值…);
按照用户的调用发方法,动态拼接sql.之后交给Mybatis去执行.
拼接sql:
insert into user表(字段A,字段B,字段C…) values (属性值A,属性B,属性C…);

ORM思想

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。

以对象的方法操作数据库, 可以实现结果集与对象的自动的映射 不需要自己手写.

MP具体实现

1.编辑POJO对象

注解@TableName@TableField

@TableName("user")  //标识对象与表的映射关系,如果表名与对象名称一致则可以省略参数
public class User implements Serializable {
    private static final long serialVersionUID = -3205763327437547534L;
    //是同类对象的属性类型应该都是包装类型 Integer null
    @TableId(type = IdType.AUTO)//表示该属性为主键,参数type表示库中主键自增,参数value表示字段,一致可以省略
    private Integer id;
    //@TableField(value = "user_name")//表示映射的字段,如果属性与字段一致,连注解都可以省略
    private String name;
    private Integer age;
    private String sex;
}

2.实现接口继承

继承BaseMapper<实体类>中的方法,需要指定泛型为指定实体类

//@Mapper写到启动类上通过扫描寻找//将Mapper接口交给Mybatis管理
//BaseMapper 必须使用泛型指定映射的对象,继承了其中的crud操作
public interface UserMapper extends BaseMapper {
}

3.编辑YML配置文件

#使用MP时需改动名称
mybatis-plus:
  #别名包的定义,定义了Mapper中resultType的包名,我们只需要写类名自动拼接即可
  type-aliases-package: com.jt.pojo
  #加载指定的xml映射文件
  mapper-locations: classpath:/mybatis/mappers/*.xml
  #开启驼峰映射,详情在XML文件中
  configuration:
    map-underscore-to-camel-case: true


#实现打印
logging:
  level:
    com.jt.mapper: debug

4.写测试类,探索MP用法

**逻辑运算符
含义-->形式
(=) --> (eq)
(>) --> (gt)
(<) --> (lt)
(>=) --> (ge)
(<=) --> (le)
(or) --> (or)

QueryWrapper
定义条件对象,使用运算符方法来封装体条件对象
当遇到多个参数集时,需要使用集合类型,如果是数组则通过工具类转换成集合
UpdateWrapper
定义更新时需要的更新条件,传参时,第一个传需要修改成什么样的内容对象,第二个参数为uw为更新条件

@SpringBootTest
class SpringbootDemo2ApplicationTests {

   @Autowired
   private UserMapper userMapper;

   /**
    * 根据主键查询
    */
   @Test
   public void select01(){
      //通过id查询
      User user = userMapper.selectById(21);
      System.out.println("user = " + user);
      //查询总记录数
      Integer integer = userMapper.selectCount(null);
      System.out.println("integer = " + integer);
   }

   /**
    * 查询年龄=18的用户,同时要求性别为女
    * 条件构造器的作用,用来拼接where条件
    * sql:xxxx where age=18 and sex="女"
    * 逻辑运算符:(=)  --> (eq)
    *             (>)  --> (gt)
    *             (<)  --> (lt)
    *             (>=) --> (ge)
    *             (<=) --> (le)
    *             (or) --> (or)
    */
   @Test
   public void select02(){
      QueryWrapper queryWrapper=new QueryWrapper<>();
      queryWrapper.eq("age", 18)
               .eq("sex", "女");
      List userList = userMapper.selectList(queryWrapper);
      System.out.println("userList = " + userList);
   }

   /**
    * 查询ID=1,3,5,6的数据
    * 单表查询:or in
    * sql:select * from where id in (1,3,5,6)
    */
   @Test
   public void select03(){
      Integer[] ids={1,3,5,7};
      List idList = Arrays.asList(ids);//数组工具类 ,转集合方法
      List userList = userMapper.selectBatchIds(idList);
      System.out.println("userList = " + userList);
      //如果需要获取表中的第一列主键信息
      List objects = userMapper.selectObjs(null);
      System.out.println("objects = " + objects);
   }
   
   /**
    * 完成用户数据的入库
    */
   @Test
   public void testInsert(){
      User user = new User();
      user.setName("名媛")
         .setAge(80)
         .setSex("女");
      userMapper.insert(user);
   }

   /**
    * 更新操作
    * 建议:但凡更新操作时,最好自己手写
    */
   @Test
   public void testUpdate(){
      //根据对象中不为null的属性,当作set条件
//    User user=new User();
//    user.setId(65).setName("北京大爷");
//    userMapper.updateById(user);
      User user=new User();
      user.setName("北京大爷");
      UpdateWrapper updateWrapper = new UpdateWrapper<>();
      updateWrapper.eq("name", "名媛");
      userMapper.update(user,updateWrapper);//参数1:需要修改的数据  参数2: 封装的修改条件
   }

   /**
    * 删除操作:
    *     根据用户id删除用户信息
    */
   @Test
   public void testDelete(){
      List list = new ArrayList<>();
      userMapper.deleteById(65);//根据主键删除
//    userMapper.deleteBatchIds("id集合信息");
      //根据除主键之外的条件删除用户
      QueryWrapper queryWrapper = new QueryWrapper();
      queryWrapper.eq("name", "名媛");
      userMapper.delete(queryWrapper);
   }
}






你可能感兴趣的:(mybatis-plus)