当前位置: 首页 > 工具软件 > SqlBuilder > 使用案例 >

SQL拼接工具包,支持Oracle/PostgreSQL/MySql

孙才捷
2023-12-01

使用环境

JDK1.8+
Spring
slf4j-api

使用方法

  • SpringBoot或SpringCloud下
    直接引入sql-builder.jar
  • Spring工程
    1、引入sql-builder.jar
    2、在扫描类上增加@Import注解,如下
    3、或者在bean.xml中增加标签(未测试)
@Configuration
@ComponentScan(value="org.example.config")
@Import(value = com.leewin.db.sql.AutoInitSqlBuilderFactory.class)
public class Application {
}
<bean id="autoInitSqlBuilderFactory" class="com.leewin.db.sql.AutoInitSqlBuilderFactory" />

代码示例

获取SqlBuilder实例

引入本包后,启动时会自动判断所使用的数据库。目前只支持Oracle、MySQL、PostgreSQL。自动获取SqlBuilder

SqlBuilder builder = SqlBuilderFactory.getBuilder()

当然也可以根据指定类型获取SqlBuilder实例

SqlBuilder builder = SqlBuilderFactory.getBuilder(DBType.ORACLE);

拼接sql

  • 使用appen()方法拼接主体sql
  • 使用andXxx()、orXxx()、add()等方法拼接条件语句
  • 使用build()方法结束拼接
  • 使用getText()方法获取拼接的语句
  • 使用getParam()方法获取参数列表
拼接select语句
SqlBuilder builder = SqlBuilderFactory.getBuilder();
        builder.append("select * from user_table ut")
                .append("left join user_area ua on ut.pk_area = ua.pk_area")
                .andGtTime("ut.create_time", "2022-03-31 15:01:37")
                .build();
        this.sout(builder, null);

输出sql:
 select * from user_table ut
 left join user_area ua on ut.pk_area = ua.pk_area
 where ut.create_time > ? 
 
参数:[Thu Mar 31 15:01:37 CST 2022]
拼接update、delete语句
SqlBuilder builder = SqlBuilderFactory.getBuilder();
        builder.append("update user_table ut set ut.name = ? ", "daCongMing")
                .andEq("ut.name", "jame")
                .andGt("ut.age", 18)
                .build();
//输出
sql:
 update user_table ut set ut.name = ? 
 where ut.name = ? 
 and ut.age > ? 
 
参数:[daCongMing, jame, 18]
拼接where条件

主要有andEq(String field, String value)、
andLike(String field, String value)、
andIn(String field, String value)、
orEq(String field, String value)、
orIn(String field, String value)、
andEqDate(String field, String value)、
andEqTime(String field, String value)、
orXxx(String field, String value)等主要常用方法。

注意:这些方法都会做非空判断,即,当field为空或空串,或value为空或空串时都会忽略掉此条件,不进行拼接

  • like条件拼接

其中like相关方法会对特殊字符进行转义。
Oracle、PostgreSQL下包含 ‘\’ ‘%’ ‘_’ (转义字符为 ‘\’)
MySql下包含 ‘\’ ‘%’ ‘_’ ‘/’ (转义字符为 ‘/’)
提示:

通过addEscape()增加需要转义的特殊字符
通过setEscapeChar()设置转义字符

SqlBuilder builder = SqlBuilderFactory.getBuilder();
        builder.append("select * from user_table ut")
                .andLike("name", Arrays.asList("\na", "a%a", "n_"))
                .build();
// 或
builder.append("select * from user_table")
                .andLike("name", "\\na")
                .andLike("area", "a%b")
                .andLike("area", "a_b")
                //.andEq("area", "a_b")
                .build();
// 输出
sql:
 select * from user_table
 where name like ? escape '\'
 and area like ? escape '\'
 and area like ? escape '\'
 and area = ? 
 
参数:[%\\na%, %a\%b%, %a\_b%, a_b]

  • Date / Time条件拼接
    在用到andEqDate(String field, String value)或orEqDate(String field, String value)方法时,会对值进行格式转换。这两个方法建议使用andGeDate()与andLeDate()方法代替。

