在项目使用mybatis-guice

正文

如果你项目中使用的Spring 可能会用其中的ioc来配置mybatis。但是我们也可以选择官方出品的mybatis-guice 来使用ioc

使用maven配置依赖

<dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-guice</artifactId>
        <version>3.8</version>
    </dependency>
    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>4.1.0</version>
    </dependency>

然后我们需要建立一个mybatisModule

官方有许多建立module的方法,这里我们使用 XMLMyBatisModule

代码如下

import com.google.inject.Guice;
import com.google.inject.Injector;
import org.mybatis.guice.XMLMyBatisModule;

public class Init {
private static Injector injector;
static {

    injector = Guice.createInjector(new XMLMyBatisModule() {
       @Override
       protected void initialize() {
           setEnvironmentId("dev");
           setClassPathResource("mybatis.cfg.xml");

       }
   });

}

public static Injector getInjector() {
    return injector;
}

}

假设你有个类调用了mapper 我们可以在类的进行注入,代码如下

import api.xxx.mapper.PersonMapper;
import api.xxx.model.Person;
import api.xxx.model.PersonExample;
import com.google.inject.Inject;

public class PersonService {
@Inject
private PersonMapper mapper;

public boolean modifyInfo(Person person, String talentNo) {
    PersonExample example = new PersonExample();
    example.createCriteria().andTalentNoEqualTo(talentNo);

    int result = mapper.updateByExampleSelective(person, example);
    return 1 == result;


}

}

调用代码 :

PersonService personService = Init.getInjector().getInstance(PersonService.class);

 

问答

问题1:我们的sqlSession 在哪里??

答:程序会自动调用 SqlSessionManager.openSession(ExecutorType execType) 其中ExecutorType 为SIMPLE。

@Override

public SqlSession openSession(ExecutorType execType) {
return sqlSessionFactory.openSession(execType);
}

问题2:sqlSession会关闭吗

答:程序在方法调用后会自动关闭session,调用SqlSessionManager.close()

 @Override
  public void close() {
    final SqlSession sqlSession = localSqlSession.get();
    if (sqlSession == null) {
      throw new SqlSessionException("Error:  Cannot close.  No managed session is started.");
    }
    try {
      sqlSession.close();
    } finally {
      localSqlSession.set(null);
    }
  }


问题3:怎么定义方法调用的sqlSession参数

答:通过@Transactional 可以定义sqlSession的参数。

 

 

官方教程

mybatis-guice:http://www.mybatis.org/guice/