为什么要使用${value}?
上篇文章介绍了mybatis的select标签,我们知道在mybatis中,查询语句可以写在select标签内部即可完成相应的查询工作,但是由于业务的复杂性,有时候难免要自己去拼接sql并执行,如果你使用了spring的话,你可能会想到使用jdbctemplate来执行自己的sql,但是这个时候有个问题,什么问题呢?理论上来说,JdbcTemplate应该这样使用:
@Repository
public class BackupDaoImpl implements BackupDao {
@Resource
private JdbcTemplate jdbcTemplate;
}
但是mybatis里面并没有所谓的dao的实现,只有dao接口,dao实现其实是mybatis与spring的整合jar包(如下)帮我们实现的:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
现在连dao的实现都没有,我的JdbcTemplate该写到哪里去呢?似乎,mybatis并不支持自定义sql,也和spring兼容的不好。其实,不是这样的,你完全可以在业务层组装自己的sql,然后通过我们本次说的${value}注解把整个sql传递给mybatis就可以了。
使用${value}的简单例子
1.在业务层组装自己的sql
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Resource
private UserInfoDao userInfoDao;
private Logger logger=Logger.getLogger(UserInfoServiceImpl.class);
public List<UserInfo> listAllBySql() {
String sqlString="select * from user_info where age>30";
logger.info("listAllBySql");
return userInfoDao.listAllBySql(sqlString);
}
}
2.dao层的接口定义这个方法:
public interface UserInfoDao {
List<UserInfo> listAllBySql(String sql);
}
3.配置文件中使用${value}接口
<resultMap type="com.lzzjava.beans.UserInfo" id="listAllResultMap">
<id property="userId" column="user_id" />
<result property="userName" column="user_name" />
<result property="addr" column="addr" />
<result property="age" column="age" />
</resultMap>
<select id="listAllBySql" resultMap="listAllResultMap">
${value}
</select>
注意:有时候你的sql语句中可能含有><等可能引起解析错误的sql符号,我们可以使用cdata节点来避免引起解析错误的问题
<select id="getAdvancedSearchResult" resultType="java.util.Map">
<![CDATA[ ${value} ]]>
</select>