Подтвердить что ты не робот

В чем разница между JDBC и JDBI?

Я хочу знать о различиях между JDBC и JDBI в java. В частности, какой из них вообще лучше и почему?

4b9b3361

Ответ 1

(Я являюсь основным автором jDBI)

jDBI - это библиотека удобства, построенная поверх JDBC. JDBC работает очень хорошо, но, как правило, оптимизирует для поставщиков баз данных (драйверов) пользователей. jDBI пытается выявить те же функции, но в API, оптимизированном для пользователей.

Он намного ниже, чем такие, как Hibernate или JPA. Ближайшая аналогичная библиотека, вероятно, MyBatis (разветвленный преемник iBATIS).

jDBI поддерживает два стиля API, более старый, свободный стиль, который выглядит следующим образом:

List<Something> r = h.createQuery("select * from something where name = :name and id = :id")
                .bind(0, "eric")
                .bind("id", 1)
                .map(Something.class)
                .list();

Новый API-интерфейс SQL-объектов делает гораздо более отражающий тип материала и действительно начинает абстрагироваться от множества вещей JDBC:

interface TheBasics
{
    @SqlUpdate("insert into something (id, name) values (:id, :name)")
    int insert(@BindBean Something something);

    @SqlQuery("select id, name from something where id = :id")
    Something findById(@Bind("id") long id);
}

@Test
public void useTheBasics() throws Exception
{
    TheBasics dao = dbi.onDemand(TheBasics.class);

    dao.insert(new Something(7, "Martin"));

    Something martin = dao.findById(7);
}

В библиотеке есть хорошие справочные документы (javadoc) и некоторая разумная документация по учебному стилю в http://jdbi.org/. Он существует с 2004 года и используется относительно небольшим количеством людей (несколько десятков человек, которых я знаю лично, а может быть, и десяток компаний), но он очень хорошо работает для них. Большинство людей, которые работают над ним, являются людьми A + и в первую очередь занимаются созданием инструмента, который хорошо работает для них, - что он с открытым исходным кодом в значительной степени является побочным эффектом.

Ответ 2

Вы имеете в виду http://jdbi.codehaus.org/?

jDBI предназначен для обеспечения удобного доступа к табличным данным в Java (tm). Он использует структуру коллекций Java для результатов запроса, предоставляет удобные средства для экстернализации операторов sql и предоставляет именованную поддержку параметров для любой используемой базы данных.

JDBI использует JDBC, если вы не знаете, нужен ли вам JDBI, я бы предложил, чтобы вы его не использовали.

Ответ 3

JDBC - это давно установленный стандарт, используемый в Java для доступа к базам данных SQL. DB Vendors реализует драйвер JDBC, чтобы обеспечить доступ к всем БД единообразным образом. Практически все, что делается с базами данных в Java, использует JDBC.

JDBI, похоже, является своего рода абстракционным слоем поверх JDBC, но трудно сказать, поскольку он плохо документирован. Это, конечно, не широко используется, и я впервые услышал об этом.

Ответ 4

jDBI построен поверх JDBC. Все приложения Java используют JDBC для доступа к реляционным базам данных, поэтому он не является ни/или выбором. Они бесплатные. Вы не можете использовать jDBI без JDBC.

С учетом сказанного, jDBI - это еще одна попытка человека освободить разработчиков Java от шаблона, требуемого JDBC. Это похоже на выбор Hibernate или TopLink или iBatis.

Ответ 5

Действительно, JDBI построен поверх JDBC, на самом деле, скорее всего, вы будете использовать JDBC для доступа к БД, а JDBI будет тем, который включает (или завернутый) JDBC, чтобы получить PreparedStatements, выполненный против БД.

Внутренне, Драйвер JDBC - это тот, который выполняет транзакцию, JDBI работает только как посредник.

Он легче, чем ORM (например, Hibernate или Spring), но он действительно помогает ускорить разработку и имеет все более "приятное и чистое", так как у него много утилит, чтобы сделать кодирование проще и чище, например:

Чтобы определить простой объект для вставки/чтения таблицы, вы можете сделать это следующим образом:

import com.sql.poc.data.jDBI.map.AgentMapper;
import com.sql.poc.domain.Agent;
import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
import org.skife.jdbi.v2.sqlobject.SqlUpdate;
import org.skife.jdbi.v2.sqlobject.customizers.Mapper;
import org.skife.jdbi.v2.sqlobject.mixins.Transactional;

