• Mybatis常用工具类(一)-- SQL


    原文链接:Mybatis常用工具类(一)-- SQL

    SQL介绍

    SQL(org.apache.ibatis.jdbc.SQL) 是mybatis 自带 sql 构造对象。

    表1:SQL的方法及作用介绍

    方法 作用
    SELECT(String)
    SELECT(String...)
    开始一个 SELECT 字句或将内容追加到 SELECT 字句。方法可以被多次调用,参数也会添加到 SELECT 字句。参数通常是使用 "," 分割的列名或列的别名列表,也可以是数据库驱动程序接收的任意关键字。
    SELECT_DISTINCT(String)
    SELECT_DISTINCT(String...)
    开始一个 SELECT 字句或将内容追加到 SELECT 字句。同时可以追加 DISTINCT 关键字到SELECT 语句中。方法可以被多次调用,参数也会添加到 SELECT 字句。参数通常是使用 ”,“ 分割的列名或列的别名列表,也可以是数据库驱动程序接收的任意关键字。
    FROM(String)
    FROM(String...)
    开始或追加 FROM 字句。方法可以被多次调用,参数会添加到 FROM 字句。参数通常是表名或别名,也可以是数据库驱动程序接收的任意关键字。
    JOIN(String)
    JOIN(String...)
    INNER_JOIN(String)
    INNER_JOIN(String...)
    LEFT_OUTER_JOIN(String)
    LEFT_OUTER_JOIN(String...)
    RIGHT_OUTER_JOIN(String)
    RIGHT_OUTER_JOIN(String...)
    根据不同的方法添加到对应类型的 JOIN 字句, 例如 INNER_JOIN() 方法添加 INNER JOIN 字句, LEFT_OUTER_JOIN()方法增加 LEFT OUTER JOIN 字句。参数可以包含又列名和 JOIN ON 条件组合成的标准 JOIN。
    WHERE(String)
    WHERE(String...)
    追加新的 WHERE 字句条件,并通过 AND 关键字连接。方法可以多次被调用,每次都由 AND 来连接新的条件。使用 OR() 方法可以追加 OR 关键字。
    OR() 使用 OR 来分割当前的 WHERE 或 HAVING 字句条件。可以被多次调用,但在同一行中,多次调用,可能会生成错误的 SQL 语句。
    AND() 使用 AND 来分割当前的 WHERE 或 HAVING 字句条件。可以被多次调用,但在同一行中,多次调用,可能会生成错误的 SQL 语句。 这个方法使用比较少,因为 WHERE() 和 HAVING() 方法都会自动追加 AND,只有必要时才会额外调用 AND() 方法。
    GROUP_BY(String)
    GROUP_BY(String...)
    追加新的 GROUP BY 字句,通过 "," 连接。方法可以被多次调用,每次都会使用 "," 连接新的条件。
    HAVING(String)
    HAVING(String...)
    追加新的 HAVING 字句条件。由 AND 关键字连接。方法可以被多次调用,每次都由 AND 连接新的条件。使用 OR() 方法可以追加 OR 关键字。
    ORDER_BY(String)
    ORDER_BY(String...)
    追加新的 ORDER BY 字句元素,由 "," 连接。可以多次被调用,每次都由 "," 连接新的条件。
    DELETE_FROM(String) 开始一个 DELETE 语句并指定表名。通常它后面都会跟着 WHERE 语句。
    INSERT_INTO(String) 开始一个 INSERT 语句并指定表名,后面都会跟着一个或者多个VALUES(),或 INTO_COLUMNS()和 INTO_VALUES()。
    SET(String)
    SET(String...)
    针对 UPDATE 语句,追加 SET 字句。
    UPDATE(String) 开始一个 UPDATE 语句并制定需要更新的表名。后面都会跟着一个或者多个 SET() 方法,通常会有一个或多个 WHERE()方法。
    VALUES(String, String) 追加 INSERT 语句中,第一个参数是要追加的列名,第二个参数则是列的值。
    INTO_COLUMNS(String...) 追加列到 INSERT 语句中,必须和 INTO_VALUES() 联合使用。
    INTO_VALUES(String...) 追加列的值到 INSERT 语句中,必须和 INTO_COLUMNS() 联合使用。

    续表(3.5.2版本之后)

    方法 作用
    LIMIT(String)
    LIMIT(int)
    追加 LIMIT 语句。 该方法与 SELECT(),UPDATE(),DELETE()一起使用时有效。并且该方法设计在使用 SELECT() 时与 OFFSET() 一起使用。
    OFFSET(String)
    OFFSET(long)
    追加 OFFSET 语句. 该方法与 SELECT() 一起使用时有效. 并且该方法设计在使用 SELECT() 时与 LIMIT() 一起使用。
    OFFSET_ROWS(String)
    OFFSET_ROWS(long)
    追加 OFFSET n ROWS 语句. 该方法与 SELECT() 一起使用时有效。 该方法设计与 FETCH_FIRST_ROWS_ONLY() 一起使用。
    FETCH_FIRST_ROWS_ONLY(String)
    FETCH_FIRST_ROWS_ONLY(int)
    追加 FETCH FIRST n ROWS ONLY 语句. 该方法与 SELECT() 一起使用时有效。 该方法设计与 OFFSET_ROWS() 一起使用。
    ADD_ROW() 为批量追加增加新行。

    SQL示例

    查询

    // 普通查询
    String orgSql = "SELECT P.PERSON_ID, P.PERSON_NAME, P.NICK_NAME, "
            + "P.TITLE, P.AGE, C.COMPANY_NAME, C.CITY
    "
            + "FROM PERSON P
    "
            + "LEFT OUTER JOIN COMPANY C ON C.COMPANY_ID = P.COMPANY_ID
    "
            + "WHERE (P.AGE > ? AND C.CITY = ?) 
    "
            + "OR (P.AGE < ?)
    "
            + "ORDER BY C.CITY, C.COMPANY_NAME";
    
    String newSql = new SQL()
            .SELECT("P.PERSON_ID", "P.PERSON_NAME", "P.NICK_NAME")
            .SELECT("P.TITLE", "P.AGE", "C.COMPANY_NAME", "C.CITY")
            .FROM("PERSON P")
            .LEFT_OUTER_JOIN("COMPANY C ON C.COMPANY_ID = P.COMPANY_ID")
            .WHERE("P.AGE > ?")
            .WHERE("C.CITY = ?")
            .OR()
            .WHERE("P.AGE < ?")
            .ORDER_BY("C.CITY", "C.COMPANY_NAME")
            .toString();
    Assert.assertEquals(orgSql, newSql);
    
    // 聚合函数
    orgSql = "SELECT MAX(P.AGE) MAX_AGE, C.COMPANY_NAME, C.CITY
    "
            + "FROM PERSON P
    "
            + "LEFT OUTER JOIN COMPANY C ON C.COMPANY_ID = P.COMPANY_ID
    "
            + "WHERE (C.CITY IN(?, ?))
    "
            + "GROUP BY C.COMPANY_NAME, C.CITY
    "
            + "HAVING (MAX_AGE > ? AND C.CITY = ?) 
    "
            + "OR (MAX_AGE < ?)
    "
            + "ORDER BY C.CITY, C.COMPANY_NAME";
    
    newSql = new SQL()
            .SELECT("MAX(P.AGE) MAX_AGE")
            .SELECT("C.COMPANY_NAME", "C.CITY")
            .FROM("PERSON P")
            .LEFT_OUTER_JOIN("COMPANY C ON C.COMPANY_ID = P.COMPANY_ID")
            .WHERE("C.CITY IN(?, ?)")
            .GROUP_BY("C.COMPANY_NAME", "C.CITY")
            .HAVING("MAX_AGE > ?")
            .HAVING("C.CITY = ?")
            .OR()
            .HAVING("MAX_AGE < ?")
            .ORDER_BY("C.CITY", "C.COMPANY_NAME")
            .toString();
    Assert.assertEquals(orgSql, newSql);
    

    查询(offset row)

    String orgSql = "SELECT P.PERSON_ID, P.PERSON_NAME, P.NICK_NAME, "
            + "P.TITLE, P.AGE, C.COMPANY_NAME, C.CITY
    "
            + "FROM PERSON P
    "
            + "LEFT OUTER JOIN COMPANY C ON C.COMPANY_ID = P.COMPANY_ID
    "
            + "WHERE (P.AGE > ? AND C.CITY = ?) 
    "
            + "OR (P.AGE < ?)
    "
            + "ORDER BY C.CITY, C.COMPANY_NAME OFFSET 10 ROWS FETCH FIRST 1 ROWS ONLY";
    
    String newSql = new SQL()
            .SELECT("P.PERSON_ID", "P.PERSON_NAME", "P.NICK_NAME")
            .SELECT("P.TITLE", "P.AGE", "C.COMPANY_NAME", "C.CITY")
            .FROM("PERSON P")
            .LEFT_OUTER_JOIN("COMPANY C ON C.COMPANY_ID = P.COMPANY_ID")
            .WHERE("P.AGE > ?")
            .WHERE("C.CITY = ?")
            .OR()
            .WHERE("P.AGE < ?")
            .ORDER_BY("C.CITY", "C.COMPANY_NAME")
            .OFFSET_ROWS(10)
            .FETCH_FIRST_ROWS_ONLY(1)
            .ADD_ROW()
            .toString();
    Assert.assertEquals(orgSql, newSql);
    

    动态查询

    String orgSql = "SELECT P.PERSON_ID, P.PERSON_NAME, P.NICK_NAME, "
            + "P.TITLE, P.AGE, C.COMPANY_NAME, C.CITY
    "
            + "FROM PERSON P
    "
            + "LEFT OUTER JOIN COMPANY C ON C.COMPANY_ID = P.COMPANY_ID
    "
            + "WHERE (P.AGE > #{age} AND C.CITY = #{city})
    "
            + "ORDER BY C.CITY, C.COMPANY_NAME";
    
    String newSql = new SQL()
            .SELECT("P.PERSON_ID", "P.PERSON_NAME", "P.NICK_NAME")
            .SELECT("P.TITLE", "P.AGE", "C.COMPANY_NAME", "C.CITY")
            .FROM("PERSON P")
            .LEFT_OUTER_JOIN("COMPANY C ON C.COMPANY_ID = P.COMPANY_ID")
            .WHERE("P.AGE > #{age}")
            .WHERE("C.CITY = #{city}")
            .ORDER_BY("C.CITY", "C.COMPANY_NAME")
            .toString();
    Assert.assertEquals(orgSql, newSql);
    

    动态插入

    String orgSql = "INSERT INTO PERSON
    "
            + " (PERSON_ID, PERSON_NAME, NICK_NAME, TITLE, AGE, COMPANY_ID)
    "
            + "VALUES (#{personId}, #{personName}, #{nickName}, #{title}, #{age}, #{companyId})";
    
    String newSql = new SQL()
            .INSERT_INTO("PERSON")
            .INTO_COLUMNS("PERSON_ID", "PERSON_NAME", "NICK_NAME", "TITLE", "AGE", "COMPANY_ID")
            .INTO_VALUES("#{personId}", "#{personName}", "#{nickName}", "#{title}", "#{age}", "#{companyId}")
            .toString();
    Assert.assertEquals(orgSql, newSql);
    

    批量插入(多行)

    String orgSql = "INSERT INTO PERSON
    "
            + " (PERSON_ID, PERSON_NAME, NICK_NAME, TITLE, AGE, COMPANY_ID)
    "
            + "VALUES (?, ?, ?, ?, ?, ?)
    , (?, ?, ?, ?, ?, ?)";
    
    String newSql = new SQL()
            .INSERT_INTO("PERSON")
            .INTO_COLUMNS("PERSON_ID", "PERSON_NAME", "NICK_NAME", "TITLE", "AGE", "COMPANY_ID")
            .INTO_VALUES("?", "?", "?", "?", "?", "?")
            .ADD_ROW()
            .INTO_VALUES("?", "?", "?", "?", "?", "?")
            .toString();
    Assert.assertEquals(orgSql, newSql);
    

    动态删除

    String orgSql = "DELETE FROM PERSON
    "
            + "WHERE (PERSON_ID = #{personId})";
    
    String newSql = new SQL()
            .DELETE_FROM("PERSON")
            .WHERE("PERSON_ID = #{personId}")
            .toString();
    Assert.assertEquals(orgSql, newSql);
    

    动态更新

    String orgSql = "UPDATE PERSON
    "
            + "SET NICK_NAME = #{nickName}
    "
            + "WHERE (PERSON_ID = #{personId})";
    
    String newSql = new SQL()
            .UPDATE("PERSON")
            .SET("NICK_NAME = #{nickName}")
            .WHERE("PERSON_ID = #{personId}").toString();
    Assert.assertEquals(orgSql, newSql);
    

    公众号

    喜欢我的文章,请关注公众号

  • 相关阅读:
    Repeater中使用Button
    C#, JS, HTML 转义字符
    简化: ASP.NET 事件触发顺序
    必须写闭合标签
    JS通用窗口拖动函数
    SQL修修补补语句
    asp.net: RDLC 报表
    Ascx中引用(调用)JS文件,在用户控件中引用(调用)JS文件
    <a>
    JS, CSS 引用样式
  • 原文地址:https://www.cnblogs.com/javaDeveloper/p/13140262.html
Copyright © 2020-2023  润新知