SSM项目的参数设计技巧(springMVC,spring,myBatis,restFul)

目前使用SSM框架一个星期,发现了一个问题,但只要实用一点小技巧,这个问题就能非常简单的解决,而且省了很多代码。

1、起源

mapper.xml的动态查询很方便也很强大,就比如这样:

<select id="queryFromYear" resultMap="BaseResultMap">
  	select * from quota_core_data
  	where i_id in
  	(
  		select i_id from quota_core_info
  		<where>
  			<if test="year!=null">
		  		and i_year=#{year}
  			</if>
  		</where>
  	)
  	<if test="sort!=null and order!=null">
  		order by ${sort} ${order}
  	</if>
  	<if test="start!=null and size!=null">
  		limit #{start},#{size}
  	</if>
  </select>
使用if标签判断来拼装sql,这个想法很好,但是实际使用中我发现一直报错:Optional int parameter 'page' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

意思是null不能转成int型,为什么会这样呢?我先不说,dao层、service层、controller层代码如下:

dao层:

List<QuotaCoreData> queryFromYear(@Param("year")int year,
			@Param("sort")String sort,@Param("order")String order,
			@Param("start")int start,@Param("size")int size);
service层:

public List<QuotaCoreData> queryFromYear(int year,String sort,String order,int start,int size) {
		return coreDataMapper.queryFromYear(year,sort,order,start,size);
	}
controller层:

@RequestMapping(value="/quotaCoreData",method=RequestMethod.GET)
	public List<QuotaCoreData> query(int year,String sort,String order,int page,int rows) {
		List<QuotaCoreData> coreDatas=coreDataSer.queryFromYear(year,ColumnName.transToUnderline(sort),order,page,rows);
		return coreDatas;
	}

我访问的UIL是:
<a href="/quota/quotaCoreData?year=2016">核心指标数据表(接口)</a>

2、解释

当访问时没有带上全部参数时,没有带上的参数就会变为空,但是controller的方法参数为int型就会导致这个错误,因为int没有null,只有0,所以解决办法也很简单,把所有的int型参数改成Integer型参数。三层代码如下:

dao层:

List<QuotaCoreData> queryFromYear(@Param("year")Integer year,
			@Param("sort")String sort,@Param("order")String order,
			@Param("start")Integer start,@Param("size")Integer size);
service层:

public List<QuotaCoreData> queryFromYear(Integer year,String sort,String order,Integer start,Integer size) {
		return coreDataMapper.queryFromYear(year,sort,order,start,size);
	}
controller层:

@RequestMapping(value="/quotaCoreData",method=RequestMethod.GET)
	public List<QuotaCoreData> query(Integer year,String sort,String order,Integer page,Integer rows) {
		List<QuotaCoreData> coreDatas=coreDataSer.queryFromYear(year,ColumnName.transToUnderline(sort),order,page,rows);
		return coreDatas;
	}
这样问题就解决了。
测试成功:

3、结论

如果不换成Integer的话,就要写很多判断防止空指针的问题,而Integer是复杂数据类型可以为null,这样就可以把null一直带到mapper.xml中,什么代码也不用写,是不是很简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值