记录一下杀死我N多脑细胞的mybatis增改查不用model进行存取

本文介绍如何在没有实体模型的情况下,利用HashMap在MyBatis中进行数据的增删改查操作,包括动态SQL的编写及前后端交互示例。

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

在没有model的层的情况下,查询的语句要怎么显示呢?新增修改的字段又怎么存取呢?用HashMap啊!!!上代码!!!

首先看一下Mapper类    ps:我用的Spring+springMVC+mybatis

	//查询 Map<String,Object>key为字段名,value为值
	Map<String,Object> getAll();
	
	//新增:动态填入字段名及值
	boolean save(@Param("keys")Map<String,Object> keys);
	
	//修改:动态填入字段名及值
	boolean update(@Param("keys")Map<String,Object> keys,@Param("fid")int fid);
	
	//查询所有表所有字段名
	List<String> getFields();

xml文件的写法

	<!-- 查询返回HashMap,字段名自动存入key -->
	<select id="getAll" resultType="java.util.HashMap">
		SELECT * FROM tb_temp 
	</select>
	
	<!-- 查询所有字段名 tb_temp:表名,DB_TEMP:数据库名  -->
	<select id="getFields" resultType="String">
		select COLUMN_NAME userName from information_schema.COLUMNS WHERE TABLE_NAME='tb_temp' AND table_schema='DB_TEMP'
	</select>
	
	<!-- 新增 keys.keys:获取key -->
	<insert id="save" parameterType="hashmap">
		INSERT INTO tb_temp(
		<foreach collection="keys.keys" index="index" item="key" separator="," >
			${key}
		</foreach>
		) VALUES (
		<foreach collection="keys" index="index" item="value" separator="," >
			#{value}
		</foreach>
		)
	</insert>
	
	<!-- 修改在map直接存入的  字段=值 例如 ftype = '1',我这是用的蠢办法,有好想法的可以告诉我一下哦 -->
	<update id="update" parameterType="hashmap">
		UPDATE tb_temp SET
		<foreach collection="keys" index="index" item="value" separator="," >
			${value}
		</foreach>
		WHERE fid=#{fid}
	</update>

controller类的写法

	/**
	 * 查询所有
	 * @param request
	 * @return
	 */
	@RequestMapping("/getAll")
	@ResponseBody
	public String getAll(HttpServletRequest request){
		JSONObject json = new JSONObject();
		JSONArray ary = new JSONArray();
		JSONObject obj = new JSONObject();
		try{
			Map<String, Object> map = ms.getAll();
			//遍历map,值得注意的是为null的value是默认隐藏的哦
			Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator(); 
			while (it.hasNext()) { 
			  Map.Entry<String, Object> entry = it.next();
			  json.put(entry.getKey(), entry.getValue());
			}
			ary.add(json);
		}catch(Exception e){
			e.printStackTrace();
		}
		obj.put("ary", ary);
		return obj.toString();
	}
	
	//新增
	@RequestMapping("/add")
	@ResponseBody
	public String add(HttpServletRequest request){
		JSONObject obj = new JSONObject();
		try{
			Map<String, Object> savemap = new HashMap<String, Object>() ;
			//获取表所有字段名,之前这里是想把map的key保存在session中用的,但是发现value为null时是默认隐藏的,在这里会存在bug,所以换成直接读取所有字段
			List<String> list = ms.getSpeFields();
			for(int i=0;i<list.size();i++){
				String value = request.getParameter(list.get(i)));
				if(value!=null && !"".equals(value)){
					 savemap.put(list.get(i), value);
				}
			}
			//ms是我映射的service的名字,哈哈
			ms.saveSpe(savemap);
			obj.put("success", true);
		}catch(Exception e){
			e.printStackTrace();
			obj.put("success", false);
			obj.put("msg", e.getMessage());
		}
		return obj.toString();
	}
	
	//修改
	@RequestMapping("/edit")
	@ResponseBody
	public String edit(HttpServletRequest request){
		JSONObject obj = new JSONObject();
		try{
			Map<String, Object> editmap = new HashMap<String, Object>() ;
			//所有解释同上啦
			List<String> list = ms.getSpeFields();
			for(int i=0;i<list.size();i++){
				String value = request.getParameter(list.get(i)));
				if(value!=null && !"".equals(value)){
					 editmap.put(list.get(i), list.get(i)+"='"+value+"'");
				}
			}
			ms.updateSpe(editmap,Integer.parseInt(request.getParameter("fid")));
			obj.put("success", true);
		}catch(Exception e){
			e.printStackTrace();
			obj.put("success", false);
			obj.put("msg", e.getMessage());
		}
		return obj.toString();
	}

前端js的写法,我用的easyui,好吧~~~都是比较原始的东西

//这里是根据我的需求写的,大神们可以挑自己需要的部分看
function getData() {
	$.ajax({
		type : "post",
		async : false,
		url : "modbus/getAll",
		data : {},
		dataType : "json", //返回数据形式为json  
		success : function(result) {
			//将获取到的ary根据“,”替换成“:”
			var filesname = JSON.stringify(result.ary[0]);
			filesname = filesname.substring(1,filesname.length-1).replace(/,/g, ':');
			//再根据“:”分割
			var filelist = filesname.split(":");
			//遍历,typeary是我的某个数组,此处不做介绍了哈
			for(var i=0;i<typeary.length;i++){
				//匹配filelist是否存在某个字段名,例如typeary[i].name为‘fname’,存在则返回下标,否则返回-1;filelist[index+1]:前面的替换、分割已经将filelist存入的是一个字段名一个值。例如["fid","1","fname","张三"],所以获取他的字段下标后再+1就是他的值啦
				var index = filelist.indexOf("\""+typeary[i].name+"\"");
				if(typeary[i].type == "combobox"){
					if(index!=-1){
						//动态生成文本
						$("#"+typeary[i].name).combobox('setValue',filelist[index+1]);
					}else{
						$("#"+typeary[i].name).combobox('select',typeary[i].defaults);
					}
				}else if(typeary[i].type == "textbox"){
					if(index!=-1){
						$("#"+typeary[i].name).textbox('setValue',filelist[index+1]);
					}else{
						$("#"+typeary[i].name).textbox('setValue',typeary[i].defaults);
					}
				}else{
					if(filelist[index+1]!=0){
						$("#"+typeary[i].name).prop("checked",true);
					}else{
						$("#"+typeary[i].name).removeAttr("checked");
					}
				}
			}
		},
		error : function(errorMsg) {
			alert("数据请求失败,请联系系统管理员!");
		}
	});
}

就这么多啦,写了很多废话,是因为自己记性不好,怕自己忘掉,希望未来的自己会感激现在正在努力的自己。此博客是根据自己的需求做的,目的是根据配置文件动态添加数据库字段并完成增删改查,如果可以帮到你是我的荣幸,笔芯哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值