Hibernate,为了DAO的ORMapping,生生把SQL的优良特性给腰斩完蛋了。比起来更喜欢MyBatis,不失SQL的灵活。
但,MyBatis怎么挂载到Struts2中呢?搜遍大江南北都是利用Spring——你们还有没有点新鲜玩意儿?说白了,就是我这个小小的项目用Sping不是杀鸡用牛刀吗,而且Sping的复杂度让人望而却步。
研究了一下发现不过是利用Sping的DI加载MyBatis模块。赵本山说了,别控制!
查了一下Struts2自带Dependency Injection别控制模块,和Google的Dependency Injection框架Guice(发音:果汁)出自同人之手。何不拿来一用涅?
关子卖光了,下面是解决方法:
1.先来个自制MyBatis的SqlSessionFactoryBuilder
public class PointSqlSessionFactoryBuilder {
private SqlSessionFactory sqlFactory;
public SqlSessionFactory getSqlFactory() {
return sqlFactory;
}
// 注入配置文件的地址
@Inject("point.resource.db")
public PointSqlSessionFactoryBuilder(String resource) throws IOException {
Reader reader = Resources.getResourceAsReader(resource);
sqlFactory = new SqlSessionFactoryBuilder().build(reader);
}
}
2.再来个自制的Action基类
public class PointActionSupport extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
// 注入已构建的SqlSessionFactoryBuilder
@Inject("SqlSessionFactoryBuilder")
private PointSqlSessionFactoryBuilder sqlFactoryBuilder;
// 打开连接
protected SqlSession openSqlSession() {
return sqlFactoryBuilder.getSqlFactory().openSession();
}
}
Struts.xml中追加注入信息:
数据库配置文件地址
单例模式配置MyBatis数据连接工厂
<constant name="point.resource.db" value="com/point/db/SQLMapConfig.xml" />
<bean
name="SqlSessionFactoryBuilder"
class="com.point.common.core.PointSqlSessionFactoryBuilder"
scope="singleton"
/>
大功告成!启动后,MyBatis模块被自动加载,可以使用Mapper啦!
总结:
1.用Struts的依赖注入模块,可以动态加载自己的Bean和常量。常看到有人问是否可以定义什么常量然后读取(比如文件上传下载的后缀等),看来是可以的。
2.@inject可以在变量,方法,构造函数上使用。满足简单的应用,没问题。
3.Struts2中Action都是线程安全的,因此本构造应该不存在线程安全问题。
4.MyBatis的SqlSession是线程不安全的,应该随取随用随丢。