[聚合文章] Spring Boot JAP + MySQL实战

MySQL 1900-01-01 20 阅读

可参考使用STS创建Spring Boot 项目创建一个新的Spring Boot 项目,创建项目时选择Web、JPA和MySQL等选项。

  • application.yml中的配置信息
  • 基于注解的shitibean
  • 基于JPA接口的简单应用
  • 多表多条件动态组合查询以及分页和排序

application.yml中的配置信息

spring:  datasource:    url: jdbc:mysql://192.168.10.58:3306/jianshu?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull    username: root    password: infcn123    platform: mysql  jpa:    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect    hibernate:      naming:        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl    database: mysql    show-sql: true      http:    encoding:      force: true      charset: UTF-8      enabled: true  jackson:    date-format: yyyy-MM-dd HH:mm:ss    joda-date-time-format: yyyy-MM-dd HH:mm:ss    time-zone:      GMT+8    serialization:      fail-on-empty-beans: falsesecurity:  basic:    enabled: falseserver:  tomcat:    uri-encoding: UTF-8  port: 8080

实体Bean配置

用户配置

import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.validation.constraints.Size;import org.springframework.data.annotation.CreatedDate;import com.fasterxml.jackson.annotation.JsonIgnore;import lombok.Data;import lombok.experimental.Accessors;/** * 系统用户 *  * @author 李庆海 */@Data@Accessors(chain = true)@Entity@Table(name = "SYS_USER")public class User implements java.io.Serializable {    private static final long serialVersionUID = 1L;    /***/    @Id    @Column(name = "ID", unique = true, nullable = false, length = 32)    private String id;    /** 登录账号 */    @Column(name = "LOGIN_NAME", nullable = false, length = 50)    @Size(max = 50)    private String loginName;    /** 用户名称 */    @Column(name = "USER_NAME", nullable = true, length = 50)    private String userName;    /** 登录密码 */    @Column(name = "PASSWORD", nullable = false, length = 32)    @JsonIgnore    private String password;    /** 注册日期 */    @Temporal(TemporalType.TIMESTAMP)    @Column(name = "CREATE_DATE", nullable = false)    @CreatedDate    private Date registDate;    /** 用户状态 */    @Column(name = "ENABLED", nullable = false, length = 1)    private Integer enabled;    /**     * 用户的角色     */    @ManyToOne(cascade = {}, fetch = FetchType.EAGER)    @JoinColumn(name = "ROLE_ID")    private Role role;}

角色配置

import java.io.Serializable;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.Table;import lombok.Data;import lombok.experimental.Accessors;/** * 系统角色 *  * @author 李庆海 * */@Data@Accessors(chain = true)@Entity@Table(name = "SYS_ROLE")public class Role implements Serializable {    private static final long serialVersionUID = -2139369027015540299L;    /** 主键 */    @Id    @Column(name = "ID", unique = true, length = 32, nullable = false)    private String id;    /** 角色描述 */    @Column(name = "DES", length = 255, nullable = false)    private String des;    /** 角色名称 */    @Column(name = "TITLE", length = 20, nullable = true)    private String title;    /** 角色排序 */    @Column(name = "SORTER", length = 3, nullable = false)    private Integer sorter;}

基于JPA接口的简单应用

JpaRepository实现了PagingAndSortingRepository接口,PagingAndSortingRepository接口实现了CrudRepository接口,CrudRepository接口实现了Repository接口。save方法既可以新增又可以更新,只是在更新一个数据库中不存在的对象时会添加一个指定id的实例对象。findBy系列只能实现简单的、固定参数的查询,对于动态查询无能为力。

继承JpaRepository的RoleRepository 角色接口

import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Query;import cn.com.infcn.jianshu.model.Role;/** * 系统角色数据访问类 * @author 李庆海 * */public interface RoleRepository extends JpaRepository<Role, String> {    @Query("select max(t.sorter) from Role t")    Integer getMaxSorter();}

RoleService服务类

import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Example;import org.springframework.data.domain.ExampleMatcher;import org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import cn.com.infcn.jianshu.dao.RoleRepository;import cn.com.infcn.jianshu.model.Role;import cn.com.infcn.jianshu.util.StringUtil;/** * 系统角色Service类 *  * @author 李庆海 * */@Servicepublic class RoleService {    @Autowired    private RoleRepository roleRepository;    /**     * 创建角色     * SORTER字段是获取数据库最大的sorter字段加1     * @param title 角色名称     * @param des 角色描述     * @return Role     */    @Transactional    public Role create(String title,String des) {        Integer sorter = roleRepository.getMaxSorter();        if(null==sorter){            sorter=0;        }        Role model =new Role()            .setId(StringUtil.generateUUID())            .setTitle(title)            .setDes(des)            .setSorter(sorter+1);        return this.roleRepository.save(model);    }    /**     * 删除角色     *      * @param id  角色主键     */    @Transactional    public void delete(String id) {        this.roleRepository.delete(id);    }    /**     * 根据主键获取Model     *      * @param id  角色主键     * @return Role     */    public Role read(String id) {        return this.roleRepository.findOne(id);    }    /**     * 判断是否存在同名的角色     *      * @param name     *            名称     * @return true 或 false     */    public boolean exists(String name) {        ExampleMatcher matcher = ExampleMatcher.matching().withMatcher("title", GenericPropertyMatchers.exact());        Example<Role> ex = Example.of(new Role().setTitle(name), matcher);        return this.roleRepository.exists(ex);    }    /**     * 查询所有角色     *      * @return     */    public List<Role> findRoles() {        return this.roleRepository.findAll();    }}

多表多条件动态组合查询

