# MP
**Repository Path**: xu_chuang/mp
## Basic Information
- **Project Name**: MP
- **Description**: mybatis第三方增强工具 mybatis plus
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-05-22
- **Last Updated**: 2021-05-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# MP(Mybatis Plus)
#### 概述
mybatis plus是mybatis第三方增强框架,
只做增强不做改变,提高效率,简化开发。
#### 软件架构
bs架构 mybatis+springboot
#### 环境搭建
1. 创建springboot项目
```xml
org.springframework.boot
spring-boot-starter-parent
2.3.11.RELEASE
```
2. 导入mybatis plus依赖
```xml
com.baomidou
mybatis-plus-bootstarter
3.4.3
```
3. 导入数据库依赖
```xml
mysql
mysql-connector-java
runtime
```
4. 导入lombook(简化实体开发)
```xml
org.projectlombok
lombok
true
```
#### 入门案例(环境搭建+查询 暂时忽略条件构造器Wrapper)
1. 导入mybatis plus依赖
2. 配置数据源
```yml
spring:
datasource:
driver-class-name: 驱动类权限定名
url: jdbc:mysql://ip:端口/dbname?characterEncoding=utf-8&serverTimezone=UTC
username: 用户名
password: 密码
```
3. 创建表/实体
1. 表结构
```sql
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
```
b. 数据
```sql
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
```
```java
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
```
4. mapper中定义接口实现 BaseMaapper<实体作为泛型>
5. 扫描Mapp接口
1. 方式1 : 在接口中添加@Mapper注解
2. 方式2 : 在启动类上添加@MapperScanner注解
```java
@SpringBootApplication
@MapperScan("com.example.castday1.mapper")
public class CastDay1Application {
public static void main(String[] args) { SpringApplication.run(CastDay1Application.class);
}
}
```
6. 编写代码进行测试
```java
/*
@Test进行测试的时候 通过在测试类上配置的这里个注解 可将springbean生成在内存中 不用再单独启动spring容器了
当测试过程设计到ioc的时候 可以使用这里个注解
*/
@RunWith(SpringRunner.class)
@SpringBootTest
```
#### 基础注解(插入 引入几个基础的注解)
1. 插入案例
2. @Tablename 表名和实体名不一样时,使用@Tablename注解将表和实体进行绑定
3. @TableId 将表的主键和实体属性进行绑定
4. @TableFeild 将表的非主键列和实体属性进行绑定
#### 排除表字段的三种方式
1.使用statis修饰字段
2.使用transient 修饰字段
3.使用@TableField注解修饰字段
3.1 给字段添加该注解
3.2 给注解添加exist属性 属性值为false
```java
@Data
@TableName("User")
public class UserA {
@TableId("id")
private Long userId;
@TableField("name")
private String username;
private Integer age;
private String email;
@TableField(exist = false)
private String sex;
//private transient String sex;
//private static String sex;
}
```
#### 添加sql日志
```yml
logging:
level:
root: warning
持久层包路径 : trace
```
#### 插入
#### 查询(select/find/retrieve)
#### AbstractWrapper条件构造器
##### 理解条件构造器的作用(根据字面意义理解即可)
所谓的条件构造器就是用于构造sql语句查询条件的工具
```
比如 : 查询员工表中姓氏包含m,并且年龄在30-50之间的并且工资大于 5000的员工的信息。
该sql语句的条件为
```
```sql
last_name like '%m%' and age between 30 and 50 and salary > 5000
```
对该sql语句的条件进行拆分
a. 列名 : lastname / age / salary
这一部分是直接填充的。
b. 数据
m / 30 / 50 / 5000
直接填充
c. sql中的运算符和关键字 由条件构造器提供。
##### 条件构造器案例
条件构造器中封装好了用于生成sql中的运算符/关键字的方法,而列名和数据则作为方法的参数进行传递,最终条件构造器会生成符合标准sql规范的sql语句的查询条件。
案例1
需求: 查询年龄大于20的用户信息。
```
age>20
```
```java
@Test
public void queryInfoCastOne(){
QueryWrapper queryWrapper = new QueryWrapper();
//QueryWrapper queryWrapper1 = Wrappers.query();
// gt > lt <
queryWrapper.gt("age",20);
List userAList = userMapper.selectList(queryWrapper);
userAList.forEach(System.out::println);
}
```
案例2
需求: 查询年龄在20到25之间 并且 姓名包含z的用户信息
```sql
age between 20 and 50 and name like '%z%'
```
```java
public void queryInfoCastTwo(){
QueryWrapper queryWrapper = Wrappers.query();
queryWrapper.between("age",20,25);
queryWrapper.like("name","z");
List userAList =userMapper.selectList(queryWrapper);
userAList.forEach(System.out::println);
}
```
案例3: 查询年龄在是 21 23 25 27 30 中或者邮箱不为空的用户信息
```java
public void queryInfoCastThree(){
List userAList =userMapper.selectList(
new QueryWrapper()
.in("age",21,22,23,24,25)
.or()
.isNotNull("email")
);
userAList.forEach(System.out::println);
}
```
案例4 : 查询年龄小于等于20的所有用户信息,并且根据降序排列
```java
public void queryInfoCastFour(){
List userAList = userMapper.selectList(
new QueryWrapper()
.le("age",20)
.orderByDesc("id")
);
userAList.forEach(System.out::println);
}
```
案例5: 查询年龄等于19或者名字为zs的用户信息
```java
public void queryInfoCastFive(){
Map map = new HashMap();
map.put("age",19);
map.put("name","zs");
List userAList = userMapper.selectList(
new QueryWrapper()
/*.eq("age",19)
.or()
.eq("name","张三")*/
// and连接
.allEq(map)
);
userAList.forEach(System.out::println);
}
```
案例6:查询年龄最大的用户信息
```java
// age = (select max(age) from user) //找不到满足需求的方法
// age in (select max(age) from user)
// inSql notInSql
@Test
public void queryInfoCastSix(){
List userAList = userMapper.selectList(
new QueryWrapper()
.inSql("age","select max(age) from user")
);
userAList.forEach(System.out::println);
}
```
案例7: 查询年龄最大的三个用户的信息
```java
public void queryInfoCastSeven(){
List userAList = userMapper.selectList(
new QueryWrapper()
.orderByDesc("age")
//last 将sql语句拼接到最后
//安全性低 存在sql注入的风险
.last(" limit 0,3")
);
userAList.forEach(System.out::println);
}
```
9. 了解apply 函数动态入参 提高代码分析能力,规避sql注入。
10. 自定义查询结果中的列
查询年龄最大的三个用户的的姓名 和 年龄
```java
public void queryInfoCastSeven(){
List userAList = userMapper.selectList(
new QueryWrapper()
.orderByDesc("age")
//last 将sql语句拼接到最后
//安全性低 存在sql注入的风险
.select("name as username","age")
.last(" limit 0,3")
//.select("name","age")
);
userAList.forEach(System.out::println);
}
```
##### 条件构造器中经常会出现condition
```
该参数表示条件**是否**加入最后生成的sql中
往往用于动态sql的实现
根据年龄和名字查询用户信息
案例
根据姓名和邮箱模糊查询用户信息
```
```java
public void dynamicSqlCast(){
String name = " ";
String email = "xx";
userMapper.selectList(new QueryWrapper()
.like(StringUtils.isNotBlank(name),"name",name)
.like(StringUtils.isNotBlank(email),"email",email));
}
```
##### 实体作为条件构造器方法 的参数。
```
1、实体中的非空字段会进行等于比较
2、如果存在其他条件,非空字段比较条件会和其他条件使用and连接
3、慎用 避免条件冲突或者重复
```
```java
public void test(){
UserA userA = new UserA();
userA.setUserId(10001L);
userA.setEmail("xxx@xxx.com");
userA.setAge(20);
QueryWrapper queryWrapper = new QueryWrapper(userA);
queryWrapper.like("name","z");
List userAList = userMapper.selectList(queryWrapper);
userAList.forEach(System.out::println);
}
```
##### 其他条件构造器作为参数的方法
1、selectList 查询结果为一个集合 (以上条件构造器的案例均使用selectList)
2、selectMaps 将查询结果以键值对的方式存入Map集合 再将map集合封装
到list集合 最终返回List list中每一个Map集合都是条查询结果 字段为key 只为value
3、selectCount 返回查询结果中的数据条数
// 查询平均id大于200的各个年龄的用户数量和平均年龄
```java
//// 查询平均id大于200的各个年龄的用户数量和年龄
// select count(*),age from user group by age having avg(id)>200
public void testSelectMap(){
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper
.groupBy("age")
.having("avg(id)>{0}",1)
.select("count(*)","age");
List