淘客网站开发培训,网络营销推广方案怎么做,在线推广企业网站的方法有,wordpress幻灯片 设置方法MybatisPlus快速入门 快速入门入门案例常见注解常见配置 核心功能条件构造器自定义SQLService接口 扩展功能代码生成静态工具逻辑删除枚举处理器JSON处理器 插件功能分页插件通用分页实体 参考文档 mybatis-plus参考文档 全部资料链接 讲义
快速入门
入门案例 dependency… MybatisPlus快速入门 快速入门入门案例常见注解常见配置 核心功能条件构造器自定义SQLService接口 扩展功能代码生成静态工具逻辑删除枚举处理器JSON处理器 插件功能分页插件通用分页实体 参考文档 mybatis-plus参考文档 全部资料链接 讲义
快速入门
入门案例 dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version/dependencyMapper
public interface UserMapper extends BaseMapperUser { // 记得指定泛型为你操作的实体类的类型
}常见注解 常见配置 核心功能
条件构造器 Testvoid testQueryWrapper(){// 1.构建查询条件QueryWrapperUser wrapper new QueryWrapperUser().select(id, username, info, balance).like(username, o).ge(balance, 1000);// 2.查询ListUser users userMapper.selectList(wrapper);//3. 遍历打印users.forEach(System.out::println);}Testvoid testUpdateByQueryWrapper(){// 1. 要更新的数据User user new User();user.setBalance(2000);// 2. 更新的操作QueryWrapperUser wrapper new QueryWrapperUser().eq(username,jack);// 3. 执行更新userMapper.update(user,wrapper);}Testvoid testUpdateWrapper(){ListLong ids Arrays.asList(1L, 2L, 3L);UpdateWrapperUser wrapper new UpdateWrapperUser().setSql(balance balance - 200).in(id,ids);userMapper.update(null,wrapper);}
Testvoid testLambdaQueryWrapper(){LambdaQueryWrapperUser wrapper new LambdaQueryWrapperUser().select(User::getId,User::getUsername,User::getInfo,User::getBalance).like(User::getUsername,o).ge(User::getBalance,1000);ListUser users userMapper.selectList(wrapper);users.forEach(System.out::println);}自定义SQL Service接口 我们的自定义接口UserService需要去继承IService接口我们的实现类UserServiceImpl也要继承他的实现类ServiceImpl
package com.itheima.mp.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.mp.domain.po.User;public interface IUserService extends IServiceUser {
}
package com.itheima.mp.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;Service
public class UserServiceImpl extends ServiceImplUserMapper, User implements IUserService {// 泛型中要指定mapper的类型和实体类的类型
}
package com.itheima.mp.service;import com.itheima.mp.domain.po.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;import static org.junit.jupiter.api.Assertions.*;SpringBootTest
class IUserServiceTest {Autowiredprivate IUserService userService;Testvoid testSaveUser(){User user new User();
// user.setId(5L);user.setUsername(Lilei);user.setPassword(123);user.setPhone(18688990011);user.setBalance(200);user.setInfo({\age\: 24, \intro\: \英文老师\, \gender\: \female\});user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userService.save(user);}Testvoid testQuery(){ListUser users userService.listByIds(Arrays.asList(1L, 2L, 3L));users.forEach(System.out::println);}
}package com.itheima.mp.controller;import cn.hutool.core.bean.BeanUtil;
import com.itheima.mp.domain.dto.UserFormDTO;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.query.UserQuery;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;Api(tags 用户管理接口)
RequestMapping(/users)
RestController
RequiredArgsConstructor
public class UserController {// final搭配lombok的RequiredArgsConstructor注解// 实现根据需要自动注入不需要注入的不加lombok注解就行了private final IUserService userService;ApiOperation(新增用户接口)PostMappingpublic void saveUser(RequestBody UserFormDTO userDto){// 1. 把DTO拷贝到POUser user BeanUtil.copyProperties(userDto, User.class);// 2. 新增userService.save(user);}ApiOperation(删除用户接口)DeleteMapping({id})public void deleteUserById(ApiParam(用户id) PathVariable(id) Long id){userService.removeById(id);}ApiOperation(根据id查询用户)GetMapping({id})public UserVO getUserById(ApiParam(用户id) PathVariable(id) Long id){User user userService.getById(id);return BeanUtil.copyProperties(user,UserVO.class);}ApiOperation(根据id批量查询用户)GetMappingpublic ListUserVO getUserByIds(ApiParam(用户id集合) RequestParam(ids) ListLong ids){ListUser users userService.listByIds(ids);return BeanUtil.copyToList(users,UserVO.class);}ApiOperation(扣减用户余额接口)DeleteMapping({id}/deduction/{money})public void deductMoneyById(ApiParam(用户id) PathVariable(id) Long id,ApiParam(扣减的金额) PathVariable(money) Integer money){userService.deductBalance(id, money);}
} controller层
ApiOperation(根据复杂条件查询用户)GetMapping(/list)public ListUserVO queryUsers(UserQuery query){// 1. 查询用户POListUser users userService.queryUsers(query.getName(),query.getStatus(),query.getMinBalance(),query.getMaxBalance());// 2. 把PO拷贝到VOreturn BeanUtil.copyToList(users, UserVO.class);}service层
Overridepublic ListUser queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {return lambdaQuery().like(name ! null, User::getUsername, name).eq(status ! null, User::getStatus, status).ge(minBalance ! null, User::getBalance, minBalance).le(maxBalance ! null, User::getBalance, maxBalance).list();}OverrideTransactionalpublic void deductBalance(Long id, Integer money) {// 1. 查询用户User user getById(id); // 我们继承了ServiceImpl爸爸的就是我的已经有UserService了不用注入this一下看看哦// 2. 校验用户状态if(usernull || user.getStatus() 2 ){throw new RuntimeException(用户状态异常);}// 3. 校验余额是否充足if(user.getBalance() money){throw new RuntimeException(用户余额不足);}// 4. 扣减余额 update user set balance balance - ?
// baseMapper.deductBalance(id,money);int remainBalance user.getBalance() - money;lambdaUpdate().set(User::getBalance,remainBalance).set(remainBalance 0,User::getStatus,0).eq(User::getId,id).eq(User::getBalance,user.getBalance()) // 乐观锁.update(); // 一定记得加上update上面只是在构建sql语句}扩展功能
代码生成 静态工具 根据id查询用户的接口 ApiOperation(根据id查询用户)GetMapping({id})public UserVO getUserById(ApiParam(用户id) PathVariable(id) Long id){
// User user userService.getById(id);
// return BeanUtil.copyProperties(user,UserVO.class);return userService.queryUserAndAddressById(id);}实现方法 Overridepublic UserVO queryUserAndAddressById(Long id) {// 1. 查询用户User user getById(id);if(user null || user.getStatus() 2){throw new RuntimeException(用户状态异常);}// 2. 查询地址——使用静态工具ListAddress addresses Db.lambdaQuery(Address.class).eq(Address::getUserId, id).list();// 3.封装VO// 3.1转User额PO为VoUserVO userVO BeanUtil.copyProperties(user, UserVO.class);//3.2 转地址VOif(CollUtil.isNotEmpty(addresses)){userVO.setAddresses(BeanUtil.copyToList(addresses, AddressVO.class));}return userVO;}根绝id批量查询用户的接口 controller层 ApiOperation(根据id批量查询用户)GetMappingpublic ListUserVO getUserByIds(ApiParam(用户id集合) RequestParam(ids) ListLong ids){
// ListUser users userService.listByIds(ids);
// return BeanUtil.copyToList(users,UserVO.class);return userService.queryUserAndAddressByIds(ids);}实现
Overridepublic ListUserVO queryUserAndAddressByIds(ListLong ids) {// 1. 查询用户ListUser users listByIds(ids);if(CollUtil.isEmpty(users)){return Collections.emptyList();}// 2.查询地址// 2.1 获取用户id集合ListLong userIds users.stream().map(User::getId).collect(Collectors.toList());// 2.2 根据用户id查询地址ListAddress addresses Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();// 2.3 转换地址VOListAddressVO addressVOList BeanUtil.copyToList(addresses, AddressVO.class);// 2.4 用户地址集合分组处理相同的用户放入一个集合组中MapLong, ListAddressVO addressMap new HashMap(0);if(CollUtil.isNotEmpty(addressVOList)){addressMap addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId));}// 3. 转换VO返回ArrayListUserVO list new ArrayList(users.size());for (User user : users) {// 3.1. 转换User的PO为VOUserVO vo BeanUtil.copyProperties(user, UserVO.class);// 3.2 转换地址VOvo.setAddresses(addressMap.get(user.getId()));list.add(vo);}return list;}逻辑删除 枚举处理器
就是Java中的枚举类型和数据库中的int类型的转换的问题 package com.itheima.mp.enums;import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;Getter
public enum UserStatus {NORML(1,正常),FROZEN(2,冻结),;EnumValueprivate final int value;JsonValue // 前端默认返回枚举项的名字不友好设置返回desc由spring控制private final String desc;UserStatus(int value, String desc){this.value value;this.desc desc;}
}JSON处理器
实现Java中的对象和数据库中的json格式数据的映射
package com.itheima.mp.domain.po;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;Data
NoArgsConstructor
AllArgsConstructor(staticName of)
public class UserInfo {private Integer age;private String intro;private String gender;
} package com.itheima.mp.domain.po;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.itheima.mp.enums.UserStatus;
import lombok.Data;import java.time.LocalDateTime;Data
TableName(value user, autoResultMap true)
public class User {/*** 用户id*/TableId(type IdType.AUTO)private Long id;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 注册手机号*/private String phone;/*** 详细信息*/TableField(typeHandler JacksonTypeHandler.class)private UserInfo info;/*** 使用状态1正常 2冻结*/private UserStatus status;/*** 账户余额*/private Integer balance;/*** 创建时间*/private LocalDateTime createTime;/*** 更新时间*/private LocalDateTime updateTime;
}
package com.itheima.mp.domain.vo;import com.itheima.mp.domain.po.UserInfo;
import com.itheima.mp.enums.UserStatus;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.util.List;Data
ApiModel(description 用户VO实体)
public class UserVO {ApiModelProperty(用户id)private Long id;ApiModelProperty(用户名)private String username;ApiModelProperty(详细信息)private UserInfo info;ApiModelProperty(使用状态1正常 2冻结)private UserStatus status;ApiModelProperty(账户余额)private Integer balance;ApiModelProperty(用户的收货地址)private ListAddressVO addresses;
}插件功能 分页插件 package com.itheima.mp.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
public class MyBatisConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();//创建分页插件PaginationInnerInterceptor paginationInnerInterceptor new PaginationInnerInterceptor(DbType.MYSQL);paginationInnerInterceptor.setMaxLimit(1000L);// 添加分页插件interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}} Testvoid testPageQuery(){int pageNo 1, pageSize 2;// 准备分页条件// 1.1 分页条件Page page Page.of(pageNo, pageSize);// 1.2 排序条件page.addOrder(new OrderItem(balance, true));page.addOrder(new OrderItem(id,true));// 2. 分页查询PageUser p userService.page(page);// 3. 解析// 2.总条数System.out.println(total p.getTotal());// 3.总页数System.out.println(pages p.getPages());// 4.数据ListUser records p.getRecords();records.forEach(System.out::println);}通用分页实体 package com.itheima.mp.domain.query;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;Data
ApiModel(description 分页查询实体)
public class PageQuery {ApiModelProperty(页码)private Long pageNo;ApiModelProperty(页码)private Long pageSize;ApiModelProperty(排序字段)private String sortBy;ApiModelProperty(是否升序)private Boolean isAsc;
}package com.itheima.mp.domain.query;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;EqualsAndHashCode(callSuper true)
Data
ApiModel(description 用户查询条件实体)
public class UserQuery extends PageQuery{ApiModelProperty(用户名关键字)private String name;ApiModelProperty(用户状态1-正常2-冻结)private Integer status;ApiModelProperty(余额最小值)private Integer minBalance;ApiModelProperty(余额最大值)private Integer maxBalance;
}
controller层 ApiOperation(根据分页查询用户接口)GetMapping(/page)public PageDtoUserVO queryUsersPage(UserQuery query){return userService.queryUsersPage(query);}service层
Overridepublic PageDtoUserVO queryUsersPage(UserQuery query) {String name query.getName();Integer status query.getStatus();// 构建分页条件// 1.1分页条件PageUser page Page.of(query.getPageNo(), query.getPageSize());// 1.2 排序条件if(StrUtil.isNotBlank(query.getSortBy())){// 不为空page.addOrder(new OrderItem(query.getSortBy(),query.getIsAsc()));}else{// 为空默认按照更新时间排序page.addOrder(new OrderItem(update_time,false));}// 2. 分页查询PageUser p lambdaQuery().like(name ! null, User::getUsername, name).eq(status ! null, User::getStatus,status).page(page);// 封装VO结果PageDtoUserVO dto new PageDto();// 3.1 总条数dto.setTotal(p.getTotal());// 3.2 总页数dto.setPages(p.getPages());// 3.3 当前页数据ListUser records p.getRecords();if(CollUtil.isEmpty(records)){dto.setList(Collections.emptyList());return dto;}// 3.4 拷贝user的VOListUserVO vos BeanUtil.copyToList(records, UserVO.class);dto.setList(vos);// 4返回return dto;}package com.itheima.mp.domain.query;import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.mp.domain.po.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;Data
ApiModel(description 分页查询实体)
public class PageQuery {ApiModelProperty(页码)private Integer pageNo 1;ApiModelProperty(页码)private Integer pageSize 5;ApiModelProperty(排序字段)private String sortBy;ApiModelProperty(是否升序)private Boolean isAsc true;public T PageT toMpPage(OrderItem ... items){// 1.1分页条件PageT page Page.of(pageNo, pageSize);// 1.2 排序条件if(StrUtil.isNotBlank(sortBy)){// 不为空page.addOrder(new OrderItem(sortBy,isAsc));}else if(items ! null){// 为空默认排序page.addOrder(items);}return page;}public T PageT toMpPage(String defaultSortBy, Boolean defaultAsc){return toMpPage(new OrderItem(defaultSortBy,defaultAsc));}public T PageT toMpPageDefaultSortByCreateTime(){return toMpPage(new OrderItem(create_time,false));}public T PageT toMpPageDefaultSortByUpdateTime(){return toMpPage(new OrderItem(update_time,false));}}package com.itheima.mp.domain.dto;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;Data
ApiModel(description 分页结果)
public class PageDTOT {ApiModelProperty(总条数)private Long total;ApiModelProperty(总页数)private Long pages;ApiModelProperty(集合)private ListT list;public static PO,VO PageDTOVO of(PagePO p, FunctionPO,VO convertor){PageDTOVO dto new PageDTO();// 3.1 总条数dto.setTotal(p.getTotal());// 3.2 总页数dto.setPages(p.getPages());// 3.3 当前页数据ListPO records p.getRecords();if(CollUtil.isEmpty(records)){dto.setList(Collections.emptyList());return dto;}// 3.4 拷贝user的VOdto.setList(records.stream().map(convertor).collect(Collectors.toList()));// 4返回return dto;}
}
封装完成后分页查询的实现就更简洁了
Overridepublic PageDTOUserVO queryUsersPage(UserQuery query) {String name query.getName();Integer status query.getStatus();// 构建分页条件PageUser page query.toMpPageDefaultSortByUpdateTime();// 2. 分页查询PageUser p lambdaQuery().like(name ! null, User::getUsername, name).eq(status ! null, User::getStatus,status).page(page);// 3.封装VO结果PageDTOUserVO dto new PageDTO();return PageDTO.of(p,user-{// 1. 拷贝基础属性UserVO vo BeanUtil.copyProperties(user, UserVO.class);// 2. 处理特殊逻辑vo.setUsername(vo.getUsername().substring(0, vo.getUsername().length() - 2) **);return vo;});}