引入 lombok org.projectlombok
。Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发,SpringBoot目前默认集成了lombok技术,并提供了对应的版本控制,所以只需要提供对应的坐标即可,在pom.xml中添加lombok的坐标。
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
创建 entity 目录,在其包下创建对应Entity。 由于已经引入 lombok,实体类上可直接使用 @Data
注解。使用lombok可以通过一个注解@Data
完成一个实体类对应的getter,setter,toString,equals,hashCode等操作的快速添加。
package com.ty.entity;
import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
private Integer age;
}
导入MyBatisPlus 对应的starter mybatis-plus-boot-starter
与 mysql 驱动 mysql-connector-java
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
<scope>runtime</scope>
</dependency>
创建对应mapper包,并创建 DemoMapper接口,由于使用MyBatisPlus技术,使用MP的标准通用接口BaseMapper
加速开发,并添加注解 @Mapper
和泛型的指定。
package com.ty.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ty.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface DemoMapper extends BaseMapper<User> {
}
在 application.yml
配置文件中,配置数据库连接相关的数据源配置
id-type: auto
: 设置主键id字段的生成策略为参照数据库设定的策略,当前数据库设置id生成策略为自增。
table-prefix: XX
:设置表名通用前缀。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ty
username: root
password: 123
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_ #设置表名通用前缀
id-type: auto #设置主键id字段的生成策略为参照数据库设定的策略,当前数据库设置id生成策略为自增
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #输出MP运行日志
mybatisplus提供了通过配置的形式就可以查阅执行期SQL语句,配置 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
会将生成 SQL与执行结果输出到控制台,也可选择其提供的各种输出方式。
创建对应dao包,注入之前创建的demoMapper,即可直接使用MyBatisPlus自带的增删改查。
package com.ty.dao;
import com.ty.entity.User;
import com.ty.mapper.DemoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class DemoDao {
@Autowired
private DemoMapper demoMapper;
public void deleteUserById(Integer id){
demoMapper.deleteById(id);
}
public void updateUser(User user){
demoMapper.updateById(user);
}
}
Mybatis Plus提供了 selectPage 等分页查询方法。其中selectPage方法需传入一个由MybatisPlus封装分页数据的对象,可以通过new的形式创建这个对象 IPage page = new Page(pageNo, pageSize)
。
package com.ty.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ty.entity.User;
import com.ty.mapper.DemoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class DemoDao {
@Autowired
private DemoMapper demoMapper;
public IPage selectUserByPage(Integer currentPage, Integer pageSize) {
IPage page = new Page(currentPage,pageSize);
return demoMapper.selectPage(page, null);
}
public void deleteUserById(Integer id){
demoMapper.deleteById(id);
}
public void updateUser(User user){
demoMapper.updateById(user);
}
}
但对于MySQL,分页使用 limit,但其他数据库却不使用 limit。为提升 mybatis plus的兼容性,故将分页操作进行了拦截器形式优化。
定义mybatis plus 拦截器:
创建 Interceptor 包,并创建 MybatisPlusInterceptor 拦截器栈。
package com.ty.interceptor;
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 MybatisPlusInterceptorConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
通过测试类进行验证,此时分页查询已经生效。
总结
以往我们写条件查询要自己动态拼写复杂的SQL语句,而 mybatis plus 提供有强大的条件查询功能。
userLambdaQueryWrapper.like(boolean condition, R column, Object val)
第一个参数Condition 可作为判空验证。package com.ty.dao;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ty.entity.User;
import com.ty.mapper.DemoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class DemoDao {
@Autowired
private DemoMapper demoMapper;
public IPage selectUserByPage(Integer currentPage, Integer pageSize) {
IPage page = new Page(currentPage,pageSize);
return demoMapper.selectPage(page, null);
}
public List<User> selectUserByName(String name) {
LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
userLambdaQueryWrapper.like(User::getName, name);
userLambdaQueryWrapper.like(name != null, User::getName, name);
return demoMapper.selectList(userLambdaQueryWrapper);
}
public void deleteUserById(Integer id){
demoMapper.deleteById(id);
}
public void updateUser(User user){
demoMapper.updateById(user);
}
public void insertUser(User user){
demoMapper.insert(user);
}
}
通过测试类进行验证,即可直接进行条件查询。
package com.ty;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ty.dao.DemoDaoImpl;
import com.ty.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class SpringbootSsmpDemoApplicationTests {
@Autowired
private DemoDaoImpl demoDao;
@Test
void selectUserByNameTest() {
List<User> ty = demoDao.selectUserByName("ty");
System.out.println(ty);
}
}
创建service包,创建 UserService接口与其对应的UserServiceImpl实现类。其中编写业务逻辑,没啥过多可说的。
注意使用 @Service
注解,将其加入 SpringBoot bean容器中。
package com.ty.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ty.dao.DemoDao;
import com.ty.entity.User;
import com.ty.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private DemoDao demoDao;
public List<User> queryUserByName(String name){
return demoDao.selectUserByName(name);
}
public IPage queryUserByPage(Integer pageNo, Integer pageSize){
return demoDao.selectUserByPage(pageNo, pageSize);
}
public void deleteUserById(Integer id){
demoDao.deleteUserById(id);
}
public void updateUser(User user){
demoDao.updateUser(user);
}
public void insertUser(User user){
demoDao.insertUser(user);
}
}
继续创建 controller 包,创建基本的Controller实现类。
注意引入 @RestController
和 @RequestMapping("/user")
注解,将该Controller注入 Springboot bean容器中,并设置通用访问 url 为 /user
。
package com.ty.controller;
import com.ty.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
}
修改使用 @PutMapping
,Post请求使用 @PostMapping
, 删除使用 @DeleteMapping
,Get请求使用 @GetMapping
package com.ty.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ty.entity.User;
import com.ty.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("{name}")
public List<User> getUserById(@PathVariable String name){
return userService.queryUserByName(name);
}
@DeleteMapping("{id}")
public void deleteUserById(@PathVariable Integer id){
userService.deleteUserById(id);
}
/**
* GET请求传递路径变量,后台实用@PathVariable接收数据**
* @param pageNo
* @param pageSize
* @return
*/
@GetMapping("{pageNo}/{pageSize}")
public IPage<User> getUserByPage(@PathVariable Integer pageNo,@PathVariable Integer pageSize){
return userService.queryUserByPage(pageNo, pageSize);
}
@PutMapping
public void updateUser(@RequestBody User user){
userService.updateUser(user);
}
/**
* 实体数据:@RequestBody
* @param user
*/
@PostMapping
public void addUser(@RequestBody User user){
userService.insertUser(user);
}
}