public interface SqlObjectDataAccess extends Transactional<SqlObjectDataAccess> {

    @SqlUpdate("INSERT INTO pocAgent (LocationId, Name, Country) VALUES (:id, :name, :country)")
    void insertAgent(@Bind("id") String locationId,
                     @Bind("name") String name,
                     @Bind("country") String country);

    @SqlQuery("SELECT LOCATIONID, NAME, COUNTRY, CREATEDON FROM pocAgent WHERE LOCATIONID = :LocationId")
    @Mapper(AgentMapper.class)
    Agent getAgentByLocation(@Bind("LocationId") String locationId);

    void close();    
}

JDBI дает вам возможность иметь всю логику отображения в одном месте, например:

import com.sql.poc.domain.Agent;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
import java.sql.ResultSet;
import java.sql.SQLException;

public class AgentMapper implements ResultSetMapper<Agent> {
    @Override
    public Agent map(int index, ResultSet r, StatementContext ctx) throws SQLException {
        return new Agent(r.getString("LocationId"),
                r.getString("Name"),
                r.getString("Country"),
                r.getDate("CreatedOn"));
    }
}

И тогда вам просто нужно использовать DAO (Data Access Object):

import com.google.inject.Inject;
import com.sql.poc.IConnectionHelper;
import com.sql.poc.domain.Agent;
import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.logging.Log4JLog;

public class SqlObjectRepository {
    IConnectionHelper _connectionHelper;
    DBI _dbiInstance;
    SqlObjectDataAccess _daoHandler;

    @Inject
    SqlObjectRepository() {
        _dbiInstance = new DBI(_connectionHelper.getDataSource());
        _dbiInstance.setSQLLog(new Log4JLog());
    }

    public void openConnection() {
        if (_daoHandler == null)
            _daoHandler = _dbiInstance.open(SqlObjectDataAccess.class);
    }

    @org.skife.jdbi.v2.sqlobject.Transaction
    public Agent insertAgent(String locationId, String name, String country) {
        openConnection();
        Agent agent = _daoHandler.getAgentByLocation(locationId);
        if (agent == null) {
            _daoHandler.insertAgent(locationId, name, country);
        }
        agent = _daoHandler.getAgentByLocation(locationId);
        _daoHandler.commit();
        return agent;
    }
}

Затем, если мы пойдем немного глубже и проверим, как соединение выполняется с БД, вы заметите, что для этого примера пробной концепции используется JDBC:

import com.google.inject.Inject;
import com.sql.poc.IConnectionHelper;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.impl.GenericObjectPool;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class TandemMPConnectionHelper implements IConnectionHelper {
    private final DataSource _dataSource;

    @Inject
    TandemMPConnectionHelper() {
        try {
            Class.forName("com.tandem.t4jdbc.SQLMXDriver");
        } catch (ClassNotFoundException e) {
            System.out.println(e.toString());
        }
        _dataSource = setupDataSource("jdbc:t4sqlmx://<server>:<port>/:<username>:<password>:", "user1", "password1");
    }

    @Override
    public DataSource setupDataSource(String connectURI, String userName, String password) {
        GenericObjectPool connectionPool = new GenericObjectPool();
        connectionPool.setMaxActive(20);
        ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
                connectURI,
                userName,
                password);
        new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, false);
        return new PoolingDataSource(connectionPool);
    }

    @Override
    public DataSource getDataSource() {
        return _dataSource;
    }

    @Override
    public Connection getConnection() {
        Connection connection;
        try {
            connection = _dataSource.getConnection();
            connection.setAutoCommit(false);
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            return null;
        }
        return connection;
    }
}

В этом случае я достигаю базы данных Tandem Non/Stop, но то же самое работает для SQL Server, ORACLE или любого другого, что вы делаете, вам нужен только правильный драйвер JDBC (который вы можете легко найти, просто Google это!).

Надеюсь, он даст вам более четкую идею о том, где, концептуально, найти JDBI и JDBC в вашем коде.

Ответ 6

Я нашел jDBI, когда я ищу параметры SQL. Я использую известный конкурент Spring JDBC NamedTemplate, но имеет странные зависимости для 8-10 МБ. У меня уже есть зависимость от ANTLR.

Я смотрю с нескольких часов, jDBI кажется вдохновляющим. Оба (jDBI/ Spring JDBC) можно в какой-то степени сравнить со светлыми ORM, такими как iBatis/MyBatis и т.д.