个人理解,应该对出参和入参进行统一管理. 除非是一些复制业务类型,那就一定建好实体业务类,如果是一般业务逻辑处理,实体类,尽量少建,加快开发速度。虽然mybatis有代码生成器,但是在实际开发过程,业务更改比较频发,建好的表也经常因业务增加一些字段,导致每加一次,就要去改实体类.很影响开发速度.
一.前端
1.封装统一的ajax请求。
请求格式:
以作为param作为唯一key,以json处理成字符串,作为value,并把value进行编码encode.
{ param:encodeURIComponent(stringify(JSON对象)) }
2.封装统一返回结果
返回格式:
三个状态值,code,data,msg
{ code:000, //code,返回代码,以数字为标准,比如000代表成功,001代表参数为空,002代表调用业务失败 data:{age:11}, //返回的数据,以json对象为主 msg:"请求成功!" //返回服务器消息 }
3.对象URL进行统一管理,每个界面都有URL统一对象.
var URLObj={ save:"/xin/save", delete:"/xin/delete", get:"/xin/get", other:"/xin/other" }
二、后端:
1.前端封装好的,后端获取参数,只要统一获取param参数,并转化JSONObject .
Controller层:负责对param转换成JSON进行参数检查,检查成功,转换HashMap,作为入参给Service服务调用。
Service层:入参,统一是HashMap,进行业务逻辑处理,处理完,调用DAO
DAO层: 入参,统一是HashMap,返回对象,统一是HashMap(除了一些复杂业务)
好处:如果变更需求,数据库多加一个字段,并且需要返回,后端只需直接改sql语句,因为没有建立实体,不用去改变 就实体类。可以。前端也只要多加一行代码,取参数。
在实际开发中,表结构会因业务经常变更,而增加字段,一增加字段,后端只需要改sql,更多关注业务。 如果前端多加两个字段返回,后台也只要改sql,并多一层逻辑判断。这是不建立实体类好处,如果是复杂业务,则建议DAO处理返回对应到实体类中去。
三、直接贴出代码,供大家参考
前端处理,(未进行调试,有错误,请自行改动)
/** * =====================对ajax进行封装=========================== */ /** * 访问路径统一到一个对象中 * @type {{save: string, get: string, delete: string}} */ var ywURL={ save:"/xin/save", get:"/xin/get", delete:"/xin/delete" } /** * 统一获取url * @param key * @returns {string} */ function getUrl(key){ var context="${req.getContext.path}}" //上下文 var t="?t="+new Date().getTime(); //随机函数,当然也可以在预设ajax中设定,ajaxSetup.beforeSend进行处理 var dourl=ywURL[key]; //请求url if(dourl){ return context+dourl+t }else{ console.log("获取业务请求地址失败"+key); return ""; } } /** * 封装统一ajax请求, * 关键:对入参进行封装,对出参进行统一处理。 * 请求结果只有两种,要么是成功,要么是失败,根据业务自己定义好 */ function callUrl(url,param,callSuccsee) { //在请求前,可以加一下处理,比如请求发送前,界面展示load的标志 $.ajax({ data: { param: encodeURIComponent(JSON.stringify(param)) }, dataType: "json", success: function (r) { var rcode = r.code; var rdata = r.data; var rmsg = r.msg; if (rcode == "000") { callSuccsee(rdata); } else { alert(rmsg); } }, error: function (er) { //请求失败处理 } }) } /** * ===============下面是调用例子======================= */ //请求参数 var save_param={ name:"小明", age:"12" } //回调函数 var save_Suceess=function (data) { var tall=data.tall; alert(tall); } //请求地址 var save_url=getUrl("save"); callUrl(saveurl,param,callSuccess)
后端处理:
WebUtil封装统一获取参数方法:
package Utils; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.yifengxin.entity.ResultVO; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; public class WebUtil { /** * 从web请求中获取参数,并解析成JSONObject,用阿里fastJSON * @param request * @return */ public static JSONObject getParam(HttpServletRequest request){ JSONObject json=new JSONObject(); String param=request.getParameter("param"); if(!StringUtils.isEmpty(param)) { json= JSON.parseObject(param); } return json; } /** * 调用成功,返回该对象 * @param data * @return */ public static HashMap getSuccess(Object data) { HashMap map=new HashMap(); map.put("code","000"); map.put("data",data); map.put("msg",""); return map; } /** * 出现错误时,返回该对象 * @param msg * @return */ public static HashMap getError(String msg) { HashMap map=new HashMap(); map.put("code","999"); map.put("data",""); map.put("msg",msg); return map; } }
Controller层处理:先对入参进行判断校验,再进行业务逻辑处理
package com.yifengxin.controller; import Utils.WebUtil; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.yifengxin.serivce.WebService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; //使用springboot框架 @RestController @RequestMapping("/xin") public class WebContoller { @Autowired private WebService webService; @RequestMapping("/get") public HashMap hello(HttpServletRequest request){ //入参校验处理,这里可以构造AOP方法,进行拦截处理,对参数进行判断处理。 JSONObject pJSON= WebUtil.getParam(request); String name=pJSON.getString("name"); if(StringUtils.isEmpty(name)){ return WebUtil.getError("名字参数不能为空!"); } if(StringUtils.isEmpty(pJSON.getString("age"))){ return WebUtil.getError("年龄参数不能为空!"); } //调用业务服务处理 HashMap paramMap=JSON.toJavaObject(pJSON,HashMap.class); request.getSession().setAttribute("name",name); return webService.getPerson(paramMap); } }
Service层:处理业务逻辑
package com.yifengxin.serivce; import Utils.WebUtil; import com.alibaba.fastjson.JSONObject; import com.yifengxin.dao.WebMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; @Service public class WebService { @Autowired private WebMapper webMapper; /** * 数据库查询: 确定这人是否存在 * @param map * @return */ public HashMap getPerson(HashMap map){ int num=webMapper.Count(map); if(num>0){ JSONObject o=new JSONObject(); int age= (int) map.get("age"); o.put("num",num); o.put("age",ageAdd(age));//年龄加1 return WebUtil.getSuccess(o); }else{ return WebUtil.getError("这个人不存在"); } } /** * 业务处理:年龄加1 * @param age * @return */ private int ageAdd(int age){ return age+1; } }
DAO层:调用数据层,或者处理xml,二进制,文本读写 等数据格式类
package com.yifengxin.dao; import java.util.HashMap; public interface WebMapper { /** * 判断这个人是否存在 * @param paramMap * @return */ public int Count(HashMap paramMap); }
<?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="com.yifengxin.dao.XinMapper" > <!-- 判断这个人是否存在--> <select id="selectCount" resultType="int" parameterType="java.util.HashMap" > select count(1) from person p where p.name=#{name} and p.age = #{age} </select> </mapper>