SpringBoot快速构建Web-Model后端 Restful 接⼝发布
基础准备
所需依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
<!--springboot的web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--文件支持-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!--springboot的测试启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--MySQL & MyBatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
项目基本结构
application.yml
# 服务基本配置
server:
port: 8989
servlet:
context-path: /
# 防止数据库等中文乱码
tomcat:
uri-encoding: UTF-8
spring:
# 数据源
datasource:
url: jdbc:mysql://localhost:3306/login?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123
# 文件上传
servlet:
multipart:
enabled: true
max-file-size: 1MB
location: E:/userUpdate
# post表单提交乱码
http:
encoding:
charset: UTF-8
# MyBatis配置信息
mybatis:
mapper-locations: classpath:com/baizhi/mapper/*Mapper.xml
type-aliases-package: com.baizhi.entity
# 批量处理
executor-type: batch
IUserDaoMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baizhi.dao.IUserDAO">
<!-- 添加 -->
<insert id="saveUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into t_user(name,password,sex,birthDay,photo,email)values(#{name},#{password},#{sex},#{birthDay},#{photo},#{email})
</insert>
<!-- 修改 -->
<update id="updateUser" parameterType="User" >
update t_user set name=#{name},sex=#{sex},birthDay=#{birthDay},photo=#{photo},email=#{email} where id=#{id}
</update>
<!-- 删除 -->
<delete id="deleteByUserId" parameterType="int">
delete from t_user where id=#{id}
</delete>
<!-- 分页、模糊查询 -->
<select id="queryUserByPage" resultType="User">
select id,name,sex,birthDay,photo ,email from t_user <if test="column != null"> where ${column} like '%${value}%' </if> limit ${pageSize} offset ${(pageNow-1)*pageSize}
</select>
<!-- 根据指定字段和值查询数量 -->
<select id="queryCount" resultType="int">
select count(*) from t_user <if test="column != null"> where ${column} like '%${value}%' </if>
</select>
<!-- 根据id查询 -->
<select id="queryUserById" resultType="User">
select id,name,sex,birthDay,photo ,email from t_user where id=#{id}
</select>
<!-- 根据用户名和密码查询 -->
<select id="queryUserByNameAndPassword" resultType="User">
select id,name,sex,birthDay,photo ,email from t_user where name=#{name} and password=#{password}
</select>
</mapper>
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender" >
<encoder>
<pattern>%p %c#%M %d{yyyy-MM-dd HH:mm:ss} %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/userLoginFile-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%p %c#%M %d{yyyy-MM-dd HH:mm:ss} %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 控制台输出日志级别 -->
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
<logger name="org.springframework.jdbc" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<logger name="com.baizhi.dao" level="TRACE" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<logger name="com.baizhi.controller" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<logger name="com.baizhi.cache.UserDefineRedisCache" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
</configuration>
t_user.sql
DROP TABLE IF EXISTS t_user;
set character_set_results=utf8;
set character_set_client=utf8;
CREATE TABLE t_user (
id int primary key AUTO_INCREMENT,
name varchar(32) unique ,
password varchar(128) ,
sex tinyint(1) ,
photo varchar(255) ,
birthDay date,
email varchar(128)
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8;
项⽬代码清单
User(entity)
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private Integer id;
private String name;
private boolean sex;
private String password;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern ="yyyy-MM-dd",timezone="GMT+8" )
private Date birthDay;
private String photo;
private String email;
public User() {
}
public User(String name, boolean sex, String password, Date birthDay, String photo, String email) {
this.name = name;
this.sex = sex;
this.password = password;
this.birthDay = birthDay;
this.photo = photo;
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean getSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", sex=" + sex +
", password='" + password + '\'' +
", birthDay=" + birthDay +
", photo='" + photo + '\'' +
", email='" + email + '\'' +
'}';
}
}
注解:
-
@DateTimeFormat(pattern = “yyyy-MM-dd”)
主要是前后到后台的时间格式的转换。将一个字符串转成一个Date对象,pojo类上的哪个Date类型的字段需要,就需要用@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”) 标记,这样前端页面传递过来的String类型的时间 ‘2016-11-11 11:11:11’ 会转换为 Date 类型。
页面将数据传到后台,是以字符串的形式。所以时间格式会出错。加上此注解,后台可解析时间格式的字符串。
-
@JsonFormat
主要是后台到前台的时间格式的转换。用法 为在属性值上 @JsonFormat(pattern=”yyyy-MM-dd”,timezone=”GMT+8”),如果直接使用@JsonFormat(pattern=”yyyy-MM-dd”)就会出现2018-08-01 08:00:00的情况, 会相差8个小时,因为我们是东八区(北京时间)。所以我们在格式化的时候要指定时区(timezone )
IUserDAO(dao)
import com.baizhi.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface IUserDAO {
void saveUser(User user);
User queryUserByNameAndPassword(User user);
User queryUserById(Integer id);
void deleteByUserId(Integer id);
List<User> queryUserByPage(
@Param(value = "pageNow") Integer pageNow,
@Param(value = "pageSize") Integer pageSize,
@Param(value = "column") String column,
@Param(value = "value") Object value);
int queryCount(
@Param(value = "column") String column,
@Param(value = "value") Object value);
void updateUser(User user);
}
注解:
-
@Param
1.便于传多个参数;2.类似于别名之类的功能当你使用了使用@Param注解来声明参数时,如果使用 #{} 或 ${} 的方式都可以。
IUserService(service)
import com.baizhi.entity.User;
import java.util.List;
public interface IUserService {
/**
* 保存⽤户
* @param user
*/
void saveUser(User user);
/**
* 根据密码和⽤户名查询⽤户
* @param user
* @return
*/
User queryUserByNameAndPassword(User user);
/***
*
* @param pageNow
* @param pageSize
* @param column 模糊查询列
* @param value 模糊值
* @return
*/
List<User> queryUserByPage(Integer pageNow, Integer pageSize,
String column, Object value);
/**
* 查询⽤户总记录
* @param column
* @param value
* @return
*/
int queryUserCount(String column, Object value);
/**
* 根据ID查询⽤户信息
* @param id
* @return
*/
User queryUserById(Integer id);
/**
* 根据IDS删除⽤户
* @param ids
*/
void deleteByUserIds(Integer[] ids);
/**
* 更新⽤户信息
* @param user
*/
void updateUser(User user);
}
IUserServiceImpl (ServiceImpl)
import com.baizhi.dao.IUserDAO;
import com.baizhi.entity.User;
import com.baizhi.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional(propagation = Propagation.SUPPORTS)
public class IUserServiceImpl implements IUserService {
@Autowired
private IUserDAO userDAO;
@Transactional(propagation = Propagation.REQUIRED,readOnly = false)
public void saveUser(User user) {
userDAO.saveUser(user);
}
public User queryUserByNameAndPassword(User user) {
User u = userDAO.queryUserByNameAndPassword(user);
return u;
}
public List<User> queryUserByPage(Integer pageNow, Integer pageSize, String column, Object value) {
return userDAO.queryUserByPage(pageNow,pageSize,column,value);
}
@Override
public int queryUserCount(String column, Object value) {
return userDAO.queryCount(column,value);
}
public User queryUserById(Integer id) {
return userDAO.queryUserById(id);
}
@Transactional(propagation = Propagation.REQUIRED,readOnly = false)
@Override
public void deleteByUserIds(Integer[] ids) {
for (int i = 0; i < ids.length; i++) {
userDAO.deleteByUserId(ids[i]);
}
}
@Transactional(propagation = Propagation.REQUIRED,readOnly = false)
public void updateUser(User user) {
userDAO.updateUser(user);
}
}
注解:
-
@Service
@service("serviceName")
: 表示给当前类命名一个别名,方便注入到其他类中;
@service
:不加的话,默认别名就是当前类名,但是首字母小写。 -
@Autowired
(1):自动根据类型注入
(2):这个注解是属于spring
(3):默认情况下必须要求依赖对象必须存在
(4):如果要允许null值,@Autowired(required=false)
SpringBootApplication(SpringBoot入口)
@MapperScans(value ={
@MapperScan(basePackages = "com.baizhi.dao")
})
@org.springframework.boot.autoconfigure.SpringBootApplication
public class SpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication.class,args);
}
}
注解:
- @MapperScans(value ={
@MapperScan(basePackages = “com.baizhi.dao”)
})
包扫描:@MapperScans中可以扫描多个包 - @SpringBootApplication
组合注解:一个注解结合多个注解的功能。
@Configuration
:加在类上声明当前类为配置类 其功能相当于一个spring的配置文件。
@EnableAutoConfiguration
:开启自动配置 (自动将项目中的相关组件交由工厂管理)(自动配置原理 )。
@ComponentScan
:组件扫描的(@Component @Repository @Service @Controller)。
RestControler发布(controller)
form表单参数接收
@RestController
@RequestMapping(value = "/formUserManager")
public class FormUserController {
private static final Logger LOGGER= LoggerFactory.getLogger(FormUserController.class);
@Autowired
private IUserService userService;
@PostMapping(value = "/registerUser")
public User registerUser(User user,
@RequestParam(value = "multipartFile",required = false) MultipartFile multipartFile) throws IOException {
if(multipartFile!=null){
String fileName=multipartFile.getOriginalFilename();
String suffix=fileName.substring(fileName.lastIndexOf("."));
File tmpFile = File.createTempFile(fileName.substring(0,fileName.lastIndexOf(".")),suffix);
System.out.println(tmpFile.getName());
tmpFile.delete();
}
userService.saveUser(user);
return user;
}
@PostMapping(value = "/userLogin")
public User userLogin(User user) {
return userService.queryUserByNameAndPassword(user);
}
@PostMapping(value = "/addUser")
public User addUser(User user,
@RequestParam(value = "multipartFile",required = false) MultipartFile multipartFile) throws IOException {
if(multipartFile!=null){
String fileName=multipartFile.getOriginalFilename();
String suffix=fileName.substring(fileName.lastIndexOf("."));
File tmpFile = File.createTempFile(fileName.substring(0,fileName.lastIndexOf(".")),suffix);
System.out.println(tmpFile.getName());
tmpFile.delete();
}
userService.saveUser(user);
return user;
}
@PutMapping(value = "/updateUser")
public void updateUser(User user,
@RequestParam(value = "multipartFile",required = false) MultipartFile multipartFile) throws IOException {
if(multipartFile!=null){
String fileName=multipartFile.getOriginalFilename();
String suffix=fileName.substring(fileName.lastIndexOf("."));
File tmpFile = File.createTempFile(fileName.substring(0,fileName.lastIndexOf(".")),suffix);
System.out.println(tmpFile.getName());
tmpFile.delete();
}
//更新用户信息
userService.updateUser(user);
}
@DeleteMapping(value = "/deleteUserByIds")
public void delteUserByIds(@RequestParam(value = "ids") Integer[] ids){
userService.deleteByUserIds(ids);
}
@GetMapping(value = "/queryUserByPage")
public List<User> queryUserByPage(@RequestParam(value = "page",defaultValue = "1") Integer pageNow,
@RequestParam(value = "rows",defaultValue = "10") Integer pageSize,
@RequestParam(value = "column",required = false) String column,
@RequestParam(value = "value",required = false) String value){
HashMap<String, Object> results = new HashMap<>();
results.put("total",userService.queryUserCount(column,value));
results.put("rows",userService.queryUserByPage(pageNow,pageSize,column,value));
return userService.queryUserByPage(pageNow,pageSize,column,value);
}
@GetMapping(value = "/queryUserCount")
public Integer queryUserCount( @RequestParam(value = "column",required = false) String column,
@RequestParam(value = "value",required = false) String value){
return userService.queryUserCount(column,value);
}
@GetMapping(value = "/queryUserById")
public User queryUserById(@RequestParam(value = "id") Integer id){
//从数据库中查询
return userService.queryUserById(id);
}
}
注解:
-
@RestController:
等价 @Controller + @ResponseBody。 -
@RequestMapping:请求映射,在Spring4.0注解开发中对RequestMapping进行丰富,分别按照请求类型。
@PostMapping
:新增
@GetMapping
:查询
@PutMapping
:修改
``@DeleteMapping:删除 -
@RequestParam:接收表单参数
json格式数据接收
@RestController
@RequestMapping(value = "/restUserManager")
public class RestUserController {
private static final Logger LOGGER= LoggerFactory.getLogger(RestUserController.class);
@Autowired
private IUserService userService;
@PostMapping(value = "/registerUser")
public User registerUser(@RequestPart(value = "user") User user,
@RequestParam(value = "multipartFile",required = false) MultipartFile multipartFile) throws IOException {
if(multipartFile!=null){
String fileName=multipartFile.getOriginalFilename();
String suffix=fileName.substring(fileName.lastIndexOf("."));
File tmpFile = File.createTempFile(fileName.substring(0,fileName.lastIndexOf(".")),suffix);
System.out.println(tmpFile.getName());
tmpFile.delete();
}
userService.saveUser(user);
return user;
}
@PostMapping(value = "/userLogin")
public User userLogin(@RequestBody User user) {
return userService.queryUserByNameAndPassword(user);
}
@PostMapping(value = "/addUser")
public User addUser(@RequestPart(value = "user") User user,
@RequestParam(value = "multipartFile",required = false) MultipartFile multipartFile) throws IOException {
if(multipartFile!=null){
String fileName=multipartFile.getOriginalFilename();
String suffix=fileName.substring(fileName.lastIndexOf("."));
File tmpFile = File.createTempFile(fileName.substring(0,fileName.lastIndexOf(".")),suffix);
System.out.println(tmpFile.getName());
tmpFile.delete();
}
userService.saveUser(user);
return user;
}
@PutMapping(value = "/updateUser")
public void updateUser(@RequestPart(value = "user") User user,
@RequestParam(value = "multipartFile",required = false) MultipartFile multipartFile) throws IOException {
if(multipartFile!=null){
String fileName=multipartFile.getOriginalFilename();
String suffix=fileName.substring(fileName.lastIndexOf("."));
File tmpFile = File.createTempFile(fileName.substring(0,fileName.lastIndexOf(".")),suffix);
System.out.println(tmpFile.getName());
tmpFile.delete();
}
//更新用户信息
userService.updateUser(user);
}
@DeleteMapping(value = "/deleteUserByIds")
public void delteUserByIds(@RequestParam(value = "ids") Integer[] ids){
userService.deleteByUserIds(ids);
}
@GetMapping(value = "/queryUserById")
public User queryUserById(@RequestParam(value = "id") Integer id){
//从数据库中查询
return userService.queryUserById(id);
}
@GetMapping(value = "/queryUserByPage")
public List<User> queryUserByPage(@RequestParam(value = "page",defaultValue = "1") Integer pageNow,
@RequestParam(value = "rows",defaultValue = "10") Integer pageSize,
@RequestParam(value = "column",required = false) String column,
@RequestParam(value = "value",required = false) String value){
HashMap<String, Object> results = new HashMap<>();
results.put("total",userService.queryUserCount(column,value));
results.put("rows",userService.queryUserByPage(pageNow,pageSize,column,value));
return userService.queryUserByPage(pageNow,pageSize,column,value);
}
@GetMapping(value = "/queryUserCount")
public Integer queryUserCount(@RequestParam(value = "column",required = false) String column,
@RequestParam(value = "value",required = false) String value){
return userService.queryUserCount(column,value);
}
}
注解:
- @RequestPart:在请求体同时接收 文件和json数据
- @RequestBody:仅仅接收json数据