All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eobjects.metamodel.jdbc.JdbcInsertBuilder Maven / Gradle / Ivy

/**
 * eobjects.org MetaModel
 * Copyright (C) 2010 eobjects.org
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 */
package org.eobjects.metamodel.jdbc;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import org.eobjects.metamodel.MetaModelException;
import org.eobjects.metamodel.insert.AbstractRowInsertionBuilder;
import org.eobjects.metamodel.schema.Column;
import org.eobjects.metamodel.schema.ColumnType;
import org.eobjects.metamodel.schema.Table;
import org.eobjects.metamodel.util.FileHelper;
import org.eobjects.metamodel.util.FormatHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * {@link InsertBuilder} that issues an SQL INSERT statement
 * 
 * @author Kasper Sørensen
 */
final class JdbcInsertBuilder extends AbstractRowInsertionBuilder {

	private static final Logger logger = LoggerFactory
			.getLogger(JdbcInsertBuilder.class);

	public JdbcInsertBuilder(JdbcUpdateCallback updateCallback, Table table) {
		super(updateCallback, table);
		if (!(table instanceof JdbcTable)) {
			throw new IllegalArgumentException("Not a valid JDBC table: "
					+ table);
		}
	}

	@Override
	public void execute() {
		final String sql = createSqlStatement();
		logger.info("Insert statement created: {}", sql);

		Connection connection = getUpdateCallback().getConnection();
		Statement st = null;
		try {

			st = connection.createStatement();
			int rowsAffected = st.executeUpdate(sql);
			logger.info("Insert statement returned: {} rows affected",
					rowsAffected);
			assert rowsAffected == 1;
		} catch (SQLException e) {
			throw new MetaModelException("Failed to execute INSERT statement: "
					+ sql, e);
		} finally {
			FileHelper.safeClose(st);
		}
	}

	protected String createSqlStatement() {
		return createSqlStatement(getValues());
	}

	private String createSqlStatement(Object[] values) {
		Table table = getTable();
		StringBuilder sb = new StringBuilder();
		sb.append("INSERT INTO ");
		sb.append(table.getQualifiedLabel());
		sb.append(" (");
		Column[] columns = getColumns();
		boolean firstValue = true;
		for (int i = 0; i < columns.length; i++) {
			if (values[i] != null) {
				if (firstValue) {
					firstValue = false;
				} else {
					sb.append(',');
				}
				String columnName = columns[i].getName();
				columnName = getUpdateCallback().quoteIfNescesary(columnName);
				sb.append(columnName);
			}
		}

		sb.append(") VALUES (");
		firstValue = true;
		for (int i = 0; i < columns.length; i++) {
			if (values[i] != null) {
				if (firstValue) {
					firstValue = false;
				} else {
					sb.append(',');
				}
				sb.append(getValueAsSql(columns[i], values[i]));
			}
		}
		sb.append(")");
		String sql = sb.toString();
		return sql;
	}

	private String getValueAsSql(Column column, Object value) {
		final ColumnType columnType = column.getType();
		return FormatHelper.formatSqlValue(columnType, value);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy