继前一篇讲到spirngboot+mybatis+security整合从数据库获取用户登录账号密码之后,我们这里将代码结构调整下,总体流程没有什么变化,主要在查询数据库的基本结构修改了下,方便后续工作。
先大概讲下总体修改内容。
1.修改数据库字段ID为varchar类型
2.新建一个BaseEntity,设置设置ID字段
3.新建BaseParam抽象类作为查询类公共抽象类型
4.新建BaseMapper接口
5.新建IBaseService接口
6.新建UUIDGenerator工具类
7.新建BaseService抽象类
8.修改其他entity对象,去掉ID字段,改为继承自BaseEntity类,并使用BaseEntity的ID
9.修改SysUserMapper.xml文件
修改后的目录结构总览:
1.修改数据库ID
将上篇中的数据库表的ID全部修改为varchar类型,前面的全部设置的是int类型。这个地方有点疏忽。如图:
2.创建BaseEntity.java
BaseEntity.java
import java.io.Serializable;
public abstract class BaseEntity implements Serializable{
private static final long serialVersionUID = 1L;
protected String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
3.新建BaseParam.java
import java.io.Serializable;
public abstract class BaseParam<E> implements Serializable{
private static final long serialVersionUID = 1L;
protected String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
4.新建BaseMapper.java
import java.util.List;
public interface BaseMapper<E, P extends BaseParam> {
List<E> query(P param);
void insert(E entity);
void update(E entity);
void delete(String id);
}
5.新建IBaseService.java
import java.util.List;
public interface IBaseService<E extends BaseEntity, P extends BaseParam<E>> {
List<E> find(P param);
List<E> findAll();
E findFirst(P param);
E get(String id);
E save(E entity);
void delete(String id);
}
6.新建UUIDGenerator.java
这是一个自动生成32不重复ID的工具类,工具类都放到utils包下面。
import java.util.UUID;
public class UUIDGenerator {
/**
* 生成32位随机UUID,不带横杠
*/
public static String gen() {
String uuid = UUID.randomUUID().toString();
return uuid.substring(0, 8) + uuid.substring(9, 13) + uuid.substring(14, 18)
+ uuid.substring(19, 23) + uuid.substring(24);
}
}
7.新建BaseService.java
import java.lang.reflect.ParameterizedType;
import java.util.List;
import com.alibaba.druid.util.StringUtils;
import cn.zoulang.frame.common.utils.UUIDGenerator;
public abstract class BaseService<E extends BaseEntity, P extends BaseParam<E>
,M extends BaseMapper<E, P>> implements IBaseService<E, P> {
@SuppressWarnings("unchecked")
private Class<P> paramClass = (Class<P>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
protected abstract M getMapper();
/**
* 根据param查询符合条件的entity
*/
public List<E> find(P param) {
return getMapper().query(param);
}
/**
* 查询所有entity
*/
public List<E> findAll() {
return find(null);
}
/**
* 根据param获取第一个查询到的entity
*/
public E findFirst(P param) {
List<E> list = find(param);
return list.isEmpty() ? null : list.get(0);
}
/**
* 根据ID获取entity
*/
public E get(String id) {
if(StringUtils.isEmpty(id)){
return null;
}
try {
P param = paramClass.newInstance();
param.setId(id);
return findFirst(param);
} catch (IllegalAccessException | InstantiationException e) {
throw new RuntimeException(e);
}
}
/**
* 保存/更新
*/
public E save(E entity) {
if(isNew(entity)) {
entity.setId(UUIDGenerator.gen());
getMapper().insert(entity);
} else {
getMapper().update(entity);
}
return entity;
}
/**
* 删除
*/
public void delete(String id) {
getMapper().delete(id);
}
/**
* 是否是新项(ID 为空). 需要在 BaseService::save 之前判断.
*/
protected boolean isNew(E entity) {
return StringUtils.isEmpty(entity.getId());
}
}
8.修改其他entity对象
其实就是去掉了ID字段,并继承了BaseEntity.java
修改SysUser.java.
说明“7.修改其他entity对象均在service包里面”
import java.util.List;
import cn.zoulang.frame.common.crud.BaseEntity;
public class SysUser extends BaseEntity{
private static final long serialVersionUID = 1L;
private String username;
private String password;
private List<SysRole> roles;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<SysRole> getRoles() {
return roles;
}
public void setRoles(List<SysRole> roles) {
this.roles = roles;
}
}
修改SysRole.java
import cn.zoulang.frame.common.crud.BaseEntity;
public class SysRole extends BaseEntity{
private static final long serialVersionUID = 1L;
private String name; // 角色名称
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
修改SysPermissiong.java
import cn.zoulang.frame.common.crud.BaseEntity;
public class SysPermission extends BaseEntity{
private static final long serialVersionUID = 1L;
private String name; // 权限名称
private String description; // 权限描述
private String url; // 授权连接
private Integer pid; // 父节点ID
private String method; // 请求方式
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
}
新建SysUserParam.java
import cn.zoulang.frame.common.crud.BaseParam;
public class SysUserParam extends BaseParam<SysUser>{
private static final long serialVersionUID = 1L;
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
新建ISysUserService.java接口
import java.util.List;
import cn.zoulang.frame.common.crud.IBaseService;
import cn.zoulang.frame.modules.sys.model.SysUser;
import cn.zoulang.frame.modules.sys.model.SysUserParam;
public interface ISysUserService extends IBaseService<SysUser, SysUserParam> {
/**
* 按用户名查询用户
*/
default SysUser findUserByName(String userName) {
SysUserParam param = new SysUserParam();
param.setUserName(userName);
return findFirst(param);
}
/**
* 查询所有用户
*/
default List<SysUser> findAll() {
return find(null);
}
}
修改SysUserService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.zoulang.frame.common.crud.BaseService;
import cn.zoulang.frame.modules.sys.mapper.SysUserMapper;
import cn.zoulang.frame.modules.sys.model.SysUser;
import cn.zoulang.frame.modules.sys.model.SysUserParam;
@Service
public class SysUserService extends BaseService<SysUser, SysUserParam, SysUserMapper>
implements ISysUserService{
@Autowired
SysUserMapper sysUserMapper;
@Override
protected SysUserMapper getMapper() {
return sysUserMapper;
}
}
修改SysUserMapper.java
import org.apache.ibatis.annotations.Mapper;
import cn.zoulang.frame.common.crud.BaseMapper;
import cn.zoulang.frame.modules.sys.model.SysUser;
import cn.zoulang.frame.modules.sys.model.SysUserParam;
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser, SysUserParam>{
}
9.修改SysUserMapper.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="cn.zoulang.frame.modules.sys.mapper.SysUserMapper">
<resultMap id="SysUser" type="cn.zoulang.frame.modules.sys.model.SysUser">
<result column="ID" property="id"/>
<result column="USERNAME" property="username"/>
<result column="PASSWORD" property="password"/>
</resultMap>
<select id="findAll" resultMap="SysUser">
SELECT
id,
userName,
password
FROM
sys_user
</select>
<select id="query" resultMap="SysUser">
SELECT
id,
userName,
password
FROM
sys_user
WHERE 1 = 1
<if test="id != null and id != ''">
AND ID = #{id}
</if>
<if test="userName != null and userName != ''">
AND USERNAME = #{userName}
</if>
</select>
<insert id="insert">
INSERT INTO SYS_USER (ID,
USERNAME,
PASSWORD)
VALUES (#{id},
LOWER(#{userName}),
#{password})
</insert>
<update id="update">
UPDATE SYS_USER
SET
<if test="password != null and password != ''">
PASSWORD = #{password},
</if>
USERNAME = LOWER(#{userName})
WHERE ID = #{id}
</update>
<delete id="delete">
DELETE FROM SYS_USER
WHERE ID = #{id}
</delete>
</mapper>
测试:
重启项目,输入网址http://localhost:8899/user/query进行测试