HashMap作为JavaBean搭建通用BaseController/BaseService/BaseDao(1)

本文探讨了在SpringBoot项目中使用HashMap替代传统JavaBean的方法,通过将Model基类设计为HashMap,实现代码复用,减少冗余,并介绍了如何在MyBatis中应用这一设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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不能正常校验,需要我们手写校验。下一章我介绍如何手写注解和校验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值