結合Mybatis和Java集合實現的通用數據庫處理方法(取代傳統Dao層結構)

  本套方法主要核心爲利用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注入攻擊。該套方法還有很大的改進空間和適用侷限歡迎各位大神指出錯誤,提出建議。
相關文章
相關標籤/搜索