前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot + jpa + redis + hibernate validator + 后台抽象

springboot + jpa + redis + hibernate validator + 后台抽象

作者头像
DencyCheng
发布2018-11-05 16:10:33
1.6K0
发布2018-11-05 16:10:33
举报
文章被收录于专栏:SpringBootSpringBoot

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文目的:

1.想写一套自己的后台框架

2.激励自己学习的兴趣

那么代码开始

一,pom 文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.dencycheng</groupId>
    <artifactId>admin</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>admin</name>
    <description>后台管理</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- 返回Json -->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

二,配置文件 application.yml

代码语言:javascript
复制
#server
server:
   port:8080
   server.tomcat.uri-encoding:UTF-8
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jpatest?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    username: root
    password: 123456
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate.format_sql: true
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: UTC
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 1000

三,公共dao层

代码语言:javascript
复制
package com.dencycheng.framework.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

/**
 * @author  DencyCheng
 * @param <T>
 */
@NoRepositoryBean
public interface BaseDao<T> extends JpaRepository<T, Integer>, JpaSpecificationExecutor<T> {
     T findOneById(Integer id);
}

四,公共service层

代码语言:javascript
复制
package com.dencycheng.framework.service;

import com.dencycheng.framework.common.ResponseResult;
import com.dencycheng.framework.dao.BaseDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.util.StringUtils;

import java.util.List;
import javax.persistence.criteria.*;

/**
 * Created by Dency Cheng on 2018/8/7/007.
 */
@EnableCaching
public class BaseService<T> {

    @Autowired
    BaseDao<T> baseDao;

    
    public T save(T t) {
        return baseDao.save(t);
    }

    public void deleteById(Integer id) {
        baseDao.deleteById(id);
    }

    public void batchDelete(List deleteList) {
        baseDao.deleteAll(deleteList);
    }

    public T findOneById(Integer id) {
        return baseDao.findOneById(id);
    }

    @Cacheable(value = "searchList",key = "#root.targetClass.simpleName+':'+#root.methodName+':'+#root.args")
    public ResponseResult searchList(Integer num, Integer size, String name) {

        int newNum = StringUtils.isEmpty(num) ? 0 : num;
        int newSize = StringUtils.isEmpty(size) ? 10 : size;
        Sort sort = new Sort(Sort.Direction.DESC, "createDt");
        Pageable pageable = new PageRequest(newNum, newSize, sort);
        Page<T> pages = null;
        if (StringUtils.isEmpty(name)) {
            pages = baseDao.findAll(pageable);
        } else {
            Specification<T> specifications = new Specification<T>() {
                @Override
                public Predicate toPredicate(Root root,
                                             CriteriaQuery query,
                                             CriteriaBuilder cb) {
                    Path path = root.get("name");
                    return cb.like(path, name);
                }
            };
        }

        if (pages.getContent().size() == 0) {
            return ResponseResult.noResult();
        } else {
            return ResponseResult.isScuess(pages);
        }


    }
  
}

五,返回类 

ResponseResult 

代码语言:javascript
复制
package com.dencycheng.framework.common;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.io.Serializable;

/**
 * 统一返回
 * @author DencyCheng
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult implements Serializable{
    private Integer code;
    private String state;
    private Object data;

    /**
     * 正常返回结果
     * @param object
     * @return
     */
    public static ResponseResult isScuess(Object object){
        return new ResponseResult(Code.SUCCESS.getCode(), State.SCUUESS.name(),object);
    }

    /**
     * 正常返回结果
     * @return
     */
    public static ResponseResult isScuess(){
        return new ResponseResult(Code.SUCCESS.getCode(), State.SCUUESS.name(),"操作成功");
    }

    /**
     * 查询无结果
     * @return
     */
    public static ResponseResult noResult(){
        return new ResponseResult(Code.NORESULT.getCode(), State.SCUUESS.name(),"无数据");
    }

    /**
     * 返回错误信息
     * @param object
     * @return
     */
    public static ResponseResult isError(Object object){
        return new ResponseResult(Code.ERROR.getCode(), State.ERROR.name(),object);
    }

    /**
     * 参数错误
     * @param object
     * @return
     */
    public static ResponseResult isParmError(Object object){
        return new ResponseResult(Code.PARMERROR.getCode(), State.ERROR.name(),object);
    }

    /**
     * 参数错误
     * @return
     */
    public static ResponseResult isParmError(){
        return new ResponseResult(Code.PARMERROR.getCode(), State.ERROR.name(),"缺少参数");
    }


    public ResponseResult(Integer code, String state, Object data) {
        this.code = code;
        this.state = state;
        this.data = data;
    }

    public ResponseResult(Integer code, String state) {
        this.code = code;
        this.state = state;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}
