1. 程式人生 > >Ajax+json 前後臺互動,以及通用查詢方法的優化

Ajax+json 前後臺互動,以及通用查詢方法的優化

1、 前臺的 jQuery的ajax請求 (用法及其簡單):

$(function(){
    $.ajax({
        url: "userAction.action",   //請求的url
        data: {
            name : "name",
            pwd : "pwd",            //傳給後臺的引數
            t : new Date();
        }   
        success: function(data){
            //回撥函式,data為後臺返回給前臺的資料
        },
        dataType: "json"  // 此屬性為聲明後臺返回的資料型別,可填text、json、xml、html、script、jsonp。
    });
});

2、後臺json的使用:

我們學習所使用的 json jar 包為 jackson

其主要是ObjectMapper物件,writeValueAsString()方法可將Java物件轉換為json物件,程式碼如下:

ObjectMapper mapper = new ObjectMapper();

String jsonReturn=mapper.writeValueAsString(map);

json的格式包括:

    ①JavaBean/Map   {"sid":"s001", "sname": "張三"}   (注:與Map集合類似,有著鍵相同值會覆蓋的特vv點)

    ②陣列/List/Set      [1,2,3]

    ③類裡嵌類          混合模式    {"sid":"s001", "sname": "張三","shoppy", [1,2,3] }

3、後臺controller層的資料處理優化

           1、BaseDao類不變:

package com.zking.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * 查詢資料庫的通用查詢類
 * @author lenovo
 *
 * @param <T>
 */
public class BaseDao<T> {
	
	/**
	 *  使用策略模式對ResultSet 返回的結果集進行優化
	 * @author lenovo
	 *
	 * @param <T>
	 */
	protected interface CallBack<T> {
		public List<T> forEach(ResultSet rs) throws SQLException;
	}
	/**
	 * 通用查詢的方法
	 * @param sql     要執行的sql語句
	 * @param pb      分頁的實體類
	 * @param call    對結果集進行操作
	 * @return
	 */
	protected List<T> executeQuery(String sql, PageBean pb, CallBack<T> call) {
		Connection con = Dbhelper.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			if (pb != null) {
				sql += " limit " + (pb.getPage() - 1) * pb.getRows() + "," + pb.getRows();
			}
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			return call.forEach(rs);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			Dbhelper.close(con, ps, rs);
		}
		return null;
	}
}

2、EntityBaseDao中將原本的泛型T該成了Map集合(省去了實體類),由於rs.getMetaData() 可以得到該表資料的資料原型,即可得到表的列名與該列對應的值,所以這是可以實現的。

package com.zking.util;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EntityBaseDao extends BaseDao<Map<String, Object>> {
	public List<Map<String, Object>> executeQuery(String sql, PageBean pb) {
		return super.executeQuery(sql, pb, new CallBack<Map<String, Object>>() {
			@Override
			public List<Map<String, Object>> forEach(ResultSet rs) throws SQLException {
				/**
				 * 1、建立一個實體類的例項 
				 * 2、給建立的例項屬性賦值 
				 * 3、將新增完內容的實體類新增到list集合中 (這裡是使用json以及map集合接收資料)
				 */
				List<Map<String, Object>> list = new ArrayList<>();
				/**
				 * 得到資料庫的表的資料原型
				 * (其中包括表中的列名以及該列名所對應的值)
				 */
				ResultSetMetaData metaData = rs.getMetaData(); //metaData包含了rs中的行和列
				int count = metaData.getColumnCount();
				Map<String, Object> map = null;
				while (rs.next()) {
					map = new HashMap<String, Object>();
					for (int i = 1; i <= count; i++) {
						map.put(metaData.getColumnName(i), rs.getObject(i));
					}
					list.add(map);
				}
				return list;
			}
		});
	}
}

隨著通用查詢方法的改變,dao層也同樣發生了改變,其中需要注意的有:

①由於Map集合取代了實體類,所以查詢方法的引數也變成了Map<String, String[]>(  request.getParameterMap() 返回的型別為Map<String, String[]> )

package com.zking.dao;

import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.zking.util.EntityBaseDao;
import com.zking.util.JsonResultSetUtils;
import com.zking.util.PageBean;

public class AddressDao {

	private EntityBaseDao baseDao = new EntityBaseDao();
        /**
         * 地址三級聯動的查詢方法
         * @param map
         * @param pb
         * @return
         * @throws JsonProcessingException
         */
	public List<Map<String, Object>> queryAddress(Map<String, String[]> map, PageBean pb)
			throws JsonProcessingException {
		String parent_id = JsonResultSetUtils.getJsonVal(map, "PARENT_ID");
		String region_parent_id = JsonResultSetUtils.getJsonVal(map, "REGION_PARENT_ID");
		String sql = "select * from ch_region where true";
		if (parent_id != null && !"".equals(parent_id)) {
			sql += " and parent_id=" + parent_id;
		} else if (region_parent_id != null && !"".equals(region_parent_id)) {
			sql += " and region_parent_id="+region_parent_id;
		}
		return baseDao.executeQuery(sql, pb);
	}
}

②對於從Map集合內取值進行了優化,將其提取了出來,寫成了一個類方法。

package com.zking.util;

import java.util.Arrays;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;

public class JsonResultSetUtils {

	/**
	 * 根據鍵key得到map內對應的值
	 * @param map
	 * @param key  你想得到誰的值
	 * @return
	 * @throws JsonProcessingException
	 */
	public static String getJsonVal(Map<String, String[]> map, String key) throws JsonProcessingException {
		if(map!=null && map.size()>0) {
			String[] strings = map.get(key);
			if (strings != null && strings.length > 0) {
				String string = Arrays.toString(strings);
                                // Arrays.toString()方法 將陣列轉換成字串( [s001]  )左右會多出一組中括號
				return string.substring(1, string.length()-1);
			}
		}
		return "";
	}
}