共计 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 实现原理
外围:
- 表与对象建设关联关系
对象名称 ———> 表名
对象的属性 ——-> 数据表中的字段.
- 采纳第三方接口 标准所有的 单表 操作规定.(封装思维)
- 将 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);
}
}