/**
*
*/
package jframe.mybatis;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;
import jframe.core.plugin.annotation.InjectPlugin;
import jframe.core.plugin.annotation.Injector;
import jframe.core.plugin.annotation.Start;
import jframe.core.plugin.annotation.Stop;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>
* three parameters in config.properties:
* <li>file.mybatis</li>
* <li>mybatis.id</li>
* <li>file.mybatis.charset (optional,utf-8 is default)</li>
* </p>
*
* @author dzh
* @date Jul 17, 2015 1:57:11 PM
* @since 1.0
*/
@Injector
public class MultiMybatisServiceImpl implements MultiMybatisService {
static Logger LOG = LoggerFactory.getLogger(MultiMybatisServiceImpl.class);
/**
* mybatis config
*/
static String FILE_MYBATIS = "file.mybatis";
/**
* mybatis config file charset
*/
static String MYBATIS_CHARSET = "file.mybatis.charset";
/**
* start using mybatis's environments, or else not be used
*/
static String MYBATIS_ID = "mybatis.id";
static String FILE_CHARSET = "utf-8";
@InjectPlugin
static MybatisPlugin plugin;
Map<String, SqlSessionFactory> fac;
@Start
void start() {
String[] envs = plugin.getConfig(MYBATIS_ID, "").split("\\s+");
if (envs.length == 0) {
LOG.error("mybatis.id is empty, must define a enviroment id at least.");
return;
}
File mcFile = new File(plugin.getConfig(FILE_MYBATIS, ""));
if (!mcFile.exists()) {
LOG.error("Not found mybatis-config, {}" + mcFile.getAbsolutePath());
return;
}
FILE_CHARSET = plugin.getConfig(MYBATIS_CHARSET, "utf-8");
Resources.setDefaultClassLoader(plugin.getPluginClassLoader());
fac = new HashMap<String, SqlSessionFactory>(envs.length, 1);
for (String id : envs) {
SqlSessionFactory factory = loadFactory(id);
if (factory == null) { // TODO
LOG.error("Not found SqlSessionFactory id -> {}", id);
}
fac.put(id, factory);
}
LOG.info("MultiMybatisServiceImpl start successfully!");
}
@Stop
void Stop() {
LOG.info("MybatisServiceImpl stop successfully!");
}
/**
*
*/
@Override
public SqlSessionFactory getSqlSessionFactory(String id) {
SqlSessionFactory ssf = fac.get(id);
if (ssf == null)
LOG.error("Not found SqlSessionFactory id -> {}", id);
return ssf;
}
private SqlSessionFactory loadFactory(String id) {
File mcFile = new File(plugin.getConfig(FILE_MYBATIS));
Reader mybatis = null;
try {
mybatis = new InputStreamReader(new FileInputStream(mcFile));
return new SqlSessionFactoryBuilder().build(mybatis, id);
} catch (Exception e) {
LOG.error(e.getMessage());
} finally {
if (mybatis != null)
try {
mybatis.close();
} catch (IOException e) {
}
}
return null;
}
}