如何在MyBatis中执行动态SQL语句

本篇文章给大家分享的是有关如何在MyBatis中执行动态SQL语句,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站制作、成都做网站、镇江网络推广、微信小程序、镇江网络营销、镇江企业策划、镇江品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供镇江建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com

使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中:


  ${_parameter}

你可以如下调用:

sqlSession.selectList("executeSql", "select * from sysuser where enabled = 1");

或者你可以在 XXMapper.java 接口中定义如下方法:

List executeSql(String sql);

然后使用接口调用方法:

xxMapper.executeSql("select * from sysuser where enabled = 1");

上面这些内容可能都会,下面在此基础上再复杂一点。

假如像上面SQL中的enabled = 1我想使用参数方式传值,也就是写成enabled = #{enabled},如果你没有遇到过类似这种需求,可能不明白为什么要这么写,举个例子,要实现一种动态查询,可以在前台通过配置 SQL,提供一些查询条件就能实现一个查询的功能(为了安全,这些配置肯定是开发或者实施做的,不可能让用户直接操作数据库)。

针对这个功能,使用 MyBatis 实现起来相当容易。配置 SQL 肯定要执行,用上面讲的这种方式肯定可以执行 SQL,如何提供参数呢?参数就是enabled = #{enabled}中的#{enabled}部分。如果再多一些条件,一个配置好的 SQL 如下:

select * from sysuser 
where enabled = #{enabled} 
and userName like concat('%',#{userName},'%')

这种情况下,该怎么用 MyBatis 实现呢?

首先 XML 中修改如下:


  ${sql}

接口中的方法修改为:

List executeSql(Map map);

然后调用方法:

Map map = new HashMap();
//这里的 sql 对应 XML 中的 ${sql}
map.put("sql", "select * from sysuser "
    + " where enabled = #{enabled} "
    + " and userName like concat('%',#{userName},'%')");
//#{enabled}
map.put("enabled", 1);
//#{userName}
map.put("userName", "admin");
//接口方式调用
List list = xxMapper.executeSql(map);
//sqlSession方式调用
sqlSession.selectList("executeSql", map);

有了这个SQL之后,就可以将 enabled 和 userName 作为条件提供给用户。这两个条件显然是必填的。如果是可选的,那该怎么写?

也许有人想到了是不是可以用 MyBatis 中的动态 SQL,使用标签等等?

再回答这个问题前,我们先看处理动态 SQL 的DynamicSqlSource中的代码:

@Override 
public BoundSql getBoundSql(Object parameterObject) {
  DynamicContext context = new DynamicContext(configuration, parameterObject);
  rootSqlNode.apply(context);
  SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);
  Class < ?>parameterType = 
        parameterObject == null ? Object.class: parameterObject.getClass();
  SqlSource sqlSource = sqlSourceParser.parse(context.getSql(), 
        parameterType, context.getBindings());
  BoundSql boundSql = sqlSource.getBoundSql(parameterObject);
  for (Map.Entry < String, Object > entry: context.getBindings().entrySet()) {
    boundSql.setAdditionalParameter(entry.getKey(), entry.getValue());
  }
  return boundSql;
}

MyBatis 处理动态 SQL 时,所有动态 SQL 的标签都会处理为 SqlNode (这里的rootSqlNode)对象,包含${}的也会处理为TextSqlNode对象,在上面方法的前两行,就是 MyBatis 处理动态 SQL 的地方。

因此如果我们在${sql} 中的内容包含嵌套的${},等标签时,他们在 MyBatis 解析 XML 为 SqlNode 对象时,XML 改为(不需要使用),返回值用int,比select的情况容易很多。

以上就是如何在MyBatis中执行动态SQL语句,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


分享标题:如何在MyBatis中执行动态SQL语句
文章网址:http://ybzwz.com/article/piseci.html