mybatis如何传入java中拼接的sql语句

mybatis 虽然xml文件有强大的模板标签的处理能力,但实际开发中有时比较复杂的sql还有一部分得在java中预先拼装好,然后放到xml文件中直接使用。但是mybatis是先进行预处理的,所以你传入的片段也好其他也好,都会当做一个值来看待,因此在mybatis中不能使用#{xx}来解析,而是得用${xx}来解析才行。因为#{xx}字符串处理,加单引号,可一定程度的防注入。${xx}直接引用不做处理,比如数字。

代码如下:

StringBuilder dynamicRegionSql = new StringBuilder();
        for (int i = 0; i < ipLocation2DTOs.size(); i++) {
            dynamicRegionSql.append("(region_id=\"");
            dynamicRegionSql.append(ipLocation2DTOs.get(i).getRegionId());
            dynamicRegionSql.append("\"");
            if (ipLocation2DTOs.get(i).getCityId() != null && ipLocation2DTOs.get(i).getCityId().size() != 0) {
                dynamicRegionSql.append(" and city in (");
                List<String> cityIds = ipLocation2DTOs.get(i).getCityId();
                for (int j = 0; j < cityIds.size(); j++) {
                    dynamicRegionSql.append("\"");
                    dynamicRegionSql.append(cityIds.get(j));
                    dynamicRegionSql.append("\"");
                    if (j != (cityIds.size() -1) ) {
                        dynamicRegionSql.append(",");
                    }
                }
                dynamicRegionSql.append(")");
            }
            dynamicRegionSql.append(")");

            if (i != (ipLocation2DTOs.size() -1) ) {
                dynamicRegionSql.append(" or ");
            }
        }
//        System.out.println(dynamicRegionSql);
        int affectNum = deviceLocationMapper.queryCountByRegion(productModel, dynamicRegionSql.toString());

xml文件中:

<select id="queryCountByRegion" resultType="java.lang.Integer">
        SELECT
        count(*) as num
        FROM device_location
        WHERE
            product_model = #{productModel} and
            ${dynamicRegionSql}
    </select>

原文地址:https://www.cnblogs.com/kangjianrong/p/9755605.html

时间: 2024-11-03 21:28:10

mybatis如何传入java中拼接的sql语句的相关文章

Mybatis中如何在SQL语句表名中使用参数

insert into prefix_${table_name} (a, b, c) values (#{a}, #{b}, #{c}) ${} 表示直接使用字面量(literal value) #{} 表示这个是个参数 如果 table_name 是 "ABC" 则 ${table_name} 是 ABC #{table_name} 是 "ABC" Mybatis中如何在SQL语句表名中使用参数,布布扣,bubuko.com

存储过程中执行动态Sql语句

存储过程中执行动态Sql语句 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更安全的代码.EXEC在某些情况下会更灵活.除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql. 1.EXEC的使用 EXEC命令有两种用法,一种是执行一个存储

在程序开发中怎样写SQL语句可以提高数据库的性能

以下内容是公司dba总结. 1. 首先要搞明白什么叫执行计划?   执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择"索引查找"方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用"全表扫描"方式. 可见,执行计划并不是固定的,它是"个性化的".产生一个正确的"执行计划

机房收费系统中遇到的SQL语句问题

个人版机房收费系统正在进行中,遇到了几个有关SQL语句的问题. 1.sum函数的使用: 在结账部分,要求出某个表中某一列的和.在第一次机房系统中,我不知道sum函数的存在,很傻很天真地用循环一个一个往上加.下面以求所有卡中余额的和来说说sum函数怎么使,SQL语句为:select sum(cash)from T_Card.这个格式不是固定的,可以根据需求更改,比如求多列的和:select sum(列名1),sum(列名2)...from [表名] where....查询出来的结果只有一行,如果只

java中的Switch case语句

java中的Switch case 语句 在Switch语句中有4个关键字:switch,case break,default. 在switch(变量),变量只能是整型或者字符型,程序先读出这个变量的值,然后在各个"case"里查找哪个值和这个变量相等,如果相等,则条件成立,程序执行相应的分支,直到碰上break或有switch语句结束. 有几个需要着重注意的地方. 第一,前面说了switch(变量),只能是整型和字符类型. 第二,case之后是直接的常量数值. 第三,break使得程

SQL*PLUS中批量执行SQL语句

SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书),最后将所有的SQL语句一次性的执行完成. 首先,将要执行的所有的SQL语句,全部写入某个sql文件当中.例如f:\test.sql; 然后,通过通过sqlplus连接到数据库:如: SQL> sqlplus test/[email protected]; 再执行如下命令: SQL> @f:\te

查询EBS中LOV的SQL语句

帮助->关于 会话 SID : 507 DECLARE  l_sid NUMBER := :SID;BEGIN  FOR cur_sql IN (SELECT sql_text                    FROM v$sqltext_with_newlines t                   WHERE t.address IN (SELECT s.prev_sql_addr                                         FROM v$ses

grails中直接使用SQL语句

在grails中直接使用SQL语句进行查询,可以直接获取一个新连接,也可以使用默认的数据源 查询代码:       ApplicationContext ctx = (ApplicationContext) ApplicationHolder.getApplication().getMainContext()       def dataSource = ctx.getBean('dataSource')       def sql = new Sql(dataSource)       Str

【转】case: Java中try catch finally语句中含有return语句的执行情况(总结版)

Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面来看这几种情况. 情况一(try中有return,finally中没有return): [java] view plain copy public class TryTest{ public