国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Ibatis的學習筆記

2019-11-18 16:12:30
字體:
來源:轉載
供稿:網友

  現在最如日中天的是Hibernate,但老朽學了一下,然后就沒有再學下去,原因簡單,因為設計思路不同。以前做的系統全是在設計完成后,數據庫先行,并且有大量的主從表以及存儲過程,觸發器以及函數等內容,這是由于需要充分利用DBMS本身的優化設計以提高性能和使用的便利,這點Hibernate是無法體會得到的。

另外,這種設計思想對于熟悉SQL的人來講并感覺不到太大的方便之處,除了不用再在編寫增修刪等的工作上進行重復勞動,而HQL更是有點過分的感覺。

當然,老朽對Hibernate了解不多,所以可能其沒非如此弱也不一定,但已經不想再花時間來更深入的了解一下了,這個時間可以設計一個新的ORM,差不多吧?差多了,呵呵。

其優點在于:

  1. 由面向表格轉為面向對象,其實這樣說有偏頗之處,表格如果是按基本的設計方式來的話,大部分是實體的數據表現,其本身就是對象,雖然是基于關系數據庫的表現。

  2. 隱藏了SQL,就是將對數據庫系統的直接操作隱藏了起來,好處是使不諳數據庫的開發人員可以不用再學,而直接使用某語言的方式就可以做,壞處是,這樣使得數據庫本身只是成為了數據存儲器,而其本身的好處再也體現不出來了。

好象上面說的不是優點,不過第一句話是優點的,確實是,但其后面卻有幾個概念和應用上的誤解,目前對很多初入門的同學影響很大,唉,計算器應用的技術又豈是一語可蓋之的,因為應用是世界一種在基礎層面之上一個層面的表現方式,故亦如世界本身一樣,包羅萬象也。

好久以前,大約一年多了吧,知道有個ibatis這樣一個東西,卻一直沒有看一下,只是由朋友和一些簡要的文檔那里知道一些特性,就是它是由自己定義SQL來的,沒有完全封裝,所以提供了更大的自由度和擴展性,于是,也就不如Hibernate來的徹底和方便。

應用學習者,由實例入門也,此方為正途,省時又易上手。

于是編一個小小的例子,只對一個單表進行基本操作,感覺還行,例程寫法,后面再一步步的來列出來,兼之批評一下,有一些文章對例程往往語焉不詳,特別在當前配置文件大行其道的時候,對配置文件的位置竟然不講,而且一文中,文件名始與終不統一,頗有些始亂終棄的感覺,嘿嘿,此詞用得可能不好,卻是最好的寫照,此類文章是浪費時間的最好去處,讀到最后,按例程走的結果是失敗,真是賠了時間又走錯路。

好了,在做完該小例后,開始亂想,主要有幾個方面:

  1. 主從表的處理
  2. 存儲過程的處理
  3. 不規則查詢的處理
  4. 編寫工具程序的實現

最近可能是由于更多傾向于IDE的設計,所以對第四條想得比較多些,對于主從表的處理,老朽一直沒有想到一個比較好的處理方法,特別對于數據新增和修改的準確性上面,很是有點頭痛。

主從表的問題,主要是體現在對主從表同時新增和修改的情況,從表數據的準確性驗證比較復雜。事務在這里并不是萬能的,所以這里應該更多的考慮在數據庫之前的驗證準確性應該是解決問題的核心所在吧。

編寫工具程序,想了一下,對ibatis如果要進行編寫并不是一個簡單的事情,因為里面客制化的內容比較多,想了一下,就決定不想了。

最近更在考慮一個元對象的問題,就是將類的屬性本身實際上也是一個對象,那么這個類別的類的設計,其實也就是一種元數據了,這樣可以對類的屬性進行統一,從而可以在應用層處理上提供更大的方便,比如輸入界面,可以通過程序直接動態拉出來等等吧。

參考文檔:
  1. iBATIS Database Layer開發指南
    Clinton Begin 著 劉濤譯 www.ibatis.com

------------------------------------------------------------------------

附:ibatis例程(注:該例來自于參考文檔,改正了其中的部分錯誤)