Oracle/PostgreSQL会将field转换为to_char(field, ‘yyyy-mm-dd’)
MySql会将field转换为date_format(field, ‘%Y-%m-%d’)
提示:

可以通过setDbDatePatter(String datePatter) 设置value的转换格式

在用到andEqTime(String field, String value) 或 orEqTime(String field, String value)方法时,会对值进行格式转换。这两个方法建议使用andGeDate()与andLeDate()方法代替。

Oracle/PostgreSQL会将field转换为to_char(field, ‘yyyy-mm-dd hh24:mi:ss’)
MySql会将field转换为date_format(field, ‘%Y-%m-%d %H:%i:%s’)
提示:

可以通过setDbDateTimePatter(String datePatter) 设置value的转换格式

对于 其他的 andGtDate(String field, String value),andGtTime(String field, String value)等方法,会将value转换为Date类型。

默认转换格式为“yyyy-MM-dd” 或“yyyy-MM-dd HH:mm:ss”
提示:

可以通过setJavaDateTimePattern(String)、setJavaDatePattern(String)进行设置

SqlBuilder builder = SqlBuilderFactory.getBuilder();
        builder.append("select * from user_table")
                .andEqDate("create_date", "2022-04-08")
                .andGtDate("create_date", "2022-04-08")
                .andGtDate("create_date", new Date())
                .andEqTime("create_time", "2022-03-31 15:01:37")
                .andGtTime("create_time", "2022-03-31 15:01:37")
                .andGtTime("create_time", new Date())
                .build();
// 输出
sql:
 select * from user_table
 where to_char(create_date, 'yyyy-mm-dd') = ? 
 and create_date > ? 
 and create_date > ? 
 and to_char(create_time, 'yyyy-mm-dd hh24:mi:ss') = ? 
 and create_time > ? 
 and create_time > ? 
 
参数:
[2022-04-08, Fri Apr 08 00:00:00 CST 2022, Fri Apr 22 17:29:02 CST 2022, 
2022-03-31 15:01:37, Thu Mar 31 15:01:37 CST 2022, Fri Apr 22 17:29:02 CST 2022]
其他方法说明

    /**
     * 拼接’and (’ 条件,之后只能调用{@link OrBuilder} 接口中的方法,即{@code orXxx()}的方法,<br></br>
     * 结束后必须调用{@link #over()}方法,否则拼接的格式会不正确。
     * @return {@link OrBuilder}
     */
    public OrBuilder andOr() {...}

    /**
     * 拼接’or (’ 条件,之后只能调用{@link AndBuilder} 接口中的方法,即{@code andXxx()}的方法,<br></br>
     * 结束后必须调用{@link #over()}方法,否则拼接的格式会不正确。
     * @return {@link OrBuilder}
     */
    public AndBuilder orAnd() {...}

    /**
     * 拼接')',表示{@link #andOr()}或{@link #orAnd()}方法结束
     * @return {@link SqlBuilder}
     */
    public SqlBuilder over() {...}

    /**
     * 添加自定义的条件语句
     * @param text 条件语句,但是不能包含占位符,如包含则会抛出{@link SqlBuilderException}
     * @return {@link SqlBuilder}
     */
    public SqlBuilder add(String text) {...}

    /**
     * 添加自定义的条件语句,比如exists、 not exisst等
     * @param text 条件语句,其中必须包含占位符
     * @param values 占位符对应的值,如值与占位符的个数不相等,会抛出{@link SqlBuilderException}
     * @return {@link SqlBuilder}
     */
    public SqlBuilder add(String text, Object... values) {...}

    /**
     * 拼接sql主体语句,比如:select、join、right join、left join、order by、 group by 等
     * @param text sql主体语句,但是不能包含占位符,如包含则会抛出{@link SqlBuilderException}
     * @return {@link SqlBuilder}
     */
    public SqlBuilder append(String text) {...}

    /**
     * 拼接sql主体语句,比如:update xxx where xxx = ?
     * @param text sql主体语句,其中必须包含占位符
     * @param values 占位符对应的值,如值与占位符的个数不相等,会抛出{@link SqlBuilderException}
     * @return {@link SqlBuilder}
     */
    public SqlBuilder append(String text, Object... values) {...}

下载地址

sql-builder.jar
sql-builder-api

 类似资料: