package com.github.looly.hutool.db.dialect.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map.Entry; import com.github.looly.hutool.db.Entity; import com.github.looly.hutool.PageUtil; import com.github.looly.hutool.db.DbUtil; /** * Oracle 方言 * @author loolly * */ public class OracleDialect extends AnsiSqlDialect{ @Override public PreparedStatement psForInsert(Connection conn, Entity entity) throws SQLException { final StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO `").append(entity.getTableName()).append("`("); final StringBuilder placeHolder = new StringBuilder(); placeHolder.append(") values("); final List<Object> paramValues = new ArrayList<Object>(entity.size()); for (Entry<String, Object> entry : entity.entrySet()) { if (paramValues.size() > 0) { sql.append(", "); placeHolder.append(", "); } sql.append("`").append(entry.getKey()).append("`"); final Object value = entry.getValue(); if(value instanceof String && ((String)value).endsWith(".nextval")) { //Oracle的特殊自增键,通过字段名.nextval获得下一个值 placeHolder.append(value); }else { placeHolder.append("?"); paramValues.add(value); } } sql.append(placeHolder.toString()).append(")"); final PreparedStatement ps = conn.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS); DbUtil.fillParams(ps, paramValues.toArray(new Object[paramValues.size()])); return ps; } @Override public PreparedStatement psForPage(Connection conn, Collection<String> fields, Entity where, int page, int numPerPage) throws SQLException { final List<Object> paramValues = new ArrayList<Object>(where.size()); final StringBuilder select = buildSelectQuery(fields, where, paramValues); int[] startEnd = PageUtil.transToStartEnd(page, numPerPage); final StringBuilder sql = new StringBuilder(); sql.append("SELECT * FROM ( SELECT row_.*, rownum rownum_ from ( ") .append(select).append(" ) row_ where rownum <= ").append(startEnd[1]) .append(") table_alias") .append(" where table_alias.rownum_ >= ").append(startEnd[0]); final PreparedStatement ps = conn.prepareStatement(sql.toString()); DbUtil.fillParams(ps, paramValues.toArray(new Object[paramValues.size()])); return ps; } }