1.  構造環境

1.1.  建立PRoject目錄結構,這一部分很簡單,老朽用eclipse,目錄結構如下:

Ibatis的學習筆記(圖一)

1.2.  將相關的類庫包文件復制至ibatis目錄下面,并加入到該工程的build path,就是加入classpath:

Ibatis的學習筆記(圖二)

如此,工程的基本環境構建完成。

2.  建立數據表并設置數據源(注:在這里,為了方便,使用了橋接方式)

2.1.  建立數據表,SQL如下,老朽用的是SQLServer,無他,只因機器上有。

CREATE TABLE PERSON (
  PER_ID numeric(5, 0) NOT NULL ,
  PER_FIRST_NAME varchar (40) NOT NULL ,
  PER_LAST_NAME varchar (40) NOT NULL ,
  PER_BIRTH_DATE datetime NULL ,
  PER_WEIGHT_KG numeric(4, 2) NOT NULL ,
  PER_HEIGHT_M numeric(4, 2) NOT NULL ,
  PRIMARY KEY (PER_ID)
)

2.2.  建立數據源,并指向Person表所在的數據庫

Ibatis的學習筆記(圖三)

3.  編寫例程代碼,在這里,只是建立對Person表的基本操作代碼,如新增,修改和刪除而已。

3.1.  Person.java 這是基本類,該類就是提供一個基本結構

package examples.domain;
import java.util.Date;
public class Person{
  private int id; // PER_ID
  private String firstName; // PER_FIRST_NAME
  private String lastName; // PER_LAST_NAME
  private Date birthDate; // PER_BIRTH_DATE
  private double weightInKilograms; // PER_WEIGHT_KG
  private double heightInMeters; // PER_HEIGHT_M

  public Person(){} 
    public String toString(){
    return "[" + id + "" + firstName + "" +
      lastName + "" + birthDate + "" + weightInKilograms +
      "" + heightInMeters + "]";
  }
  public Date getBirthDate(){ return birthDate; }
  public void setBirthDate(Date birthDate){ this.birthDate = birthDate; }
  public String getFirstName(){ return firstName; }
  public void setFirstName(String firstName){ this.firstName = firstName; }
  public double getHeightInMeters(){ return heightInMeters; }
  public void setHeightInMeters(double heightInMeters){
    this.heightInMeters = heightInMeters;
  }
  public int getId(){ return id; }
  public void setId(int id){ this.id = id; }
  public String getLastName(){ return lastName; }
  public void setLastName(String lastName){ this.lastName = lastName; }
  public double getWeightInKilograms(){ return weightInKilograms; }
  public void setWeightInKilograms(double weightInKilograms){
    this.weightInKilograms = weightInKilograms;
  }
}

3.2.  Person.xml SQL映射文件,這個就是將SQL語句與ibatis的數據操作方法相映像的文件


  "http://www.ibatis.com/dtd/sql-map.dtd">

 
    SELECT PER_ID as id,
    PER_FIRST_NAME as firstName,
    PER_LAST_NAME as lastName,
    PER_BIRTH_DATE as birthDate,
    PER_WEIGHT_KG as weightInKilograms,
    PER_HEIGHT_M as heightInMeters
  FROM PERSON
  WHERE PER_ID = #value#
  ]]>
 
 
 
    INSERT INTO PERSON(
    PER_ID,
    PER_FIRST_NAME,
    PER_LAST_NAME,
    PER_BIRTH_DATE,
    PER_WEIGHT_KG,
    PER_HEIGHT_M)
  VALUES (
    #id#,
    #firstName#,
    #lastName#,
    #birthDate#,
    #weightInKilograms#,
    #heightInMeters#
  )
  ]]>
 

 
    UPDATE PERSON SET
    PER_FIRST_NAME = #firstName#,
    PER_LAST_NAME = #lastName#,
    PER_BIRTH_DATE = #birthDate#,
    PER_WEIGHT_KG = #weightInKilograms#,
    PER_HEIGHT_M = #heightInMeters#
  WHERE PER_ID = #id#
  ]]>
 
 
 
  DELETE PERSON WHERE PER_ID = #id#
 



