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

net.dongliu.dbutils.Database Maven / Gradle / Ivy

There is a newer version: 6.0.2
Show newest version
package net.dongliu.dbutils;

import net.dongliu.dbutils.exception.UncheckedSQLException;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Objects;
import java.util.function.Function;

/**
 * Wrap JDBC dataSource, to execute SQL queries.
 *
 * @see ResultSetHandler
 */
public class Database extends SQLExecutor {

    /**
     * The DataSource to retrieve connections from.
     */
    private final DataSource dataSource;

    /**
     * Constructor to provide a DataSource.
     */
    private Database(DataSource dataSource) {
        this.dataSource = Objects.requireNonNull(dataSource);
    }

    /**
     * Create a database from data source.
     */
    public static Database create(DataSource dataSource) {
        return new Database(dataSource);
    }

    /**
     * Create a database, with jdbc url, using internal non-pooled data source.
     */
    public static Database create(String jdbcUrl, String user, String password) {
        return new Database(SimpleDataSource.create(jdbcUrl, user, password));
    }

    /**
     * Fetch a Connection object.
     * For transaction, connection is save by thread-local, just retrieve and return
     *
     * @return An initialized Connection.
     */
    private Connection retrieveConnection() {
        Connection connection;
        try {
            connection = this.dataSource.getConnection();
        } catch (SQLException e) {
            throw new UncheckedSQLException(e);
        }
        return connection;
    }

    /**
     * Start a transaction, and return transaction context for executing sql.
     *
     * @return a transaction context to commit/rollback context
     */
    public TransactionContext startTransaction() {
        Connection connection = retrieveConnection();
        return new TransactionContext(connection);
    }

    /**
     * Start a transaction, execute sqls in function, and do commit after function finished,
     * or rollback if exception occurred
     */
    public  T withTransaction(Function function) {
        TransactionContext ctx = startTransaction();
        try {
            T result = function.apply(ctx);
            ctx.commit();
            return result;
        } catch (Throwable t) {
            ctx.rollback();
            throw t;
        }
    }

    @Override
    protected ConnectionInfo supplyConnection() {
        Connection connection = this.retrieveConnection();
        return new ConnectionInfo(connection, true);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy