org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
io.springfox
springfox-swagger2
io.springfox
springfox-swagger-ui
junit
junit
test
com.google.code.gson
gson
org.springframework.boot
spring-boot-maven-plugin
- 增加启动类,注意要用MapperScan注释来指定mapper接口代码的包路径:
package com.bolingcavalry.curd;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan(“com.bolingcavalry.curd.mapper”)
public class CurdApplication {
public static void main(String[] args) {
SpringApplication.run(CurdApplication.class, args);
}
}
- 本次实战用到了swagger,这样可以很方便的通过浏览器向各个controller接口发送请求,以下是配置类:
package com.bolingcavalry.curd;
import springfox.documentation.service.Contact;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Tag;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.tags(new Tag(“UserController”, “用户服务”), new Tag(“LogController”, “日志服务”))
.select()
// 当前包路径
.apis(RequestHandlerSelectors.basePackage(“com.bolingcavalry.curd.controller”))
.paths(PathSelectors.any())
.build();
}
//构建 api文档的详细信息函数,注意这里的注解引用的是哪个
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title(“MyBatis CURD操作”)
//创建人
.contact(new Contact(“程序员欣宸”, “https://github.com/zq2599/blog_demos”, “zq2599@gmail.com”))
//版本号
.version(“1.0”)
//描述
.description(“API 描述”)
.build();
}
}
- application.yml内容如下:
server:
port: 8080
spring:
数据源
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.50.43:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis配置
mybatis:
配置文件所在位置
config-location: classpath:mybatis-config.xml
映射文件所在位置
mapper-locations: classpath:mappers/*Mapper.xml
日志配置
logging:
level:
root: INFO
com:
bolingcavalry:
curd:
mapper: debug
- 增加user表的实体类User.java,里面带有swagger的注解,方便在swagger页面展示:
package com.bolingcavalry.curd.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(description = “用户实体类”)
public class User {
@ApiModelProperty(value = “用户ID”)
private Integer id;
@ApiModelProperty(value = “用户名”, required = true)
private String name;
@ApiModelProperty(value = “用户地址”, required = false)
private Integer age;
@Override
public String toString() {
return “User{” +
“id=” + id +
“, name=’” + name + ‘’’ +
“, age=” + age +
‘}’;
}
// 省去get和set方法,请您自行补齐
}
- 增加log表的实体类Log.java,里面带有swagger的注解,方便在swagger页面展示:
package com.bolingcavalry.curd.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.sql.Date;
/**
-
@Description: 实体类
-
@author: willzhao E-mail: zq2599@gmail.com
-
@date: 2020/8/4 8:24
*/
@ApiModel(description = “日志实体类”)
public class Log {
@ApiModelProperty(value = “日志ID”)
private Integer
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
id;
@ApiModelProperty(value = “用户ID”)
private Integer userId;
@ApiModelProperty(value = “日志内容”)
private String action;
@ApiModelProperty(value = “创建时间”)
private Date createTime;
@Override
public String toString() {
return “Log{” +
“id=” + id +
“, userId=” + userId +
“, action=’” + action + ‘’’ +
“, createTime=” + createTime +
‘}’;
}
// 省去get和set方法,请您自行补齐
}
- 为联表查询的结果准备一个bean,名为LogExtend.java,继承自Log.java,自己只有个userName字段,对应联表查询user表的name字段:
package com.bolingcavalry.curd.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(description = “日志实体类(含用户表的字段)”)
public class LogExtend extends Log {
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@ApiModelProperty(value = “用户名”)
private String userName;
@Override
public String toString() {
return “LogExtend{” +
“id=” + getId() +
“, userId=” + getUserId() +
“, userName=’” + getUserName() + ‘’’ +
“, action=’” + getAction() + ‘’’ +
“, createTime=” + getCreateTime() +
‘}’;
}
}
- 增加user表的mapper映射文件,可见都是些很简单sql,要注意的是批量新增的节点,这里面用到了foreach语法,可以通过集合动态生成sql:
select * from user where id = #{id}
insert into user (id, name, age) values (#{id}, #{name}, #{age})
insert into user (id, name, age)
values
(#{user.id}, #{user.name}, #{user.age})
select id, name, age from user where name like concat(’%’, #{name}, ‘%’)
delete from user where id= #{id}
delete from user
update user set name = #{name}, age = #{age} where id = #{id}
select count(*) from user
- 增加log表的mapper映射文件,如下所示,请关注联表操作selExtend,其结果是logExtendResultMap:
insert into log (id, user_id, action, create_time) values (#{id}, #{userId}, #{action}, #{createTime})
select l.id as id,
l.user_id as user_id,
l.action as action,
l.create_time as create_time,
u.name as user_name
from log as l
left join user as u
on l.user_id = u.id
where l.id = #{id}
- 增加用户表的mapper接口类UserMapper.java ,对应着映射文件中的sql节点的id:
package com.bolingcavalry.curd.mapper;
import com.bolingcavalry.curd.entity.LogExtend;
import com.bolingcavalry.curd.entity.User;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserMapper {
User sel(int id);
int insertWithFields(User user);
int insertBatch(List users);
int clearAll();
List findByName(String name);
int update(User user);
int delete(int id);
int totalCount();
LogExtend selExtend(int id);
}
- 增加日志表的mapper接口类LogMapper.java,对应着映射文件中的sql节点的id:
package com.bolingcavalry.curd.mapper;
import com.bolingcavalry.curd.entity.Log;
import com.bolingcavalry.curd.entity.LogExtend;
import org.springframework.stereotype.Repository;
@Repository
public interface LogMapper {
Log sel(int id);
LogExtend selExtend(int id);
int insertWithFields(Log log);
}
- mapper接口完成后就是service层,先写user表的service,如下所示,可见都是对mapper接口的调用:
package com.bolingcavalry.curd.service;
import com.bolingcavalry.curd.entity.User;
import com.bolingcavalry.curd.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public User sel(int id) {
return userMapper.sel(id);
}
public User insertWithFields(User user) {
userMapper.insertWithFields(user);
return user;
}
public List insertBatch(List users) {
userMapper.insertBatch(users);
return users;
}
public int clearAll() {
return userMapper.clearAll();
}
public List findByName(String name) {
return userMapper.findByName(name);
}
public int update(User user) {
return userMapper.update(user);
}
public int delete(int id) {
return userMapper.delete(id);
}
public int totalCount() {
return userMapper.totalCount();
}
}
- 还有log表的service:
package com.bolingcavalry.curd.service;
import com.bolingcavalry.curd.entity.Log;
import com.bolingcavalry.curd.entity.LogExtend;
import com.bolingcavalry.curd.entity.User;
import com.bolingcavalry.curd.mapper.LogMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class LogService {
@Autowired
LogMapper logMapper;
public Log sel(int id){
return logMapper.sel(id);
}
public LogExtend selExtend(int id) {
return logMapper.selExtend(id);
}
public Log insertWithFields(Log log) {
logMapper.insertWithFields(log);
return log;
}
}
- 最后是controller层了,由于使用了swagger,导致controller相对上一篇略微复杂(多了些注解):
package com.bolingcavalry.curd.controller;
import com.bolingcavalry.curd.entity.User;
import com.bolingcavalry.curd.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/user")
@Api(tags = {“UserController”})
public class UserController {
@Autowired
private UserService userService;
@ApiOperation(value = “新增user记录”, notes=“新增user记录”)
@RequestMapping(value = “/insertwithfields”,method = RequestMethod.PUT)
public User create(@RequestBody User user) {
return userService.insertWithFields(user);
}
@ApiOperation(value = “批量新增user记录”, notes=“批量新增user记录”)
@RequestMapping(value = “/insertbatch”, method = RequestMethod.PUT)
public List insertBatch(@RequestBody List users) {
return userService.insertBatch(users);
}
@ApiOperation(value = “删除指定ID的user记录”, notes=“删除指定ID的user记录”)
@ApiImplicitParam(name = “id”, value = “用户ID”, paramType = “path”, required = true, dataType = “Integer”)
@RequestMapping(value = “/{id}”, method = RequestMethod.DELETE)
public int delete(@PathVariable int id){
return userService.delete(id);
}
@ApiOperation(value = “删除user表所有数据”, notes=“删除user表所有数据”)
@RequestMapping(value = “/clearall”, method = RequestMethod.DELETE)
public int clearAll(){
return userService.clearAll();
}
@ApiOperation(value = “根据ID修改user记录”, notes=“根据ID修改user记录”)
@RequestMapping(value = “/update”, method = RequestMethod.POST)
public int update(@RequestBody User user){
return userService.update(user);
}
@ApiOperation(value = “根据名称模糊查找所有user记录”, notes=“根据名称模糊查找所有user记录”)
@ApiImplicitParam(name = “name”, value = “用户名”, paramType = “path”, required = true, dataType = “String”)
@RequestMapping(value = “/findbyname/{name}”, method = RequestMethod.GET)
public List findByName(@PathVariable(“name”) String name){
return userService.findByName(name);
}
@ApiOperation(value = “根据ID查找user记录”, notes=“根据ID查找user记录”)
@ApiImplicitParam(name = “id”, value = “用户ID”, paramType = “path”, required = true, dataType = “Integer”)
@RequestMapping(value = “/{id}”, method = RequestMethod.GET)
public User GetUser(@PathVariable int id){
return userService.sel(id);
}
@ApiOperation(value = “获取总数”, notes=“获取总数”)
@RequestMapping(value = “/totalcount”, method = RequestMethod.GET)
public int totalcount(){
return userService.totalCount();
}
}
- log的controller如下:
package com.bolingcavalry.curd.controller;
import com.bolingcavalry.curd.entity.Log;
import com.bolingcavalry.curd.entity.LogExtend;
import com.bolingcavalry.curd.service.LogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/log")
@Api(tags = {“LogController”})