需求背景:
mybatis如何直接 執行傳入的任意sql語句 並按照順序取出查詢的結果集 ,並將數據傳輸到前台,並渲染到已經存在列名的table的對應字段中
特別需要注意的是這種需求和往常的不一樣,平時的都是直接傳一些屬性值到dao.xml文件中 在xml中進行接收,拼接sql語句。
往常的編寫過程如下:
XXXService.java
public SqlConfig getSqlConfigByTitle(String sqlTitle) {
// TODO Auto-generated method stub
return sqlConfigurationDao.getSqlConfigByTitle(sqlTitle);
}
XXXDao.java
public SqlConfig getSqlConfigByTitle(String sqlTitle);
XXXDao.xml
<select id="getSqlConfigBySQLVersion" resultMap="resultMap">
select * from cf_sql s
where s.sqlVersion=#{sqlVersion}
</select>
我的這種需求是:在已經存在的一個表中查尋出已經存在的sql,之后通過service層 的某個方法傳輸到Dao.java 的某個方法中,之后再在Dao.xml中通過#{....}進行sql拼接,查出的數據多條記錄,對於每一條記錄都是由多個屬性組成,但是如果sql語句不同的話,查詢出的字段的數目也不一樣,所以這里就不好通過resultTMap去映射了,因為一般resultMap會在Dao.xml中進行bean屬性值和數據庫列值的映射
此情景中的解決辦法:
Dao.xml
<select id="superManagerSelect" parameterType="String" resultType="java.util.LinkedHashMap">
${value}
</select>
具體的為什么用resultType="java.util.LinkedHashMap" 可見另一篇博文:https://www.cnblogs.com/isme-zjh/p/12809477.html
Dao.java
public List<LinkedHashMap<String, Object>> superManagerSelect(String value);
Service.java
public List<LinkedHashMap<String, Object>> superManagerSelect(String sqlContext) {
// TODO Auto-generated method stub
return sqlConfigurationDao.superManagerSelect(sqlContext);
}
Controller.java
注意控制器里面的處理:
List<String> dataList =new ArrayList<String>();
dataList.add(linkedHashMap.values().toString());將LinkedHashMap<String, Object>
dataList
中的內容一項一項的輸出的結果如下(Console欄中輸出):
[id,name,sex][001,zhangsan1,男]
[id,name,sex][002,zhangsan2,女]
[id,name,sex][003,zhangsan3,男]
[id,name,sex][004,zhangsan4,男]
@ResponseBody @RequestMapping(value="dataSelect") public List<String> dataSelect(@RequestParam("sqlId")String sqlId) { System.out.println("==========sqlId==========>"+sqlId); List<String> dataList =new ArrayList<String>(); if((!sqlId.equals(""))&&(!(sqlId==null))){ //注意字符串中的 判空操作 SqlConfig sqlc = SqlConfigService.getSqlConfigById(sqlId); String sqlContext = sqlc.getSqlContext(); //測試LinkedHashMap result = SqlConfigService.superManagerSelect(sqlContext); for (LinkedHashMap<String, Object> linkedHashMap : result) { dataList.add(linkedHashMap.values().toString()); } for (String item : dataList) { System.out.println("$$$====>"+item); } } return dataList; }
前台html 代碼
<script>
var sqlId = $("#sqlId").val();
$.ajax({
type: 'post',
url: '${ctx}/sys/dataSelect',
data:{"sqlId":sqlId},
dataType: 'json',
success: function(data){
if(data!=null){
var array = eval(data);
var con=""; 此段代碼是在已經有列名的table中填充數據了!
$.each(array,function(index,item){
var str1 =item.replace("[","");
var str2 =str1.replace("]","");
//alert(str2);
var arr = str2.split(',');
con += "<tr>";
for(var i=0;i<arr.length;i++){
con+="<td>"+arr[i];
con+="</td>";
}
con+="</tr>";
})
$("#myBody").html(con);
}else{
}
}
});
</script>
<table id="contentTable" class="table table-striped table-bordered table-condensed"> <thead> <tr> <c:forEach items="${ls}" var="item"> <!-- 這是要填充列名稱的位置-->
<th>${item}</th> </c:forEach> </tr> </thead> <tbody id="myBody"> <!-- 這是要填充數據的位置--> </tbody> </table>
這就是這種特殊情況的解決辦法!
最終的效果是:
通過點擊調用不同的sql會從數據庫中查詢出來 不同的數據通過js 填充到已經提前的渲染出列名的table中
效果如圖:

var sqlId = $("#sqlId").val();$.ajax({type: 'post',url: '${ctx}/sys/dataSelect',data:{"sqlId":sqlId},dataType: 'json',success: function(data){if(data!=null){var array = eval(data);var con="";$.each(array,function(index,item){var str1 =item.replace("[","");var str2 =str1.replace("]","");//alert(str2);var arr = str2.split(',');con += "<tr>";for(var i=0;i<arr.length;i++){con+="<td>"+arr[i];con+="</td>";}con+="</tr>";})//alert(con);$("#myBody").html(con);}else{}}});
