云自無(wú)心水自閑

          天平山上白云泉,云自無(wú)心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          與現(xiàn)在最流行的SSH相比較,Tapestry能夠完全替代其中Struts2和Spring,但是他還是需要一個(gè)ORM的框架。IBatis由于比較低的學(xué)習(xí)曲線,也受到很多人的喜愛(ài)。尤其是在IBatis3中引入了許多新的概念和想法,使用更加安全和便利。
          本文主要介紹如何將Tapestry5.1和IBatis3進(jìn)行整合。
          簡(jiǎn)要步驟:
          1. 準(zhǔn)備工作
          2. 數(shù)據(jù)庫(kù)的建立
          3. POJO的建立
          4. IBatis相關(guān)配置文件的創(chuàng)建
          5. Tapestry相關(guān)代碼的完成
          概要說(shuō)明:
          1、準(zhǔn)備工作。這一部分是比較簡(jiǎn)單的,Eclipse之類的開(kāi)發(fā)環(huán)境是必需的。Tapestry5.1、IBatis3(目前還是Beta7)、數(shù)據(jù)庫(kù)(我使用的是MySql)的下載安裝。
          2、數(shù)據(jù)庫(kù)的建立,由于是示例,所以數(shù)據(jù)庫(kù)的建立也非常簡(jiǎn)單,只有一張User表,3個(gè)字段,Id,Name,Password
          3、com.sample.User類,對(duì)應(yīng)數(shù)據(jù)庫(kù)表的3個(gè)字段,生成User類
          4、IBatis配置文件:Configuration.xml,UserMapper.xml,jdbc.properties的生成, 前兩個(gè)必需,最后一個(gè)可選.
          5、在AppModule里,使用build方法, 添加服務(wù)生成IBatis3的SqlSessionFactory, 在需要使用SqlSessionFactory的地方,使用@InjectService注入即可
          詳細(xì)說(shuō)明:
          1、大家到各自的網(wǎng)站上下載相應(yīng)的包好了。我只羅列一下我所用到的Lib:
              antlr-runtime-3.1.1.jar
              commons-codec-1.3.jar
              commons-lang-2.4.jar
              ibatis-3-core-3.0.0.216.jar
              javassist.jar
              log4j-1.2.14.jar
              mysql-connector-java-5.0.5.jar
              slf4j-api-1.5.10.jar
              slf4j-log4j12-1.5.10.jar
              stax2-api-3.0.1.jar
              tapestry-core-5.1.0.5.jar
              tapestry-ioc-5.1.0.5.jar
              tapestry5-annotations-5.1.0.5.jar
              woodstox-core-lgpl-4.0.7.jar
          2、Create Table
          DROP TABLE IF EXISTS `test`.`user`;
          CREATE TABLE  `test`.`user` (
            `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
            `name` varchar(45) NOT NULL,
            `password` varchar(45) NOT NULL,
            PRIMARY KEY (`id`)
          ) ENGINE=InnoDB;

          3、
          package com.sample.model;
          public class User {
              private long id;
              private String name;
              private String password;
              // getter and setter    ....
          }

          4、我把Configuration.xml和UserMapper.xml都放在src目錄下,這樣在部署的時(shí)候,就是生成在classes,也就是類路徑的根目錄下。
          Configuration.xml:
          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE configuration
            PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
            "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> 
          <configuration>
              <properties resource="jdbc.properties">
              </properties>
              <environments default="development">
                  <environment id="development">
                      <transactionManager type="JDBC"/>
                      <dataSource type="POOLED">
                          <property name="driver" value="${jdbc.driver}"/>
                          <property name="url" value="${jdbc.url}"/>
                          <property name="username" value="${jdbc.username}"/>
                          <property name="password" value="${jdbc.password}"/>
                          <property name="poolPingEnabled" value="${pingenable}"/>           
                          <property name="poolPingQuery" value="${pingquery}"/>           
                          <property name="poolPingConnectionsNotUsedFor" value="${pingnotusetime}"/>           
                      </dataSource>
                  </environment>
              </environments>
              <mappers>
                  <mapper resource="UserMapper.xml"/>
              </mappers>
          </configuration>


          UserMapper.xml:
          <?xml version="1.0" encoding="UTF-8" ?> 
          <!DOCTYPE mapper 
              PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" 
              "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
             
          <mapper namespace="com.sample.model.UserMapper">
              <select id="selectUser" parameterType="int" resultType="com.sample.model.User"> 
                  select * from user where id = #{id} 
              </select>
          </mapper>



          jdbc.properties:
          jdbc.driver=com.mysql.jdbc.Driver
          jdbc.url=jdbc:mysql://localhost/test?autoReconnect=true
          jdbc.username=root
          jdbc.password=root
          pingenable=true
          pingquery=SELECT 1
          pingoldertime=0
          pingnotusetime=3600000

          5、
          package com.sample.web.services;
          public class AppModule {
              public static SqlSessionFactory buildSqlSessionFactory() {
                  try {
                      String resource = "Configuration.xml";
                      Reader reader = Resources.getResourceAsReader(resource);
                      return new SqlSessionFactoryBuilder().build(reader);
                  } catch (Exception e) {
                      logger.warn("failed to build SqlSessionFactory: ", e);
                      return null;
                  }
              }

              private static Logger logger = LoggerFactory.getLogger(AppModule.class);
          }


          package com.sample.model;
          public interface UserMapper {
              public User selectUser(int id);
          }


          package com.pc.sample.web.pages;
          public class Layout {
              @InjectService("SqlSessionFactory")
              private SqlSessionFactory sqlMapper;
              public String getUserName() {
                  if ( sqlMapper == null ) {
                      return "null-mapper";
                  }
                  SqlSession session = sqlMapper.openSession();
                  try {
                      UserMapper userMapper = session.getMapper(UserMapper.class);
                      if ( userMapper == null ) {
                          return "null-userMapper";
                      }
                      User user = userMapper.selectUser(1);
                      if ( user == null ) {
                          return "null-user";
                      }
                      return user.getName();
                  } catch (Exception e) {
                      return "exception-" + e.getMessage();
                  } finally {
                      session.close();
                  }
              }
          }

          幾個(gè)注意事項(xiàng):
          1, 因?yàn)槲业腎Batis的配置文件Configuration.xml是放在類路徑的根目錄下,所以在初始化SqlSessionFactory的時(shí)候,直 接用String resource = "Configuration.xml";就行了,否則需要添加相應(yīng)的路徑,比如:把Configuration.xml與User類放在一起,也就是在 com.sample.model這個(gè)package中,那么就要寫成:String resource = "com/sample/model/Configuration.xml";
          同樣,在Configuration.xml中,指定UserMapper.xml的規(guī)則也是這樣的。
          2,UserMapper的使用。Mapper的使用是IBatis3中才有的新功能,也是IBatis用戶指南中推薦使用的方式。因?yàn)檫@樣使用的話,就完全避免了類型的強(qiáng)制轉(zhuǎn)換,實(shí)現(xiàn)了類型安全。
          需要注意的是UserMapper只是一個(gè)接口。我們不需要提供這個(gè)接口的具體實(shí)現(xiàn)。IBatis3會(huì)自動(dòng)生成一個(gè)具體的實(shí)例。

          其中的方法名必須與UserMapper.xml中的select語(yǔ)句的id一樣。在我的例子中是selectUser.
          另外,此方法的返回值的類型必須與UserMapper.xml中配置的returnType一致。
          最后要提醒的是UserMapper.xml中的namespace必須是UserMapper的全類名,在本例中就是com.sample.model.UserMapper



          評(píng)論

          # re: Tapestry最新版5.1.0.5教程(七):與IBatis3的整合  回復(fù)  更多評(píng)論   

          2010-03-03 01:32 by idreamer
          完美注入mysql-hibernate-jpa-ejb-tapestry。恩一路注入過(guò)來(lái),看來(lái)tapestry的build方法真的很好。

          # re: Tapestry最新版5.1.0.5教程(七):與IBatis3的整合  回復(fù)  更多評(píng)論   

          2010-03-04 06:20 by usherlight
          @idreamer
          Tapestry-IoC的便利的還在于其強(qiáng)大的Configuration的Contribute功能。
          這是Tapestry重做IoC容器而不是使用Spring和Juice的原因。
          主站蜘蛛池模板: 甘孜县| 莱芜市| 忻州市| 贵州省| 万盛区| 通河县| 扶余县| 仁寿县| 治多县| 鹤山市| 和政县| 正镶白旗| 扶绥县| 伊宁县| 开江县| 醴陵市| 镇雄县| 九龙县| 岑溪市| 安龙县| 南乐县| 宜城市| 庆云县| 葫芦岛市| 彰武县| 台中市| 施甸县| 黄石市| 邢台县| 五家渠市| 黔东| 常山县| 股票| 蒙阴县| 鄂温| 凉山| 曲阜市| 镇沅| 汉沽区| 乌拉特后旗| 洛扎县|