1、myatis-plus的新用法
新建一个项目MP用来测试mybatis-plus
把pom.xml里原来的mybatis依赖换成plus版的
<!--mybatis依赖包-->
<!-- <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
-->
<!--MP内部已经加载了mybatis,所以无需再次添加jar包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
编辑yml文件
#语法: 1.key:(空格)value结构
# 2.注意层级缩进
server:
port: 8090
#整合1.数据源
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#关于密码0 开头的说明
#password: "0123456"
#SpringBoot整合mybatisPlus
mybatis-plus:
#指定别名包
type-aliases-package: com.jt.pojo
#加载指定的xml映射文件
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
#Sql日志文件打印
logging:
level:
com.jt.mapper: debug
编辑测试类
package com.jt;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.StringUtils;
import java.util.List;
//效果:只要@Test测试方法执行,则整个Spring容器启动,可以根据自身的需要实现依赖注入
//注意事项: 该注解只能在测试类中使用.
// 测试类的包路径必须在主启动类的同包及子包中编辑.
@SpringBootTest
class MpApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void findAll(){
List<User>all=userMapper.findAll();
System.out.println(all);
}
/**
* MP入门案例
*/
@Test
public void insertUser() {
User user = new User();
user.setId(null).setName("MybatisPlus")
.setAge(10).setSex("男");
userMapper.insert(user);
}
/**
* 学习技巧: MP设计思想!!!! 对象
* 查询Id=1的用户
*/
@Test
public void selectById() {
int id = 1;
User user = userMapper.selectById(id);
System.out.println(user);
}
/**
* 查询name="大乔",sex="女"的用户
* 语法:
* 1.根据对象中不为null的属性进行业务操作
* 2.QueryWrapper条件构造器 动态拼接where条件
* 3.默认的关系连接符 and
* 例子:
* select * from demo_user where xx=xx and xx=xx
*/
@Test
public void selectByNS() {
User user = new User();
user.setName("大乔").setSex("女");
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
List<User> list = userMapper.selectList(queryWrapper);
System.out.println(list);
}
/**
* 查询name="大乔",sex="女"的用户
* 方式2: 利用条件构造器,构建条件
* 说明:
* 1. eq = 2. gt >
* 3. lt < 4. ge >=
* 5. le <= 6. ne <>
*/
@Test
public void selectByNS2() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name","大乔")
.eq("sex","女");
List<User> list = userMapper.selectList(queryWrapper);
System.out.println(list);
}
/**
* 需求: 查询age>18岁的用户,并且sex=男.
*/
@Test
public void selectByAS() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age",18)
.eq("sex","男");
List<User> list = userMapper.selectList(queryWrapper);
System.out.println(list);
}
/**
* 需求: 查询name中包含"君",性别="女"
* Sql: where name like "%君%"
* 需求2: 查询name中以"君"结尾的,性别="女" like "%君"
* 语法说明: likeLeft % 左侧的数据
*/
@Test
public void selectLike() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//queryWrapper.like("name","君") //"%君%"
queryWrapper.likeLeft("name","君") //"%君"
.eq("sex","女");
List<User> list = userMapper.selectList(queryWrapper);
System.out.println(list);
}
/**
* 需求: 查询id=1,3,4,5的数据 并且按照年龄降序排列
* 规则: 基本类型有没有方法? 所以使用包装类型
* 面向对象开发
*/
@Test
public void selectIds() {
Integer[] ids = {1,3,4,5};
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.in("id",ids)
.orderByDesc("age");
List<User> list = userMapper.selectList(queryWrapper);
System.out.println(list);
}
/**
* 需求:
* 只想获取第一列数据(主键),sex="女"
* 用法: .selectObjs(queryWrapper);
* 实际用途: 做关联查询时可以使用
*/
@Test
public void selectObjs() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sex","女");
List list = userMapper.selectObjs(queryWrapper);
System.out.println(list);
}
/**
* 说明: 根据不为null的属性当做where 动态sql实现
* 需求: 查询age>18岁,sex=女的用户
* 参数说明:
* 1. boolean condition, true时,当前的条件才会成立
* false 该条件不拼接.
* 2.R column 字段信息
* 3.Object val 值
* 判断字符串API:
* Spring提供的API StringUtils.hasLength(sex);
*/
@Test
public void selectList2() {
Integer age = null;
String sex = "女";
//判断字符串是否为null
//boolean flag = sex !=null && "".equals(sex);
boolean flag = StringUtils.hasLength(sex);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt(age!=null, "age",age )
.eq(flag,"sex",sex);
List<User> list = userMapper.selectList(queryWrapper);
System.out.println(list);
}
}
MP的动态SQL查询
1. 用户调用接口方法 userMapper.insert(User)方法.
2. 根据UserMapper的接口找到父级接口BaseMapper<T>.
3. 根据父级接口动态获取当前接口的泛型对象T.
4. 根据泛型T 获取指定的注解@TableName("demo_user"),之后获取表名demo_user.
5. 根据泛型对象T,获取其中的属性,之后再找到属性的注解@TableField("id"),之后再次获取注解的值, 即字段名称.
6. 根据字段名称,获取对应属性的值.
7. 根据Sql拼接 形成最终的可以执行的Sql.
8. MP将生成的Sql交给Mybatis执行入库操作.
2、 商品列表的crud
2.1、 编辑service
package com.jt.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jt.mapper.ItemMapper;
import com.jt.pojo.Item;
import com.jt.pojo.User;
import com.jt.vo.PageResult;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
@Service
@Data
public class ItemServiceImpl implements ItemService {
@Autowired
private ItemMapper itemMapper;
@Override
public PageResult getItemList(PageResult pageResult) {
QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
//判断条件: 用户传递query 则添加where条件
//不用if用Boolean,因为queryWrapper.like(boolean condition, R column, Object val)中的第一个参数是Boolean类型
String query = pageResult.getQuery();
boolean flag = StringUtils.hasLength(query);
queryWrapper.like(flag,"title",query);
//page接口原来只有2个,经过分页查询之后,有四个结果
//页数 条数 总数 记录
IPage<Item> page = new Page<>(pageResult.getPageNum(),pageResult.getPageSize());
page = itemMapper.selectPage(page,queryWrapper);//分页参数,条件
//获取总数
long total = page.getTotal();
//获取记录数
List<Item> rows = page.getRecords();
//返回分页对象
return pageResult.setTotal(total).setRows(rows);
// //1.获取总记录数 Integer--long 自动转化
// long total = itemMapper.findTotal();
// //2.获取分页结果
// int size = pageResult.getPageSize();//条数
// int start = (pageResult.getPageNum() - 1) * size;//起始位置
// String query=pageResult.getQuery();//查询条件
// List<User> itemList =
// itemMapper.getItemListByPage(start,size,query);
// return pageResult.setTotal(total).setRows(itemList);//返回分页对象
}
@Override
public void updateItemStatus(Item item) {
itemMapper.updateById(item);
}
@Override
public void deleteItem(Integer id) {
itemMapper.deleteById(id);
}
@Override
public void updateItem(Item item) {
itemMapper.updateById(item);
}
// @Override
// public void addItem(Item item) {
// item.setStatus(true);
// itemMapper.insert(item);
// }
//
}
2.2、 编辑controller类
@RestController
@CrossOrigin
@RequestMapping("/item")
public class ItemController {
@Autowired
private ItemService itemService;
//请求路径: /item/getItemList?query=&pageNum=1&pageSize=10
//请求类型: get
//请求参数: 使用pageResult对象接收
@GetMapping("/getItemList")
public SysResult getItemList(PageResult pageResult){
pageResult=itemService.getItemList(pageResult);
return SysResult.success(pageResult);
}
//请求路径: /item/updateItemStatus
//请求类型: put
@PutMapping("/updateItemStatus")
public SysResult updateItemStatus(@RequestBody Item item){
itemService.updateItemStatus(item);
return SysResult.success();
}
//请求路径: /item/deleteItemById
//请求类型: delete
@DeleteMapping("/deleteItemById")
public SysResult deleteItemById(@PathVariable Integer id){
itemService.deleteItemById(id);
return SysResult.success();
}
2.3、 页面展示
2.4 、分页的处理
2.4.1、 设置一个配置类
package com.jt.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//这是一个配置类 相当于早期的xml文件作用
public class MybatisPlusConfig {
/*
js-钩子函数-生命周期函数
MP内部的生命周期方法:
调用了 itemMapper.selectPage>>会自动调用MybatisPlusInterceptor对象
@Bean作用:将方法的返回值交给spring容器
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor =new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(
new PaginationInnerInterceptor(DbType.MARIADB));
return interceptor;
}
}
2.4.2、 图文解释