就不用Spring,Struts2掛載MyBatis

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章