关于mybatis-plus:SpringBoot高级篇二MybatisPlusMP

8次阅读

共计 4436 个字符,预计需要花费 12 分钟才能阅读完成。

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

@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<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);
   }
}
正文完
 0