3.3.  SqlMapConfigExample.properties 數據庫連接屬性文件

driver=sun.jdbc.odbc.JdbcOdbcDriver
url=jdbc:odbc:test
username=sa
passWord=123456

3.4.  SqlMapConfigExample.xml ibatis基本配置文件,核心配置文件


  "http://www.ibatis.com/dtd/sql-map-config.dtd">

      resource="examples/sqlmap/maps/SqlMapConfigExample.properties" />
      maxTransactions="10" statementCacheSize="75" useGlobalTransactions="false" />
      factory-class="com.ibatis.db.sqlmap.datasource.DbcpDataSourceFactory">
 
 
 
 
 
 
 
 


 


3.5.  MyAppSqlConfig.java 調用及測試程序

package example.application;
import java.io.Reader;
import java.util.Date;
import com.ibatis.common.resources.Resources;
import com.ibatis.db.sqlmap.SqlMap;
import com.ibatis.db.sqlmap.XmlSqlMapBuilder;
import examples.domain.Person;
public class MyAppSqlConfig{
  private static final SqlMap  sqlMap;
  static{
    try{
      String resource = "SqlMapConfigExample.xml";
      Reader reader = Resources.getResourceAsReader(resource);
      sqlMap = XmlSqlMapBuilder.buildSqlMap(reader);
    }catch(Exception e){
      e.printStackTrace();
      throw new RuntimeException("Error initializing: " + e);
    }
  }

  public static SqlMap getSqlMapInstance(){ return sqlMap; }

  public static void main(String[] args){
    SqlMap sqlMap = MyAppSqlConfig.getSqlMapInstance();
    Integer id = new Integer(2);
    try{
      // Select
      Person person =
      (Person)sqlMap.executeQueryForObject("getPerson", id);
      System.out.println("....person=" + person);
   
      // Update
      person.setId(3);
      person.setFirstName("Deny");
      person.setLastName("Liu");
      person.setBirthDate(new Date());
      person.setHeightInMeters(1.83);
      person.setWeightInKilograms(86.36);
      System.out.println("....update=" +
        sqlMap.executeUpdate("updatePerson", person));
   
      // Delete
      person.setId(1);
      System.out.println("....delete=" +
        sqlMap.executeUpdate("deletePerson", person));
   
      // Create
      Person newPerson = new Person();
      newPerson.setId(1);
      newPerson.setFirstName("Clinton");
      newPerson.setLastName("Begin");
      newPerson.setBirthDate(new Date());
      newPerson.setHeightInMeters(1.83);
      newPerson.setWeightInKilograms(86.36);
      System.out.println("....insert=" +
        sqlMap.executeUpdate ("insertPerson", newPerson));
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

在這個簡單的例程中,數據庫連接池使用了DBCP,是apache的東東,具體也沒有研究過,呵呵,雖然現在的數據庫連接池種類繁多,但大多都走得太遠了,在一個連接池的包里面恨不得將整個SQL的操作全包進來,弄得不倫不類,又大又不方便,而且還用不起來,唉

好啦,沒用的不說了,全部完成后的工程樣子長得像下面這樣:

Ibatis的學習筆記(圖四)

運行MyAppSqlConfig.java的結果嘛,哦,還要先在Person表里面加三筆測試數據,然后再運行,否則會出異常,然后就可以看得到通過ibatis對數據表的操作結果了,就是下個SQL看一下嘛,嘿嘿,人老啦,總是會忘事兒

(出處:http://www.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 富锦市| 迭部县| 威海市| 许昌县| 亳州市| 天全县| 工布江达县| 茂名市| 铅山县| 文昌市| 保靖县| 县级市| 额敏县| 团风县| 双牌县| 南陵县| 华池县| 确山县| 临江市| 庆城县| 阜新市| 庄河市| 葫芦岛市| 河北区| 鸡泽县| 呈贡县| 夹江县| 临邑县| 南投县| 晴隆县| 古田县| 灵川县| 兰坪| 康平县| 巩义市| 利川市| 剑川县| 大港区| 沙雅县| 石嘴山市| 高淳县|