为什么要使用${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>
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