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<User> 必须应用泛型指定映射的对象,继承了其中的crud操作public interface UserMapper extends BaseMapper<User> {}

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为更新条件

@SpringBootTestclass 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<User> queryWrapper=new QueryWrapper<>();      queryWrapper.eq("age", 18)               .eq("sex", "女");      List<User> 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<Integer> idList = Arrays.asList(ids);//数组工具类 ,转汇合办法      List<User> userList = userMapper.selectBatchIds(idList);      System.out.println("userList = " + userList);      //如果须要获取表中的第一列主键信息      List<Object> 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<User> updateWrapper = new UpdateWrapper<>();      updateWrapper.eq("name", "名媛");      userMapper.update(user,updateWrapper);//参数1:须要批改的数据  参数2: 封装的批改条件   }   /**    * 删除操作:    *     依据用户id删除用户信息    */   @Test   public void testDelete(){      List<Object> list = new ArrayList<>();      userMapper.deleteById(65);//依据主键删除//    userMapper.deleteBatchIds("id汇合信息");      //依据除主键之外的条件删除用户      QueryWrapper queryWrapper = new QueryWrapper();      queryWrapper.eq("name", "名媛");      userMapper.delete(queryWrapper);   }}