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为更新条件
@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); }}