美文网首页
mybatis SQL构造器

mybatis SQL构造器

作者: 达微 | 来源:发表于2019-08-17 13:10 被阅读0次

    org.apache.ibatis.jdbc.AbstractSQL<T>
    org.apache.ibatis.jdbc.AbstractSQL<T> 抽象泛型类,它主要用于解决书写SQL时经常多了或者少了and、or、where、括号等等内容问题。

    实际上,它的原理说起来也简单,就是把SQL拆分成多个部分,然后再根据语句类型来进行拼装。

    核心方法:

    @Override
    public String toString() {
      StringBuilder sb = new StringBuilder();
      sql().sql(sb);
      return sb.toString();
    }
    

    其中,第一个sql()是调用它的sql()方法,返回内部类SQLStatement的实例,再调用SQLStatement的sql(Appendable a)方法,传入具体的Appendable实现对象StringBuilder。
    实际使用
    org.apache.ibatis.jdbc.SQL extends AbstractSQL<SQL> ;

    构造SQL常规写法

    public String insertPersonSql() {
      String sql = new SQL()
        .INSERT_INTO("PERSON")
        .VALUES("ID, FIRST_NAME", "#{id}, #{firstName}")
        .VALUES("LAST_NAME", "#{lastName}")
        .toString();
      return sql;
    }
    

    构造SQL非常规写法

    public String insertPersonSql() {
      return new SQL() {{
        INSERT_INTO("PERSON");
        VALUES("ID, FIRST_NAME", "#{id}, #{firstName}");
        VALUES("LAST_NAME", "#{lastName}");
      }}.toString();
    }
    

    初步看,这种写法与上面的写法似乎差别也不大,但实际上差异还是很大的。

    此写法,实际上是创建了一个SQL的匿名子类,然后在内部调用类似匿名构造块。

    总结
    实际上,AbstractSQL这个类单独来看,并不能给我们构造SQL语句带来什么方便,反而是把语句拆分特别复杂,还不如直接写来得方便。

    但是结合MyBatis的Annotation和Statement解析器,这个自动过程下,它的功能就显得特别强大了。

    public interface DrivingAlarmMapper {
    
        @SelectProvider(type=DrivingAlarmMapper.SQLProvider.class, method = "getTrafficLightStart")
        List<Map<String,Object>> getTrafficLightStart(@Param("vin") List<String> vinList,);
    
    
        class SQLProvider{
            public String getTrafficLightStart(@Param("vin") List<String> vinList){
                return new SQL(){
                    {
                        SELECT("  *  ");
                         FROM("test").WHERE(String.format("vin in ('%s')", Joiner.on("','").skipNulls().join(vinList)));
                    }
                }.toString();
    
            }
    
        }
    }
    

    相关文章

      网友评论

          本文标题:mybatis SQL构造器

          本文链接:https://www.haomeiwen.com/subject/kvghsctx.html