本套方法主要核心爲利用Java中的集合替代了傳統Dao模式下的bean層,從而減小了代碼量。 java
廢話很少,代碼以下。數據庫
以新增方法爲例:json
(1)java中的mapper接口數組
/** * 通用添加數據操做 * @param map * @return */ public boolean add(Map<String, Object> map);
定義接收參數類型。 安全
(2)Maybatis的mapper.xml映射文件。數據結構
<insert id="add" parameterType="java.util.Map" > insert into ${tablename} <foreach collection="keys" item="k" index="index" open="(" separator="," close=")"> ${k} </foreach> values <foreach collection="keys" item="k" index="index" open="(" separator="," close=")"> ${params[k]} </foreach> </insert>
傳入的參數爲一個Map對象,內部封裝有表名:tableName;插入字段名列表:keys(爲一字符串數組);字段值:params(Map對象,鍵爲字段名,值爲字段值)。app
根據<foreach>標籤循環組合完整的爲SQL語句。post
(3)業務層實現方法。spa
/**
* 添加數據
* @param tableName 表名
* @param params 參數列表
* @return true:修改爲功 false: 修改失敗
*/設計
public boolean addData(String tableName, Map<String, Object> params) { String[] keys = new String[params.size()]; //字段名 Set<String> sset = params.keySet(); int i = 0; for(String os : sset){ keys[i++] = os; } Map<String, Object> map=new HashMap<String, Object>(); map.put("tablename" , tableName); map.put("keys" , keys); map.put("params" , params); if(commonMapper.add(map)){ return true; }else{ return false; } }
該層主要做用爲將數據封裝成map層所須要的數據結構,即將表名,字段名,字段值封裝入Mao中傳遞給Dao層方法。
(4)Controller層方法
/**
* 添加數據
*
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping("/user/addData.do") public @ResponseBody String addData(HttpServletRequest request, HttpServletResponse response, Model model) { String tableName=""; //表名 String ds = null; //前臺數據 try { ds = new String (request.getParameter("postData")); } catch (Exception e1) { e1.printStackTrace(); } JSONArray json=JSONArray.parseArray(ds); JSONObject jsonOne; Map<String,Object> map=new HashMap<String, Object>(); for(int i=0;i<json.size();i++){ jsonOne = json.getJSONObject(i); if(jsonOne.get("Key").equals("tableName")){ tableName = (String) jsonOne.get("Value"); //獲取表名 }else{ String key = (String) jsonOne.get("Key"); String value = jsonOne.get("Value").toString(); if(key.charAt(0)=='#'){ //數值類型 key = key.substring(1); }else{ //字符串類型加引號 value = "'"+value+"'"; } map.put(key,value); } } if(commonService.addData(tableName,map)){ return "true"; }else{ return "false"; } }
controller層方法,主要爲接受前臺數據,將其初步組合傳遞給Server層進行封裝,並接受其返回數據。
以上即爲新增方法完整的後臺操做流程。下面以較爲複雜的分組查詢方法爲例介紹查詢操做的實現。
(1)Maper接口
/** * 根據字段查詢(查詢字段) * @param map * @return */ public List<Map<String, Object>> selectFieldsByKeys(Map<String, Object> map);
一樣的接口定義,返回類型定義爲List<Map<String,Object>>類型數據,其中Map的鍵對應返回數據的字段名,值對應字段值。前臺接收數據時便可根據對應Key值接收字段值。
(2)Mapper XML實現
<select id="selectFieldsByKeys" resultType="java.util.Map" parameterType="java.util.Map"> SELECT ${fieldName} FROM ${tablename} <if test="keys != null and keys != ''"> <where> <foreach collection="keys" item="k" index="index" open="" separator=" and " close=""> ${k} = ${params[k]} </foreach> </where> </if> <if test="groupName != null and groupName != ''"> GROUP BY ${groupName} </if> <if test="havingName != null and havingName != ''"> HAVING ${havingName} </if> <if test="orderName != null and orderName != ''"> ORDER BY ${orderName} </if> </select>
<1>定義返回類型爲 resultType="java.util.Map" 類型。
<2>循環接收查詢條件
<3>判斷是否加入其餘SQL語句
(3)service方法實現
/**
* 分組查詢(條件爲=)
* @param tableName 表名
* @param fieldName 所需查詢的字段名
* @param params 查詢條件 map(key:字段名 value:數據值)
* @param groupName 分組依賴
* @param havingName聚合條件
* @param orderName 排序條件(所需排序的字段名)
* @return
*/
public List<Map<String, Object>> selectFieldsByKeys(String tableName,String fieldName,Map<String, Object> params,String groupName, String havingName,String orderName) { Map<String, Object> map=new HashMap<String, Object>(); String[] keys = null; if(params!=null){ keys = new String[params.size()]; //查詢字段名數組 Set<String> sset = params.keySet(); //獲取字段名 int i = 0; for (String os : sset) { keys[i++] = os; } } map.put("fieldName",fieldName); map.put("tablename" , tableName); map.put("keys" , keys); map.put("params" , params); map.put("groupName", groupName); map.put("havingName", havingName); map.put("orderName", orderName); List<Map<String, Object>> result = null; result = commonMapper.selectFieldsByKeys(map); return result; }
將數據封裝成map層所須要的數據結構
(4)Controller層方法
根據不一樣的需求調用。
注:
以上兩個例子分別是以添加和刪除爲例介紹了實現思想,實際運用中,可根據不一樣的須要添加其餘方法。例如,多條添加;根據子查詢添加,特殊條件查詢,調用存儲過程等本文主要介紹了後臺代碼的實現,前臺可根據時間需求同樣設計出一樣的通用操做,減小代碼量,提升複用,在此再也不贅述。該套方法,主要做用就是與數據庫進行解耦,不用構建實體類與數據庫作映射,可實現不一樣程序間的代碼複用。業務的實現,可在業務層進行代碼實現Spring 可經過 @Transactional註解實現。該套方法適用場景有所侷限,例如:安全性,在xml中,是經過'$'進行的拼接,容易被SQL注入攻擊。該套方法還有很大的改進空間和適用侷限歡迎各位大神指出錯誤,提出建議。