关于mybatis注解方式的坑

Mybatis推荐用注解方式替代XML方式进行开发,这样SpringBoot+Mybatis开发就能做到“零"XML。然而Mybatis的注解方式还存在着不少的坑,比如以下SQL语句

@Select({
		"<script>",
		"select t.day from t",
		"where ",
			"t.day in " +
				"<foreach item='day' collection='days' open='(' separator=',' close=')'>",
					"to_char(#{day},'yyyymmdd')" +
				"</foreach>",
			"and t.id < 5",
		"</script>"
	})
	List<Map<String, Object>> listLastDays(@Param("days") List<Date> days) throws Exception;

然后会报

org.apache.ibatis.builder.BuilderException: Could not find value method on SQL annotation.....
......
Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。

查Stackoverflow解释说,如果采用了<script>标签,那么标签里面的字符串就会当成xml来处理,而小于号显然和xml文件冲突了,解决办法可以加

<![CDATA[
and t.id < 5
]]>

或者直接转义

and t.id &lt; 5

然而这两种方法似乎不太优雅,因为需要开发人员提前预测究竟哪个字符需要进行转义。如果将<![CDATA[直接作用于SQL语句

@Select({
		"<script>",
		"<![CDATA[",
		"select t.day from t",
		"where ",
			"t.day in " +
				"<foreach item='day' collection='days' open='(' separator=',' close=')'>",
					"to_char(#{day},'yyyymmdd')" +
				"</foreach>",
			"and t.id < 5",
		"]]>",
		"</script>"
	})
	List<Map<String, Object>> listLastDays(@Param("days") List<Date> days) throws Exception;

就会报以下错误

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'day' not found. Available parameters are [ days, param1]

显然采用了<![CDATA[标签,<foreach就识别不出来了。
所以要么用之前的方法,要么就不用<script,而采用@SqlProvider的方式进行SQL拼接,反正都没有好的解决方案。
未完待续中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值