Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MyBatis-如何创建w动态WHERE子句_Java_Ibatis_Mybatis - Fatal编程技术网

Java MyBatis-如何创建w动态WHERE子句

Java MyBatis-如何创建w动态WHERE子句,java,ibatis,mybatis,Java,Ibatis,Mybatis,该服务获取一个包含三个值的列表的未知对象​​[列、运算符、值]例如, 类电子邮件测试 基于生成的列表来构建WHERE子句,但是我也能够构建这样一个条件,例如 其中电子邮件如“测试”和用户id 5或传输id 500 有人能帮我怎么做吗?这个答案有两个关键部分。一个是动态元素,另一个是围绕问题中运算符的$$literal元素 <select id="yourSelect" parameterClass="Map" resultMap="somethingsomething" >

该服务获取一个包含三个值的列表的未知对象​​[列、运算符、值]例如, 类电子邮件测试

基于生成的列表来构建WHERE子句,但是我也能够构建这样一个条件,例如

其中电子邮件如“测试”和用户id 5或传输id 500


有人能帮我怎么做吗?

这个答案有两个关键部分。一个是动态元素,另一个是围绕问题中运算符的$$literal元素

  <select id="yourSelect" parameterClass="Map" resultMap="somethingsomething" >
    select * from YOURTABLE
      <dynamic prepend="WHERE">
        <isNotNull prepend="AND" property="email">
          email $operator$ #testvalue#
        </isNotNull>
      </dynamic>
  </select>

另请参见关于此主题的。

在长期缺席后,我一直在重新发现MyBatis,我自己也曾熟悉iBatis。Rolf的例子看起来可能是.Net实现,我可能错了,但我不认为Java符号现在看起来是这样的。Rolf关于文字字符串的技巧非常有用

我创建了一个小类来保存列、运算符和值,并将它们传递到MyBatis中进行处理。列和运算符是字符串文本,但我将这些值保留为sql参数,我认为MyBatis能够进行任何必要的类型转换

public class TestAnswer {
    public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            SqlSessionFactory sqlFactory = (SqlSessionFactory) ctx.getBean("sqlSessionFactory");            
            MappedStatement statement = sqlFactory.getConfiguration().getMappedStatement("testAnswer");                        

            ArrayList<Clause> params1 = new ArrayList<Clause>();
            params1.add(new Clause("email","like","test"));
            params1.add(new Clause("user","<>",5));

            ArrayList<Clause> params2 = new ArrayList<Clause>();
            params2.add(new Clause("trans_id","<",100));
            params2.add(new Clause("session_id",">",500));

            HashMap params = new HashMap();
            params.put("params1", params1);
            params.put("params2", params2);

            BoundSql boundSql = statement.getBoundSql(params);
            System.out.println(boundSql.getSql());             
    }

    static class Clause{        
        private String column;
        private String operator;
        private Object value;

        public Clause(String column, String operator, Object value){
            this.column = column;
            this.operator = operator;
            this.value = value;
        }

        public void setColumn(String column) {this.column = column;}
        public void setOperator(String operator) {this.operator = operator;}
        public void setValue(Object value) {this.value = value;}
        public String getColumn() {return column;}
        public String getOperator() {return operator;}
        public Object getValue() {return value;}        
    }    
}
正如您所看到的,我使用Spring,但我希望类似的东西可能在Spring环境之外工作

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    <mapper namespace="com.stackoverflow.TestMapper">

    <select id="testAnswer" parameterType="map" resultType="hashmap">
      select *
    FROM somewhere
        <where>
            <foreach item="clause" collection="params1" separator=" AND " open="(" close=")"> 
                ${clause.column} ${clause.operator} #{clause.value} 
            </foreach>            
            OR
            <foreach item="clause" collection="params2" separator=" AND " open="(" close=")"> 
                ${clause.column} ${clause.operator} #{clause.value} 
            </foreach>    
        </where>
    </select>

</mapper>

这将需要一个4参数子句列、运算符、value1、value2,或者至少以某种方式将两个日期转换为合适的值。也许可以创建一个BetweenClause类。恐怕这不是一个特别优雅的解决方案,因为值字段的日期格式可能很容易成为数据库供应商的特定格式,除非您使用特殊长度以符合ANSI标准。在使用两个SQL子句之间实现会更简单。。。你好,马克。。。我的实现方式与4参数子句相同。。。谢谢你的意见!!!我认为这是iBatis方法,它不适用于myBatis