Getting started
MyBatis-Guice helps you integrate your MyBatis code seamlessly with
Google Guice. Using the classes in this library, Google Guice will load
the necessary MyBatis classes for you. This library also provides
an easy way to inject MyBatis data mappers and SqlSessions
into your application beans.
Finally, MyBatis-Guice will let you demarcate transactions declaratively
so you won't need to commit/rollback/close them by hand.
Installation
Installing the mybatis-guice module it is very easy, just put the
mybatis-guice-4.0.1-SNAPSHOT.jar
and
dependencies in the classpath!
Apache Maven users instead can easily adding the following dependency in their POMs :
<dependencies>
...
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-guice</artifactId>
<version>4.0.1-SNAPSHOT</version>
</dependency>
...
</dependencies>
Quick Setup
To use MyBatis with Guice you need to set up a MyBatisModule
,
with a DataSource
at least one data mapper class and
a transactional bean to be injected with the mapper.
To setup a DataSource
you can simply use the JdbcHelper
(please see the
related appendix for more informations) module to build the URL needed for your database and provide the
connection properties:
Properties myBatisProperties = new Properties();
myBatisProperties.setProperty("mybatis.environment.id", "test");
myBatisProperties.setProperty("JDBC.schema", "mybatis-guice_TEST");
myBatisProperties.setProperty("derby.create", "true");
myBatisProperties.setProperty("JDBC.username", "sa");
myBatisProperties.setProperty("JDBC.password", "");
myBatisProperties.setProperty("JDBC.autoCommit", "false");
Injector injector = Guice.createInjector(
JdbcHelper.HSQLDB_Embedded,
new Module() {
public void configure(Binder binder) {
Names.bindProperties(binder, myBatisProperties);
}
}
);
Assume you have a data mapper class defined like the following:
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{userId}")
User getUser(@Param("userId") String userId);
}
Note that the mapper class specified must be an
interface, not an actual implementation class. In this example,
annotations are used to specify the SQL, but a MyBatis mapper XML file
could also be used.
Assume you also have a transactional service bean that uses your mapper:
public class FooServiceMapperImpl implements FooService {
@Inject
private UserMapper userMapper;
@Transactional
public User doSomeBusinessStuff(String userId) {
return this.userMapper.getUser(userId);
}
}
Setup a MyBatisModule
, add your mapper to it and bind also
your transactional service interface FooService
to its implementation.
public interface UserMapper {
...
Injector injector = Guice.createInjector(
new MyBatisModule() {
@Override
protected void initialize() {
install(JdbcHelper.HSQLDB_Embedded);
bindDataSourceProviderType(PooledDataSourceProvider.class);
bindTransactionFactoryType(JdbcTransactionFactory.class);
addMapperClass(UserMapper.class);
Names.bindProperties(binder(), createTestProperties());
bind(FooService.class).to(FooServiceMapperImpl.class);
}
}
);
This is all you need, you can now get an instance of your service. It will be automatically injected with the MyBatis mapper. With the mapper calling MyBatis data methods is only one line of code. Besides, all operations will be transactional, that means that you will not need to commit or rollback any connection.
FooService fooService = this.injector.getInstance(FooService.class);
fooService.doSomeBusinessStuff("data");