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实现原理
核心:
- 表与对象建立关联关系
对象名称 ---------> 表名
对象的属性 -------> 数据表中的字段.
- 采用第三方接口 规范所有的单表操作规则.(封装思想)
- 将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