项目已经做完一段时间了,蓦然回首中,发现项目在开发模块化方面做的很好,包括对ibatis的sqlMap以及它的映射文件全部进行了模块化开发,看起来一目了然,自然清新,和大家分享一下。
前言:
首先需要把sqlMap文件全部独立出来,怎么样既与DAO相连,也能够看着是独立于Java代码之外的呢。我们需要建立一个source folder,命名为sqlmap,只要sqlMapConfig配置文件、映射文件的包名和Java代码的DAO的包名保持一致就OK,就能够操作同一个包一样,虽然它们处于不同的sourcefolder里面。【结构截图见附件】
一般的话,大家可能都会只写一个sqlMapConfig配置文件,把所有的映射文件全部都放它里面,如果项目大的话,会有多少映射文件啊,效果当然不好。这样,我们也需要把sqlMapConfig进行模块化,如:sqlMapConfig-XXX.xml,那么怎么调用它,接下来就是见证奇迹的时刻....
过程:
建立一个静态的sqlMapClientManager类,对sqlMapClient和sqlMapConfig-XXX.xml进行管理,废话说完,贴上简短代码,大家就清楚了。
private static Hashtable<String,SqlMapClient> sqlMapClients = new Hashtable<String,SqlMapClient>();
/**
* 获取对应数据库的SqlMapClient
* 前提:有对应数据库的sqlMapConfig,命名规则为:sqlMapConfig-模块名.xml
* @param dbName 模块名
* @return 异常时返回null
*/
public static SqlMapClient getSqlMapClient(String dbName){
SqlMapClient sqlMap = sqlMapClients.get(dbName);
if(sqlMap==null){
sqlMap = buildSqlMapClient(dbName);
if(sqlMap!=null){
sqlMapClients.put(dbName, sqlMap);
}
}
return sqlMap;
}
/**
* 构建SqlMapClient
* @param dbName 模块名
* @return
* @throws IOException
*/
private static SqlMapClient buildSqlMapClient(String dbName){
SqlMapClient sqlMap = null;
try{
String resource ="com/test/common/dao/sql/sqlMapConfig-"+dbName+".xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
}catch(Exception e){
log.error(e);
}
return sqlMap;
}
我们可以根据sqlMapClientManager的getSqlMapClient(String dbName)方法获取不同模块的SqlMapClient,然后在DAO中进行增删查改。如:
//根据模块名获取sqlMapClient对数据库操作
SqlMapClient sqlMapClient = SqlMapClientManager.getSqlMapClient("web");
try {
list=(ArrayList<CityBean>)sqlMapClient.queryForList("Base_City.get",null);
}catch(Exception e){}