mybatis SQL构造器

2019-08-17  本文已影响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();

        }

    }
}
上一篇下一篇

猜你喜欢

热点阅读