HashMap作为JavaBean搭建通用BaseController/BaseService/BaseDao
在使用springboot搭建项目时候,我使用了mybatis作为dao,但是中间觉得有些代码是冗余的:
这个是正常的javabean,属性加get/set
但是在使用mybatis的时候,依然要再写一次字段对应的映射:
突发奇想,能不能使用HashMap作为javabean去搞搞,这样可以免去这种冗余的代码,首先构建一个Model的基类:
package com.base.domain;
import java.util.HashMap;
public class Model<T extends Model> extends HashMap {
}
剩下的其他基本类继承它使用就行:
package com.admin.user;
import java.util.Date;
import com.base.domain.Model;
public class User extends Model{
private java.lang.Long id;
private java.lang.String loginName;
private java.lang.String password;
private java.lang.String salt;
private java.lang.String name;
private java.lang.String imgUrl;
private java.lang.Integer type;
private java.lang.Long sort;
private java.lang.Integer status;
private java.lang.Boolean del;
private java.lang.String lastLoginIp;
private java.util.Date lastLoginTime;
private java.util.Date createTime;
private java.util.Date updateTime;
public void setId(java.lang.Long id) {
put("id", id);
}
public java.lang.Long getId() {
return (Long) get("id");
}
public void setLoginName(java.lang.String loginName) {
put("login_name", loginName);
}
public java.lang.String getLoginName() {
return (String) get("login_name");
}
public void setPassword(java.lang.String password) {
put("password", password);
}
public java.lang.String getPassword() {
return (String) get("password");
}
public void setSalt(java.lang.String salt) {
put("salt", salt);
}
public java.lang.String getSalt() {
return (String) get("salt");
}
public void setName(java.lang.String name) {
put("name", name);
this.name=name;
}
public java.lang.String getName() {
return (String) get("name");
}
public void setImgUrl(java.lang.String imgUrl) {
put("img_url", imgUrl);
}
public java.lang.String getImgUrl() {
return (String) get("img_url");
}
public void setType(java.lang.Integer type) {
put("type", type);
}
public java.lang.Integer getType() {
return (Integer) get("type");
}
public void setSort(java.lang.Long sort) {
put("sort", sort);
}
public java.lang.Long getSort() {
return (Long) get("sort");
}
public void setStatus(java.lang.Integer status) {
put("status", status);
}
public java.lang.Integer getStatus() {
return (Integer) get("status");
}
public void setDel(java.lang.Boolean del) {
put("del", del);
}
public java.lang.Boolean getDel() {
return (Boolean) get("del");
}
public void setLastLoginIp(java.lang.String lastLoginIp) {
put("last_login_ip", lastLoginIp);
}
public java.lang.String getLastLoginIp() {
return (String) get("last_login_ip");
}
public void setLastLoginTime(java.util.Date lastLoginTime) {
put("last_login_time", lastLoginTime);
}
public java.util.Date getLastLoginTime() {
return (Date) get("last_login_time");
}
public void setCreateTime(java.util.Date createTime) {
put("create_time", createTime);
}
public java.util.Date getCreateTime() {
return (Date) get("create_time");
}
public void setUpdateTime(java.util.Date updateTime) {
put("update_time", updateTime);
}
public java.util.Date getUpdateTime() {
return (Date) get("update_time");
}
}
这样设计也挺有意思的,就是反正封装进去了,get/set实际上变成了HashMap的get/put。
然后mybatis可以直接这么写:
<select id="queryPage" resultType="com.admin.user.User" >
select * from ${tableName}
<where>
<foreach collection="model.keys" item="key" open="" close="">
and ${key} = #{model[${key}]}
</foreach>
</where>
<if test="orderby !=null">
order by ${orderby}
</if>
limit #{startRow},#{row}
</select>
嘿嘿,是不是很有搞头。其实方便的地方不止这个,比如参数封装后可以controller直接穿透到dao层。
不过如果需要正常去使用,还是要修改一些东西,比如springboot本身的校验,@vaild只对常规的javabean起作用,如果我们的javabean继承了HashMap,@vaild不能正常校验,需要我们手写校验。下一章我介绍如何手写注解和校验。