mybatis取參數

今日,在重構方法參數的時候遇到一個問題:

	/**
	 * 分頁查詢
	 * 
	 * @param model
	 * @return
	 * @see [類、類#方法、類#成員]
	 */
	public Pager selectPage(BasInfo model) {
		model.setAutoPager(1);
		Pager pager = model.getPager();
		pager=model.col2Gbk();
//		col2Gbk(model);
		// pager.setAutoPage(1);

		List<T> list = getMapper().queryByList(model);
		pager.setResults(list);
		return pager;
	}

這是一個查詢語句的組裝,其中model.getPager()方法實現如下:

/**
	 * 分頁導航
	 */
	private Pager pager = new Pager();

	public Pager getPager() {
		pager.setAutoPage(getAutoPager());
		pager.setPageNo(getPageNo());
		pager.setPageSize(getPageSize());

		String orderField = "";
		if (StringUtils.isNotBlank(sort)) {
			orderField = sort;
		}
		if (StringUtils.isNotBlank(order)) {
			orderField += " " + order;
		}
		pager.setOrderField(orderField);
		return pager;
	}

主要是組裝從頁面傳來的order和sort參數,例如前臺傳來的order=name ,sort=desc組裝完畢後則爲name desc,但是由於使用的是mysql數據庫,在數據庫中name的編碼爲utf-8,問題就來了,客戶無法根據中文字符串拼音排序,因爲utf-8是用cjk排序的,cjk排序具體是按照筆畫數去排序,如果要根據拼音排序,需要把字段改爲gbk的方式,也就是常用的convert (using name gbk)。

接下來是想做一個通過的排序,因爲selectPage方法在項目許多地方都有涉及,如果改這個方法的話設計很多,於是乎想到增加model數據,專門用一個屬性數組來存放需要改編碼的字段,在model中新增的一個屬性private String[] colToGbk。這些都完成了之後自己重寫了一個轉換orderField的方法:

public Pager col2Gbk() {
		if(this.getNeedToGBK()){
			String sort=this.getSort();
			String order=this.getOrder();
			if(!SystemCommonF.isEmpty(this.getOrderToGBK())){
				ResourceBundle resource = ResourceBundle.getBundle("sysconfig");
				String dataBaseType=resource.getString("app.DataBase.type");
				if("mysql".equals(dataBaseType)){
					List<String> orderList= Arrays.asList(this.getOrderToGBK());
					if(orderList.indexOf(sort)!=-1){
						sort = "convert("+sort+" using  gbk)";
						pager.setOrderField(sort+" "+order);
					}
				}
			}
		}
		return pager;
	}

意圖爲重寫model方法裏的pager對象的屬性orderField,經過測試,程序是走了我的方法的,但是,沒有跑出我預料的結果,仍然是order name desc而不是order convert (using name gbk),於是進一步去找問題,翻出了xml裏的方法:

<select id="queryByList" resultMap="BaseResultMap"  parameterType="Object">
		select 
		<include refid="Base_Column_List"/>
		from ut_ssfg 
		<include refid="Example_Where_Clause"/>
		<if test="pager.orderCondition != null and pager.orderCondition != ''" >
	      ${pager.orderCondition}
	    </if>
	</select>

經過我的斷點調試多次,發現程序老是會往getPager方法裏面跑,並且在第一段代碼getMapper().queryByList(model)執行這個方法的時候吊了3次getPager(),因爲想問題想的很狹隘,想到是不是做了攔截器,攔截queryByList方法,把整個項目xml配置文件都查過了,沒有,然後用死辦法把model.getPager()方法貼到查找欄裏,一個個找,也沒有發現可以的,最後想到mybatis的參數賦值,靈光一閃,猜想估計是mybatis獲取model裏面的pager參數需要getPager()。

再次通過斷點驗證:

 DynamicContext context = new DynamicContext(configuration, parameterObject);
    rootSqlNode.apply(context);
    SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);

再apply方法上,由於xml查詢語句中又3處${page.},故出現3次調入getPager()方法。

至此對mybatis參數賦值有了進一步深入瞭解。

 

查閱文章:https://blog.csdn.net/isea533/article/details/44002219

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章