代码语言:javascript
复制
Code
代码语言:javascript
复制
package com.dencycheng.framework.common;

/**
 * 返回结果CODE
 */
public enum Code {
    SUCCESS("成功",200),
    NORESULT("没有检索到数据",201),
    PARMERROR("参数错误",202),
    ERROR("失败",202),
    NOPERMISSION ("无权限访问",40001);

    private String desc;
    private int code;

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    Code(String desc, int code) {
        this.desc = desc;
        this.code = code;
    }
}

State

代码语言:javascript
复制
package com.dencycheng.framework.common;

/**
 * 请求状态
 */
public enum State {
    SCUUESS,
    ERROR;
}

六,user类

代码语言:javascript
复制
package com.dencycheng.admin.model;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Date;

/**
 * 用户实体类
 * @author DencyCheng
 */
@Table(name = "t_user")
@Entity
public class User  implements Serializable {

    @Id
    @GeneratedValue
    private Integer id;

    @NotNull(message = "{CMM_E0008}年龄")
    @Max(value = 100, message = "年龄{CMM_E0017}100")
    @Min(value = 0, message = "{CMM_E0016}0")
    private Integer age;

    @NotNull(message = "{CMM_E0008}姓名")
    @Size(max = 9, message = "姓名{CMM_E0012}")
    private String name;

    private Date createDt;

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreateDt() {
        return createDt;
    }

    public void setCreateDt(Date createDt) {
        this.createDt = createDt;
    }
}

七,userDao

代码语言:javascript
复制
package com.dencycheng.admin.dao;

import com.dencycheng.admin.model.User;
import com.dencycheng.framework.dao.BaseDao;

public interface UserDao extends BaseDao<User> {

}

八,userService

代码语言:javascript
复制
package com.dencycheng.admin.service;


import com.dencycheng.admin.dao.UserDao;
import com.dencycheng.admin.model.User;
import com.dencycheng.framework.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/**
 * @author DencyCheng
 */
@Service
public class UserService extends BaseService<User> {
    @Autowired
    UserDao userDao;
}

九,userController

代码语言:javascript
复制
package com.dencycheng.admin.controller;

import com.dencycheng.admin.model.User;
import com.dencycheng.admin.service.UserService;
import com.dencycheng.framework.common.ResponseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;

/**
 * 用户控制器
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserService userService;

    /**
     * 搜索列表
     * @param num
     * @param size
     * @param name
     * @return
     */
    @PostMapping("list/{num}/{size}")
    private ResponseResult searchList(@PathVariable Integer num,@PathVariable Integer size, String name){
        return userService.searchList(num,size,name);
    }


    /**
     * 查询单个用户
     *
     * @param id
     * @return
     */
    @PostMapping("/findOneById/{id}")
    private ResponseResult findOneById(@PathVariable Integer id) {
        if (id == null) {
            return ResponseResult.isParmError();
        }
        User user = userService.findOneById(id);
        if (user == null) {
            return ResponseResult.noResult();
        } else {
            return ResponseResult.isScuess(user);
        }
    }

    /**
     * 保存,更新
     *
     * @return
     */
    @PostMapping("/save")
    private ResponseResult save(@Valid User user, BindingResult result) {
        Map<String, String> errorsMap = new HashMap<String, String>();
        // 普通校验
        if (result.hasErrors()) {
            result.getFieldErrors().forEach(p -> {
                errorsMap.put(p.getField(), p.getDefaultMessage());
            });
        }

        if (!errorsMap.isEmpty()) {
            return ResponseResult.isParmError(errorsMap);
        }

        //业务校验
        
        return ResponseResult.isScuess(userService.save(user));
    }

    /**
     * 删除
     *
     * @return
     */
    @PostMapping("/delete/{id}")
    private ResponseResult delete(@PathVariable Integer id) {

        if (id == null) {
            return ResponseResult.isParmError();
        }
        userService.deleteById(id);
        return ResponseResult.isScuess();
    }


}

注:项目还在改善中,现在不是很完美

项目码云地址:https://gitee.com/DencyCheng/admin-api

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年08月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档