要想实现多表多条件动态组合查询还需要多继承一个接口JpaSpecificationExecutor。

继承JpaRepository和JpaSpecificationExecutor的UserRepository 用户接口

import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.data.jpa.repository.Modifying;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param;import cn.com.infcn.jianshu.model.User;/** * 系统用户数据访问类 * @author 李庆海 * */public interface UserRepository extends JpaRepository<User, String>,JpaSpecificationExecutor<User> {    /**     * 根据登录账号和登录密码查询用户     * @param loginName 登录账号     * @param password 登录密码     * @return User     */    @Query("from User t where t.loginName=:loginName and t.password=:password and t.enabled=1")    public User findUser(@Param(value = "loginName") String loginName, @Param(value = "password") String password);    /**     * 根据登录账号查询用户信息     * @param loginName 登录账号     * @return User     */    @Query("from User t where t.loginName=:loginName")    public User findUserByLoginName(@Param(value = "loginName")String loginName);    /**     * 重置密码     * @param id 用户编号     * @param password 新密码     */    @Modifying    @Query("update User u set u.password=:password where u.id=:id")    public void updatePassword(@Param(value = "id") String id, @Param(value = "password") String password);        /**     * 更新系统用户的状态     * @param id 用户编号     * @param enabled 用户状态     */    @Modifying    @Query("update User u set u.enabled=:enabled where u.id=:id")    public void updateEnabled(@Param(value = "id") String id, @Param(value = "enabled") int enabled);}

UserService服务类

import java.util.ArrayList;import java.util.Date;import java.util.List;import javax.persistence.criteria.CriteriaBuilder;import javax.persistence.criteria.CriteriaQuery;import javax.persistence.criteria.JoinType;import javax.persistence.criteria.Predicate;import javax.persistence.criteria.Root;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Example;import org.springframework.data.domain.ExampleMatcher;import org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers;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.domain.Sort.Direction;import org.springframework.data.jpa.domain.Specification;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import cn.com.infcn.jianshu.dao.UserRepository;import cn.com.infcn.jianshu.model.Role;import cn.com.infcn.jianshu.model.User;import cn.com.infcn.jianshu.util.StringUtil;@Servicepublic class UserService {        @Autowired    private UserRepository userRepository;        /**     * 添加用户,注册     *      * @param loginName     *            登录账号     * @param password     *            登录密码     * @param userName     *            用户名称     * @param roleId     *            用户角色     * @return     */    @Transactional    public User create(String loginName, String password, String userName,String roleId) {        User user = new User()            .setLoginName(loginName)            .setUserName(userName)            .setPassword(password)            .setRegistDate(new Date())            .setEnabled(1)            .setRole(new Role().setId(roleId))            .setId(StringUtil.generateUUID());        return this.userRepository.saveAndFlush(user);    }    /**     * 根据登录账号和密码查询用户     *      * @param loginName     *            登录账号     * @param password     *            登录密码     * @return     */    public User login(String loginName, String password) {        return this.userRepository.findUser(loginName, password);    }    /**     * 根据登录账号查询用户信息     *      * @param loginName     *            登录账号     * @return     */    public User getUser(String loginName) {        return this.userRepository.findUserByLoginName(loginName);    }    /**     * 重置密码     *      * @param id     *            用户编号     * @param password     *            新密码     */    @Transactional    public void updatePassword(String id, String password) {        this.userRepository.updatePassword(id, password);    }    /**     * 注销用户,不是删除     *      * @param id     *            用户编号     */    @Transactional    public void cancel(String id) {        this.userRepository.updateEnabled(id, 0);    }    /**     * 判断登录账号是否已经存在,登录账号唯一     *      * @param loginName     *            登录账号     * @return     */    public boolean exists(String loginName) {        ExampleMatcher matcher = ExampleMatcher.matching().withMatcher("loginName", GenericPropertyMatchers.exact());        Example<User> ex = Example.of(new User().setLoginName(loginName), matcher);        return this.userRepository.exists(ex);    }    /**     * 根据主键获取用户信息     *      * @param id     *            用户编号     * @return     */    public User getOne(String id) {        return this.userRepository.getOne(id);    }    /**     * 多条件查询用户     *      * @param userName     *            用户名称     * @param roleId     *            用户角色编号     * @param start     *            注册开始日期     * @param end     *            注册结束日期     * @param page     *            分页,从0开始     * @param size     *            每页的行数     * @return     */    public Page<User> findDatas(String userName, String roleId, Date start, Date end, int page, int size) {        Pageable pr = new PageRequest(page, size, new Sort(Direction.DESC, "registDate"));        return this.userRepository.findAll(new Specification<User>() {            @Override            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery,                    CriteriaBuilder criteriaBuilder) {                List<Predicate> list = new ArrayList<Predicate>();                // root.get("xx属性")表示获取xx属性这个字段名称,like表示执行like查询,%zt%表示值                if (null != userName) {                    Predicate p = criteriaBuilder.like(root.get("userName"), "%" + userName + "%");                    list.add(p);                }                if (null != roleId) {                    //关联查询,User关联Role                    Predicate p = criteriaBuilder.equal(root.join("role", JoinType.INNER).get("id"), roleId);                    list.add(p);                }                if (null != start) {                    Predicate p = criteriaBuilder.greaterThanOrEqualTo(root.get("registDate"), start);                    list.add(p);                }                if (null != end) {                    Predicate p = criteriaBuilder.lessThanOrEqualTo(root.get("registDate"), end);                    list.add(p);                }                Predicate[] ps = new Predicate[list.size()];                // 将查询条件联合起来之后返回Predicate对象                return criteriaBuilder.and(list.toArray(ps));            }
                

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。