一、SpringBoot项目创建
- Idea中创建New Project,选择Spring Initializr,输入Name、Location、JDK等,下一步。
- 选择合适的 SpringBoot 版本,点击创建。
此时,SpringBoot基础项目已经创建完毕。
二、Entity 开发
-
引入 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; }
三、DAO 开发
1、参数配置与Dao创建
-
导入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> { }
接口BaseMapper
中默认提供了各种增删改查常用方法,继承后即可直接使用。
-
在
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);
}
}
2、分页查询
Mybatis Plus提供了 selectPage 等分页查询方法。其中selectPage方法需传入一个由MybatisPlus封装分页数据的对象,可以通过new的形式创建这个对象 IPage page = new Page(pageNo, pageSize)
。
创建 dao包,随后创建 DemoDao 。
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;
}
}
通过测试类进行验证,此时分页查询已经生效。
总结
- 使用IPage封装分页数据
- 分页操作依赖MyBatisPlus分页拦截器实现功能
- 借助MyBatisPlus日志查阅执行SQL语句
3、条件查询
以往我们写条件查询要自己动态拼写复杂的SQL语句,而 mybatis plus 提供有强大的条件查询功能。
- 通过一个用于封装查询条件的对象QueryWrapper ,该对象可以动态使用API调用的方法添加条件,最终转化成对应的SQL语句。
- 针对字段检查,mybatis plus 全面支持Lambda表达式,可代替QueryWrapper ,使用LambdaQueryWrapper对象。
- 为了便于开发者动态拼写SQL,防止将null数据作为条件使用,
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 开发
创建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 包,创建基本的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;
}
Restful接口开发
修改使用 @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);
}
}