jdbi vs mybatis ?

2,472 views
Skip to first unread message

Brent Ryan

unread,
Feb 8, 2014, 1:50:02 PM2/8/14
to dropwiz...@googlegroups.com
Out of curiosity, any reason why dropwizard went with jdbi instead of mybatis as the default?  It appears like mybatis is a little more advanced (but same concept) and has better documentation.

Brent

Miguel larraz

unread,
Jan 21, 2015, 5:25:18 PM1/21/15
to dropwiz...@googlegroups.com
I agree, I am interested in use dropwizzard, but jdbi looks tedius, compared with mybatis. Is not posible configure mybatis support? i found hibernate alternative in the documentation, but no mybatis

Brent Ryan

unread,
Jan 21, 2015, 7:19:06 PM1/21/15
to dropwiz...@googlegroups.com
It was fairly easy to integrate mybatis with our dropwizard stack. Let me know if you need help in doing so.

Brent
--
You received this message because you are subscribed to a topic in the Google Groups "dropwizard-user" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/dropwizard-user/K-3kek-xIrc/unsubscribe.
To unsubscribe from this group and all its topics, send an email to dropwizard-us...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Alexandre Jacques

unread,
Feb 8, 2015, 11:42:37 AM2/8/15
to dropwiz...@googlegroups.com
Hi Brent,

I would be interested on your approach to integrate MyBatis. Could you post some thoughts on how you did it?

Regards,

Alexandre Jacques

Brent Ryan

unread,
Feb 19, 2015, 11:09:17 AM2/19/15
to dropwiz...@googlegroups.com
It's a pretty simple implementation and we plan on putting this up as OSS soon if anyone wants it:

Initialize your mybatis tier like this:
        final ManagedDataSource ds = configuration.getDataSourceFactory().build(environment.metrics(), "sql");

        MyBatisFactory factory = new MyBatisFactory();
        SqlSessionFactory sessionFactory = factory.build(environment, configuration.getDataSourceFactory(), ds,
                "sqlserver");
        sessionFactory.getConfiguration().addMapper(MyExampleDAO.class);
        sessionFactory.getConfiguration().getTypeHandlerRegistry().register(Date.class, ESTDateTypeHandler.class);

Use it like this:
        try (SqlSession session = sessionFactory.openSession(true)) {
            MyExampleDAO dao = session.getMapper(MyExampleDAO.class);
            
            dao.doSomething()
        }

The factory class looks like this:

package com.cvent.dropwizard.mybatis;

import io.dropwizard.setup.Environment;
import io.dropwizard.db.ManagedDataSource;
import io.dropwizard.db.DataSourceFactory;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import java.io.IOException;
import java.io.InputStream;

/**
 * A factor for creating instances of MyBatis
 *
 * @author bryan
 */
public class MyBatisFactory {
    /**
     * A string to identify this instance within ibatis framework. Only here because API requires it.
     */
    private static final String ENV_NAME = "mybatis";

    /**
     * Create an instance of MyBatis.
     *
     * @param environment The dropwizard environment
     * @param config A Mybatis config object
     * @param name The name of this mybatis factory used for metrics
     * @return An instance of MyBatis.
     * @throws ClassNotFoundException
     */
    public final SqlSessionFactory build(Environment environment,
            MyBatisConfiguration config,
            String name) throws ClassNotFoundException {
        final ManagedDataSource dataSource = config.getConfig().build(environment.metrics(), name);
        return build(environment, config, dataSource, name);
    }

