mybatis基于注解开发遇到问题汇总

这里写代码片使用Mybatis开发持久层,庞大的xml配置文件提供了强大的功能,但是sql语句需要在xml文件中进行配置,并且必须遵循一定的规则。
现在可以使用注解开发来代替xml配置文件。具体的流程就不再赘述,可以查看《Java持久化之myBatis3》,此书大体介绍了注解开发,本文就实际开发中遇到的问题进行表述。

一. 参数绑定问题

1.#{}和${}使用出错

@Select("select ad.*,ac.name as name,ac.acsid from acs_door ad          left join acs_server ac on ad.serverid = ac.id where #{codingTerm}")

List<AcsDoorBean> getList(@Param("codingTerm")String codingTerm);

codingTerm 是一个和权限有关的字符串,”coding like ‘%33%’”,
当使用#{}进行占位符操作时,junit单元测试控制台打印

==>Preparing: select ad.*,ac.name as name,ac.acsid from acs_door ad left join acs_server ac on ad.serverid = ac.id where ? 
==> Parameters: ad.coding like '%33%'(String)
<== Total: 0

不会抛异常,sql语句没问题,参数绑定也没问题,但是无法从数据库或得正确的数据。
所以考虑到#{}是提供占位符的操作而${}可以用来进行sql拼接,而codingTerm不是表中的字段,和实体类无法形成关系映射,所以不能使用占位符,进行替换后控制台打印如下,并且可以正常查出需要的数据。#{}就相当于sql语句的“?”进行占位操作。

==>  Preparing: select ad.*,ac.name as name,ac.acsid from acs_door ad left join acs_server ac on ad.serverid = ac.id where ad.coding like '%33%' 
 ==> Parameters: 
<==    Columns: id, serverid, deviceid, doorid, doorname, name, comment, doorstate, doorcontrolstate, coding, emapLeft, emapTop, emapId, name, acsid
<==        Row: 1, 1, 33, null, null, null, null, null, null, 33, null, null, null, null, null
 <==       Row: 2, 2, 33, null, null, null, null, null, null, 33, null, null, null, 
<==      Total: 3

**当使用${}进行拼接式codingTerm参数钱必须加@Param(“codingTerm”)注解,否则会报错

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'codingTerm' in 'class java.lang.String'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值