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是線程不安全的,應該隨取隨用隨丟。