    /**
     * Create an instance of MyBatis.
     *
     * @param environment The dropwizard environment
     * @param config A Mybatis config object
     * @param dataSource
     * @param name The name of this mybatis factory used for metrics
     * @return An instance of MyBatis.
     */
    public final SqlSessionFactory build(Environment environment,
            MyBatisConfiguration config,
            ManagedDataSource dataSource,
            String name) {

        SqlSessionFactory sessionFactory = null;

        // Try to use the mybatis configuration file if it is specified and exists.
        try (InputStream inputStream = Resources.getResourceAsStream(config.getConfigFile())) {
            sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException ioe) {
            // Build session factory from configuration values given in the dropwizard config.
            TransactionFactory transactionFactory = new JdbcTransactionFactory();
            org.apache.ibatis.mapping.Environment myBatisEnvironment =
                    new org.apache.ibatis.mapping.Environment(ENV_NAME, transactionFactory, dataSource);
            Configuration mybatisConfiguration = new Configuration(myBatisEnvironment);
            sessionFactory = new SqlSessionFactoryBuilder().build(mybatisConfiguration);
        }

        environment.lifecycle().manage(dataSource);
        environment.healthChecks().register(name,
                new MyBatisHealthCheck(sessionFactory, name, getValidationQuery(config.getConfig())));

        return sessionFactory;
    }

    /**
     * Create an instance of MyBatis.
     *
     * @param environment The dropwizard environment
     * @param configuration The data source factory/configuration
     * @param dataSource The datasource you want to use.
     * @param name The name of this mybatis factory used for metrics
     * @return An instance of MyBatis.
     */
    public final SqlSessionFactory build(Environment environment,
            DataSourceFactory configuration,
            ManagedDataSource dataSource,
            String name) {
        // Initialize validation query
        final String suppliedValidationQuery = configuration.getValidationQuery();
        final String validationQuery;

        //if the user uses the default health check in dropwizard, health check will fail
        //because there will be no mapper for the query.
        if (suppliedValidationQuery.equalsIgnoreCase("/* Health Check */ SELECT 1")) {
            validationQuery = "com.cvent.dropwizard.mybatis.mappers.HealthCheckMapper.healthCheck";
        } else {
            validationQuery = suppliedValidationQuery;
        }

        // Build mybatis session factory
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        org.apache.ibatis.mapping.Environment myBatisEnvironment =
                new org.apache.ibatis.mapping.Environment(ENV_NAME, transactionFactory, dataSource);
        Configuration mybatisConfiguration = new Configuration(myBatisEnvironment);
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(mybatisConfiguration);

        // Setup managed data source and health checks
        environment.lifecycle().manage(dataSource);
        environment.healthChecks().register(name, new MyBatisHealthCheck(sessionFactory, name, validationQuery));

        return sessionFactory;
    }

    /**
     * Get validation query value
     *
     * @param mybatisConfig Configuration values for mybatis
     */
    private String getValidationQuery(DataSourceFactory mybatisConfig) {

        // Initialize validation query
        final String suppliedValidationQuery = mybatisConfig.getValidationQuery();
        final String validationQuery;

        //if the user uses the default health check in dropwizard, health check will fail
        //because there will be no mapper for the query.
        if (suppliedValidationQuery.equalsIgnoreCase("/* Health Check */ SELECT 1")) {
            validationQuery = "com.cvent.dropwizard.mybatis.mappers.HealthCheckMapper.healthCheck";
        } else {
            validationQuery = suppliedValidationQuery;
        }

        return validationQuery;
    }
}


Alexandre Jacques

unread,
Feb 19, 2015, 8:33:32 PM2/19/15
to dropwiz...@googlegroups.com
Brent,

Thanks a lot. I'll take a look and try to implement it.

Regards!

Joe Ernst

unread,
Jan 26, 2017, 1:07:07 AM1/26/17
to dropwizard-user
Brent,

Did you ever end up open-sourcing your MyBatis-Dropwizard integration?  I can copy your code from here, but I'd rather get it from GitHub if you have put it there.

Brent Ryan

unread,
Jan 26, 2017, 11:30:12 AM1/26/17
to dropwizard-user
I haven't dropped it in a public repository yet.  I'll see if I can make time to push it out to our open source repository on github.

Brent Ryan

unread,
Feb 26, 2018, 6:49:48 PM2/26/18
to dropwizard-user
FYI, for those interested... This is our library we're using: https://github.com/cvent/dropwizard-mybatis


To unsubscribe from this group and all its topics, send an email to dropwizard-user+unsubscribe@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages