一MybatisPlus(MP)介绍
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
二MybatisPlus(MP)特性
1无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
2损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
3强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
4支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
5支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配5置,完美解决主键问题
6支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
7支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
9内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
9内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
10分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
11内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
12内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
三JPA思想
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。
优化方法:
sql语句入库: insert into user (xxx,xxx,xxx) values("xxxx","xxx",xxxxx"); 手写
jpa方式: userMapper.insert(user); 用户操作的是对象,至于sql则由程序自动完成!!!
四ORM介绍
对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。
总结: ORM表示对象关系映射.
1.对象与数据表映射关系 2.对象的属性与表的字段映射
五MP原理说明
想法: userMapper.insert(user对象),要求实现数据库的入库操作.
核心:以面向对象的方式操作数据库.
实现原理:
1.标识对象与表的映射关系. -通过自定义的注解标识当前对象与表的映射关系 2.标识对象的属性与表中字段的映射关系. -通过自定义的注解标识属性与字段的映射. 3.定义共同的API接口,在其中编辑单表的所有CURD操作. 4.将公共的方法,动态的转化为sql语句.之后交给Mybatis去执行. (框架自动实现) 例子: 1.入库user表
userMapper.insert(user);
sql: insert into user(id,name.age,sex) values (“1”,“tom”,18,“男”); 动态拼接而成的
2.入库dept表
deptMapper.insert(dept);
sql: insert into dept(xxx,xxx) values(“yyyy”,“yyyy”);
六SpringBoot整合MybatisPlus
1引入jar包
com.baomidou
mybatis-plus-boot-starter
3.2.0
2对象与表关联配置
@Data
//@TableName("user") //1.定义对象与表的映射关系
//优化策略:如果表名及属性名称与表的名称一致,则可以省略 属性可以省略注解
@TableName
public class User {
@TableId(type=IdType.AUTO) //2.标识主键,主键自增
private Integer id;
//@TableField("name") //属性与字段的映射
private String name;
private Integer age;
private String sex;
}
3继承公共Mapper接口
//继承baseMapper并且指定泛型对象 //@Mapper public interface UserMapper extends baseMapper{ //添加接口方法 List findAll(); }
4编辑YML配置文件
说明:将mybatis修改为MybatisPlus的操作
#MybatisPlus配置信息
mybatis-plus: #润物细无声
#定义别名包 映射时自动的拼接包路径
type-aliases-package: com.jt.pojo
#扫描mapper的映射文件 必须有
mapper-locations: classpath:/mybatis/mappers
@Test
public void testInsert() {
User user = new User();
user.setName("MybatisPlus测试")
.setAge(18)
.setSex("男");
int rows = userMapper.insert(user);
System.out.println("入库成功!影响:"+rows+"行");
}
6添加sql日志
server:
port: 8090
servlet:
context-path: /
#由于pom.xml文件中添加jdbc的依赖包,所以该行必须配置
spring:
datasource:
#该驱动一般适用低版本的驱动链接. driver-class-name: com.mysql.jdbc.Driver
#如果使用最新版本的驱动则配置如下
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#MybatisPlus配置信息
mybatis-plus: #润物细无声
#定义别名包 映射时自动的拼接包路径
type-aliases-package: com.jt.pojo
#扫描mapper的映射文件 必须有
mapper-locations: classpath:/mybatis/mappers
@Test
public void test01() {
Integer[] intArray = {1,2,5,6,7};
//controller中接收用户的参数一般都是数组
//代码优化 数组转化为集合
List idList = Arrays.asList(intArray);
List userList = userMapper.selectBatchIds(idList);
System.out.println(userList);
}
2selectById
@Test
public void test02() {
User user = userMapper.selectById(21);
System.out.println(user);
}
3selectByMap
@Test
public void test03() {
Map columnMap = new HashMap<>();
columnMap.put("name", "白骨精");
columnMap.put("sex", "女");
List userList = userMapper.selectByMap(columnMap);
System.out.println(userList);
}
4selectList
@Test
public void test04() {
//定义条件构造器
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.gt("age", 18)
.eq("sex", "女");
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
5Like
//1.name属性中包含"精"的数据,并且为女性
//2.name属性中以"孙"开头的数据,并且为女性
@Test
public void test05() {
//定义条件构造器
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.like("name", "精")
.eq("sex", "女");
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
QueryWrapper queryWrapper2 = new QueryWrapper();
queryWrapper2.likeRight("name", "孙");
List userList2 = userMapper.selectList(queryWrapper2);
System.out.println(userList2);
}
6between
//查询年龄在18-35之间 and name以"王"开头
@Test
public void test06() {
//定义条件构造器//1.name属性中包含"精"的数据,并且为女性
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.between("age", 18, 35)
.likeRight("name", "王");
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
7orderBy
//查询年龄大于100岁的,并且按照年龄降序排列,如果年龄相同按照Id降序排列.
//SELECT id,sex,name,age FROM user WHERe (age > ?) ORDER BY age DESC , id DESC
@Test
public void test07() {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.gt("age",100)
.orderByDesc("age","id");
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
8inSql
@Test
public void test08() {
String name = "'孙尚香'"; //动态传参获取
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.lt("age", 100)
.inSql("sex", "SELECT sex FROM USER WHERe NAME="+name);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
9select
@Test
public void test09() {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.select("id","name").eq("age", 18);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
QueryWrapper queryWrapper2 = new QueryWrapper();
queryWrapper2.select("id","name").eq("age", 18);
List
10Condition
@Test
public void test10() {
String name = "貂蝉"; //用户传递的参数
Integer age = 18;
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq(!StringUtils.isEmpty(name), "name",name);
queryWrapper.eq( age!=null, "age",age);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
11根据对象查询
@Test
public void test11() {
User user = new User(); //用户数据的传递,采用user对象的方式接收
user.setName("王昭君");
user.setSex("女");
//用户要求根据传递的对象进行查询,
//根据对象中不为null的属性之后拼接where条件
QueryWrapper queryWrapper = new QueryWrapper(user);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
//查询全部数据
List userList2 = userMapper.selectList(null);
//userMapper.selectObjs(queryWrapper) 只查询第一列(主键)
System.out.println(userList2);
}
12删除操作
@Test
public void test13() {
//userMapper.deleteById(id); //传递主键,之后删除
//userMapper.deleteBatchIds(idList); //根据id批量删除数据.
//userMapper.deleteByMap(columnMap) //根据指定的字段删除数据.
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.isNull("name");
int rows = userMapper.delete(queryWrapper);
System.out.println("影响行数:"+rows);
}
13更新操作
@Test
public void test14() {
User user = new User();
user.setId(50).setName("张娜拉").setAge(19).setSex("女");
//如何解析sql byId说明 只有id属性充当where条件 其余属性充当set条件.
//如果获取主键信息时使用
int rows = userMapper.updateById(user);
System.out.println("影响的行数:"+rows);
//2. entity:需要修改的数据
// updateWrapper: 修改的条件
User user2 = new User();
user2.setAge(25).setSex("男");
UpdateWrapper updateWrapper= new UpdateWrapper();
updateWrapper.eq("id", 50);
//具有通用性.任何条件都可以使用update(xx,xxx)
userMapper.update(user2, updateWrapper);
}



