package com.github.ltsopensource.store.jdbc.builder; import com.github.ltsopensource.core.logger.Logger; import com.github.ltsopensource.core.logger.LoggerFactory; import com.github.ltsopensource.store.jdbc.SQLFormatter; import com.github.ltsopensource.store.jdbc.SqlTemplate; import com.github.ltsopensource.store.jdbc.exception.DupEntryException; import com.github.ltsopensource.store.jdbc.exception.JdbcException; import com.github.ltsopensource.store.jdbc.exception.TableNotExistException; import java.sql.SQLException; import java.util.LinkedList; import java.util.List; /** * @author Robert HG (254963746@qq.com) on 3/8/16. */ public class InsertSql { private static final Logger LOGGER = LoggerFactory.getLogger(InsertSql.class); private SqlTemplate sqlTemplate; private StringBuilder sql = new StringBuilder(); private List<Object[]> params = new LinkedList<Object[]>(); private int columnsSize = 0; public InsertSql(SqlTemplate sqlTemplate) { this.sqlTemplate = sqlTemplate; } public InsertSql insert(String table) { this.sql.append("INSERT INTO "); sql.append("`").append(table).append("`"); return this; } public InsertSql insertIgnore(String table) { this.sql.append("INSERT IGNORE INTO "); sql.append("`").append(table).append("`"); return this; } public InsertSql columns(String... columns) { if (columns == null || columns.length == 0) { throw new JdbcException("columns must have length"); } if (columnsSize > 0) { throw new JdbcException("columns already set"); } columnsSize = columns.length; sql.append("("); String split = ""; for (String column : columns) { sql.append(split); split = ", "; sql.append("`").append(column.trim()).append("`"); } sql.append(") VALUES "); sql.append("("); split = ""; for (int i = 0; i < columnsSize; i++) { sql.append(split); split = ","; sql.append("?"); } sql.append(")"); return this; } public InsertSql values(Object... values) { if (values == null || values.length != columnsSize) { throw new JdbcException("values.length must eq columns.length"); } params.add(values); return this; } public int doInsert() { if (params.size() == 0) { throw new JdbcException("No values"); } if (params.size() > 1) { throw new JdbcException("values.length gt 1, please use doBatchInsert"); } String execSql = sql.toString(); if (LOGGER.isDebugEnabled()) { LOGGER.debug(execSql); } try { return sqlTemplate.insert(execSql, params.get(0)); } catch (SQLException e) { if (e.getMessage().contains("Duplicate entry")) { throw new DupEntryException("Insert SQL Error:" + execSql, e); } else if (e.getMessage().contains("doesn't exist Query:")) { throw new TableNotExistException("Insert SQL Error:" + execSql, e); } throw new JdbcException("Insert SQL Error:" + execSql, e); } catch (Exception e) { throw new JdbcException("Insert SQL Error:" + execSql, e); } } public int[] doBatchInsert() { if (params.size() == 0) { throw new JdbcException("No values"); } String finalSQL = sql.toString(); if (LOGGER.isDebugEnabled()) { LOGGER.debug(SQLFormatter.format(finalSQL)); } try { Object[][] objects = new Object[params.size()][columnsSize]; for (int i = 0; i < params.size(); i++) { objects[i] = params.get(i); } return sqlTemplate.batchInsert(finalSQL, objects); } catch (SQLException e) { if (e.getMessage().contains("Duplicate entry")) { throw new DupEntryException("Insert SQL Error:" + SQLFormatter.format(finalSQL), e); } else if (e.getMessage().contains("doesn't exist Query:")) { throw new TableNotExistException("Insert SQL Error:" + SQLFormatter.format(finalSQL), e); } throw new JdbcException("Insert SQL Error:" + SQLFormatter.format(finalSQL), e); } catch (Exception e) { throw new JdbcException("Insert SQL Error:" + SQLFormatter.format(finalSQL), e); } } public String getSQL() { return sql.toString(); } }