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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值