写在前面:如果您不是从第4章 服务治理与负载均衡传送门跳转过来的,那么此篇文章对您将毫无意义
由于model和mapper中有大部分是逆向生成的,因此mapper只贴新添加的部分
JsonData
@Getter
@Setter
public class JsonData {
private boolean ret;
private String msg;
private Object data;
public JsonData(boolean ret){
this.ret = ret;
}
public static JsonData success(Object object, String msg){
JsonData jsonData = new JsonData(true);
jsonData.msg = msg;
jsonData.data = object;
return jsonData;
}
public static JsonData success(Object object){
JsonData jsonData = new JsonData(true);
jsonData.data = object;
return jsonData;
}
public static JsonData success(){
return new JsonData(true);
}
public static JsonData fail(String msg){
JsonData jsonData = new JsonData(false);
jsonData.msg = msg;
return jsonData;
}
public Map<String, Object> toMap(){
HashMap<String, Object> result = new HashMap<>();
result.put("ret", ret);
result.put("msg", msg);
result.put("data", data);
return result;
}
public String toJsonString() throws JsonProcessingException {
return new ObjectMapper().writeValueAsString(this.toMap());
}
}
BeanValidator
/**
* @author:
* 本工具类主要用作参数的验证.一些必传参数的非空之类的验证
* 借用Validator 这个工具做的拓展
* @date:2019/7/31,23:19
* @what I say:just look,do not be be
*/
public class BeanValidator {
private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
public static <T>Map<String, String> validate(T t, Class... groups){
Validator validator = validatorFactory.getValidator();
Set validateResult = validator.validate(t, groups);
if (validateResult.isEmpty()){
return Collections.emptyMap();
}
LinkedHashMap errors = Maps.newLinkedHashMap();
Iterator iterator = validateResult.iterator();
while (iterator.hasNext()){
ConstraintViolation violation = (ConstraintViolation) iterator.next();
errors.put(violation.getPropertyPath().toString(), violation.getMessage());
}
return errors;
}
public static Map<String, String> validateList(Collection<?> collection){
Preconditions.checkNotNull(collection);
Iterator iterator = collection.iterator();
Map errors;
do {
if (!iterator.hasNext()){
return Collections.emptyMap();
}
Object object = iterator.next();
errors = validate(object, new Class[0]);
}while (errors.isEmpty());
return errors;
}
public static Map<String, String> check(Object first, Object... objects){
if (objects != null && objects.length > 0){
return validateList(Lists.asList(first, objects));
}else {
return validate(first, new Class[0]);
}
}
}
JsonMapper(没用到)
@Slf4j
public class JsonMapper {
private static ObjectMapper objectMapper = new ObjectMapper();
static {
//config
objectMapper.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.setFilters(new SimpleFilterProvider().setFailOnUnknownId(false));
objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY);
}
public static <T> String obj2String(T src){
if (src == null){
return null;
}
try {
return src instanceof String ? (String) src : objectMapper.writeValueAsString(src);
}catch (Exception e){
log.warn("parse object to string exception, error:{}", e);
return null;
}
}
public static <T> T string2Obj(String src, TypeReference typeReference){
if (src == null || typeReference == null){
return null;
}
try {
return (T) (typeReference.getType().equals(String.class) ? src : objectMapper.readValue(src, typeReference));
}catch (Exception e){
log.warn("parse String to Object exception, String:{}, TypeReference:{}, error:{}" ,
src, typeReference, e);
return null;
}
}
}
PageQuery 和 PageResult
@Setter
@Getter
public class PageQuery {
@Min(value = 1, message = "当前页面不合法")
private Integer pageNo = 1;
@Min(value = 1, message = "每页展示数量不合法")
private Integer pageSize = 10;
private Integer offset;
}
@Data
@Builder
public class PageResult<T> {
private List<T> data = Lists.newArrayList();
private int total = 0;
}
UserDto
/**DTO data transfer object 数据传输对象
* @author:徐凯
* @date:2019/10/11,10:14
* @what I say:just look,do not be be
*/
@Data
public class UserDto {
private static final long serialVersionUID = 1L;
private Integer id;
private String nickname;
private String avatar;
public static UserDto adapt(SysUsers sysUsers){
UserDto userDto = new UserDto();
BeanUtils.copyProperties(sysUsers,userDto);
return userDto;
}
}
UserParam
@Data
public class UserParam {
private Integer id;
@NotBlank
@Length(max = 100,min = 1,message = "部门名称长度限制在1~100个字符")
private String nickname;
private String avatar;
}
SysUsersMapper
@Mapper
public interface SysUsersMapper {
int countByUserDto(@Param("dto") UserDto dto);
List<SysUsers> getPageListByUserDto(@Param("dto") UserDto dto,@Param("pq") PageQuery pq);
}
SysUsersMapper.xml
<select id="countByUserDto" resultType="int" parameterType="map">
SELECT COUNT(1)
FROM `sys_users`
<include refid="queryConditions"/>
select>
<select id="getPageListByUserDto" resultMap="BaseResultMap" parameterType="map">
select id, nickname, avatar
from `sys_users`
<include refid="queryConditions"/>
ORDER BY id DESC
LIMIT #{pq.pageNo},#{pq.pageSize}
select>
<sql id="queryConditions">
<where>
<if test="dto.id != null">
AND id = #{dto.id}
if>
<if test="dto.nickname != null and dto.nickname !=''">
AND nickname LIKE #{dto.nickname}
if>
<if test="dto.avatar != null and dto.avatar != ''">
AND avatar = #{dto.avatar}
if>
where>
sql>
UserService(interface)
public interface UserService {
/**
* 增加
*/
public void saveUser(UserParam param);
/**
* 加载指定
*/
public UserDto load(Integer id);
/**
* 删除
*/
public void delete(Integer userId);
/**
* 分页查询
* @param pq
* @param param
* @return
*/
public PageResult<SysUsers> searchUserPageList(PageQuery pq, UserParam param);
}
UserServiceImpl
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Resource
private SysUsersMapper sysUsersMapper;
@Override
public void saveUser(UserParam param) {
BeanValidator.check(param);
SysUsers user = new SysUsers();
user.setNickname(param.getNickname());
if (StringUtils.isNotEmpty(param.getAvatar())){
user.setAvatar(param.getAvatar());
}
sysUsersMapper.insert(user);
}
@Override
public UserDto load(Integer id) {
if (null == id){
throw new RuntimeException("参数有误");
}
SysUsers user = sysUsersMapper.selectByPrimaryKey(id);
return UserDto.adapt(user);
}
@Override
public void delete(Integer userId) {
if (null == userId){
throw new RuntimeException("参数有误");
}
sysUsersMapper.deleteByPrimaryKey(userId);
}
@Override
public PageResult<SysUsers> searchUserPageList(PageQuery pq, UserParam param) {
BeanValidator.check(param);
UserDto userDto = new UserDto();
if (null != param.getId()){
userDto.setId(param.getId());
}
if (StringUtils.isNotEmpty(param.getAvatar())){
userDto.setAvatar(param.getAvatar());
}
userDto.setNickname("%"+param.getNickname()+"%");
//查询个数
int count = sysUsersMapper.countByUserDto(userDto);
if (count > 0){
List<SysUsers> sysUsersList = sysUsersMapper.getPageListByUserDto(userDto, pq);
return PageResult.<SysUsers>builder().total(count).data(sysUsersList).build();
}
return PageResult.<SysUsers>builder().build();
}
}
UserController
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
/**
* 加载指定用户信息
*/
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public UserDto loadOne(@PathVariable Integer id){
return userService.load(id);
}
/**
* 分页查询
* @param param
* @param pq
* @return
*/
@RequestMapping("/page")
public JsonData page(UserParam param, PageQuery pq){
return JsonData.success(userService.searchUserPageList(pq,param));
}
}