用户综合分析系统:Java业务板块---SpringBoot快速构建Web-Model后端 Restful 接⼝发布

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数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值