这里写代码片使用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'