JDK1.8+
Spring
slf4j-api
@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" />
引入本包后,启动时会自动判断所使用的数据库。目前只支持Oracle、MySQL、PostgreSQL。自动获取SqlBuilder
SqlBuilder builder = SqlBuilderFactory.getBuilder()
当然也可以根据指定类型获取SqlBuilder实例
SqlBuilder builder = SqlBuilderFactory.getBuilder(DBType.ORACLE);
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]
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]
主要有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相关方法会对特殊字符进行转义。
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]
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) {...}