com.xiaoleilu.hutool.db.dialect.impl.AnsiSqlDialect Maven / Gradle / Ivy
package com.xiaoleilu.hutool.db.dialect.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import com.xiaoleilu.hutool.db.DbUtil;
import com.xiaoleilu.hutool.db.Entity;
import com.xiaoleilu.hutool.db.Page;
import com.xiaoleilu.hutool.db.dialect.Dialect;
import com.xiaoleilu.hutool.db.dialect.DialectName;
import com.xiaoleilu.hutool.db.sql.Condition;
import com.xiaoleilu.hutool.db.sql.LogicalOperator;
import com.xiaoleilu.hutool.db.sql.Order;
import com.xiaoleilu.hutool.db.sql.Query;
import com.xiaoleilu.hutool.db.sql.SqlBuilder;
import com.xiaoleilu.hutool.db.sql.Wrapper;
import com.xiaoleilu.hutool.util.ArrayUtil;
import com.xiaoleilu.hutool.util.CollectionUtil;
/**
* ANSI SQL 方言
* @author loolly
*
*/
public class AnsiSqlDialect implements Dialect {
protected Wrapper wrapper = new Wrapper();
@Override
public Wrapper getWrapper() {
return this.wrapper;
}
@Override
public void setWrapper(Wrapper wrapper) {
this.wrapper = wrapper;
}
@Override
public PreparedStatement psForInsert(Connection conn, Entity entity) throws SQLException {
final SqlBuilder insert = SqlBuilder.create(wrapper).insert(entity, this.dialectName());
final PreparedStatement ps = conn.prepareStatement(insert.build(), Statement.RETURN_GENERATED_KEYS);
DbUtil.fillParams(ps, insert.getParamValues());
return ps;
}
@Override
public PreparedStatement psForDelete(Connection conn, Query query) throws SQLException {
if (null == query) {
throw new NullPointerException("query is null !");
}
Condition[] where = query.getWhere();
if(ArrayUtil.isEmpty(where)){
// 对于无条件的删除语句直接抛出异常禁止,防止误删除
throw new SQLException("No 'WHERE' condition, we can't prepared statement for delete everything.");
}
final SqlBuilder delete = SqlBuilder.create(wrapper)
.delete(query.getFirstTableName())
.where(LogicalOperator.AND, where);
final PreparedStatement ps = conn.prepareStatement(delete.build());
DbUtil.fillParams(ps, delete.getParamValues());
return ps;
}
@Override
public PreparedStatement psForUpdate(Connection conn, Entity entity, Query query) throws SQLException {
if (null == query) {
throw new NullPointerException("query is null !");
}
Condition[] where = query.getWhere();
if(ArrayUtil.isEmpty(where)){
// 对于无条件的删除语句直接抛出异常禁止,防止误删除
throw new SQLException("No 'WHERE' condition, we can't prepared statement for update everything.");
}
final SqlBuilder update = SqlBuilder.create(wrapper)
.update(entity)
.where(LogicalOperator.AND, where);
final PreparedStatement ps = conn.prepareStatement(update.build());
DbUtil.fillParams(ps, update.getParamValues());
return ps;
}
@Override
public PreparedStatement psForFind(Connection conn, Query query) throws SQLException {
//验证
if (null == query) {
throw new NullPointerException("query is null !");
}
final SqlBuilder find = SqlBuilder.create(wrapper).query(query);
final PreparedStatement ps = conn.prepareStatement(find.build());
DbUtil.fillParams(ps, find.getParamValues());
return ps;
}
@Override
public PreparedStatement psForPage(Connection conn, Query query) throws SQLException {
final SqlBuilder find = SqlBuilder.create(wrapper)
.select(query.getFields())
.from(query.getTableNames())
.where(LogicalOperator.AND, query.getWhere());
final Page page = query.getPage();
if(null != page){
final Order[] orders = page.getOrders();
if(null != orders){
find.orderBy(orders);
}
}
//limit A offset B 表示:A就是你需要多少行,B就是查询的起点位置。
find.append(" limit ").append(page.getNumPerPage()).append(" offset ").append(page.getStartPosition());
final PreparedStatement ps = conn.prepareStatement(find.build());
DbUtil.fillParams(ps, find.getParamValues());
return ps;
}
@Override
public PreparedStatement psForCount(Connection conn, Query query) throws SQLException {
query.setFields(CollectionUtil.newArrayList("count(1)"));
return psForFind(conn, query);
}
@Override
public DialectName dialectName() {
return DialectName.ANSI;
}
// ---------------------------------------------------------------------------- Protected method start
// ---------------------------------------------------------------------------- Protected method end
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy