iBatis 簡單介紹及基礎入門

iBATIS一詞來源於“internet”和“abatis”的組合,是一個由Clinton Begin在2002年發起的開放源代碼項目。於2010年6月16號被谷歌託管,改名爲MyBatis。是一個基於SQL映射支持Java和·NET的持久層框架。

  iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO),同時還提供一個利用這個框架開發的JPetStore實例。

相對HibernateApacheOJB等“一站式”ORM解決方案而言,ibatis 是一種“半自動化”的ORM實現。

  iBATIS 目前提供了三種語言實現的版本,包括:Java.NET以及Ruby

所謂“半自動化”,可能理解上有點生澀。縱觀目前主流的 ORM(對象關係映射),無論 Hibernate還是Apache OJB,都對數據庫結構提供了較爲完整的封裝,提供了從POJO到數據庫表的全套映射機制。程序員往往只需定義好了POJO 到數據庫表的映射關係,即可通過 Hibernate或者OJB 提供的方法完成持久層操作。程序員甚至不需要對 SQL 的熟練掌握,Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的 SQL 並調用 JDBC 接口加以執行。

  遇到以下情況不好使了:

1. 系統的部分或全部數據來自現有數據庫,處於安全考慮,只對開發團隊提供幾條Select SQL(或存儲過程)以獲取所需數據,具體的表結構不予公開。

2. 開發規範中要求,所有牽涉到業務邏輯部分的數據庫操作,必須在數據庫層由存儲過程實現(就筆者工作所面向的金融行業而言,工商銀行中國銀行交通銀行,都在開發規範中嚴格指定)

3. 系統數據處理量巨大,性能要求極爲苛刻,這往往意味着我們必須通過經過高度優化的SQL語句(或存儲過程)才能達到系統性能設計指標。

半自動化”的ibatis,卻剛好解決了這個問題。

這裏的“半自動化”,是相對Hibernate等提供了全面的數據庫封裝機制的“全自動化”ORM 實現而言,“全自動”ORM 實現了 POJO 和數據庫表之間的映射,以及 SQL 的自動生成和執行。而ibatis 的着力點,則在於POJO 與 SQL之間的映射關係。也就是說,ibatis並不會爲程序員在運行期自動生成 SQL 執行。具體的 SQL 需要程序員編寫,然後通過映配置文件,將SQL所需的參數,以及返回的結果字段映射到指定 POJO。

使用ibatis 提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的 Java對象這一層與通過 Hibernate 實現 ORM 而言基本一致,而對於具體的數據操作,Hibernate會自動生成SQL 語句,而ibatis 則要求開發者編寫具體的 SQL 語句。相對Hibernate等“全自動”ORM機制而言,ibatis 以 SQL開發的工作量大和數據庫移植性上差爲代價,爲系統設計提供了更大的自由空間。作爲“全自動”ORM實現的一種有益補充,ibatis 的出現顯得別具意義。

 

搭建iBatis 開發環境:

1 、導入相關的jar 包,ibatis-2.3.0.677.jar 、mysql-connector-java-5.1.6-bin.jar

2 、編寫配置文件:

Jdbc 連接的屬性文件

總配置文件, SqlMapConfig.xml

關於每個實體的映射文件(Map 文件)

 

Demo 

Student.java:

  1. package com.iflytek.entity;


  2. import java.sql.Date;


  3. /**

  4. * @author xudongwang 2011-12-31

  5. *

  6. * Email:[email protected]

  7. *

  8. */

  9. publicclass Student {

  10. // 注意這裏需要保證有一個無參構造方法,因爲包括Hibernate在內的映射都是使用反射的,如果沒有無參構造可能會出現問題

  11. privateint id;

  12. private String name;

  13. private Date birth;

  14. privatefloat score;


  15. publicint getId() {

  16. return id;

  17. }


  18. publicvoid setId(int id) {

  19. this.id = id;

  20. }


  21. public String getName() {

  22. return name;

  23. }


  24. publicvoid setName(String name) {

  25. this.name = name;

  26. }


  27. public Date getBirth() {

  28. return birth;

  29. }


  30. publicvoid setBirth(Date birth) {

  31. this.birth = birth;

  32. }


  33. publicfloat getScore() {

  34. return score;

  35. }


  36. publicvoid setScore(float score) {

  37. this.score = score;

  38. }


  39. @Override

  40. public String toString() {

  41. return"id=" + id + "\tname=" + name + "\tmajor=" + birth + "\tscore="

  42. + score + "\n";

  43. }


  44. }

 

 

SqlMap.properties :

  1. driver=com.mysql.jdbc.Driver

  2. url=jdbc:mysql://localhost:3306/ibatis

  3. username=root

  4. password=123

 

 

Student.xml :

  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"

  3. "http://ibatis.apache.org/dtd/sql-map-2.dtd">


  4. <sqlMap>

  5. <!-- 通過typeAlias使得我們在下面使用Student實體類的時候不需要寫包名 -->

  6. <typeAliasalias="Student"type="com.iflytek.entity.Student"/>


  7. <!-- 這樣以後改了sql,就不需要去改java代碼了 -->

  8. <!-- id表示select裏的sql語句,resultClass表示返回結果的類型 -->

  9. <selectid="selectAllStudent"resultClass="Student">

  10. select * from

  11. tbl_student

  12. </select>


  13. <!-- parameterClass表示參數的內容 -->

  14. <!-- #表示這是一個外部調用的需要傳進的參數,可以理解爲佔位符 -->

  15. <selectid="selectStudentById"parameterClass="int"resultClass="Student">

  16. select * from tbl_student where id=#id#

  17. </select>


  18. <!-- 注意這裏的resultClass類型,使用Student類型取決於queryForList還是queryForObject -->

  19. <selectid="selectStudentByName"parameterClass="String"

  20. resultClass="Student">

  21. select name,birth,score from tbl_student where name like

  22. '%$name$%'

  23. </select>


  24. <insertid="addStudent"parameterClass="Student">

  25. insert into

  26. tbl_student(name,birth,score) values

  27. (#name#,#birth#,#score#)

  28. <selectKeyresultClass="int"keyProperty="id">

  29. select @@identity as inserted

  30. <!-- 這裏需要說明一下不同的數據庫主鍵的生成,對各自的數據庫有不同的方式: -->

  31. <!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->

  32. <!-- mssql:select @@IDENTITY as value -->

  33. <!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->

  34. <!-- 還有一點需要注意的是不同的數據庫生產商生成主鍵的方式不一樣,有些是預先生成 (pre-generate)主鍵的,如Oracle和PostgreSQL。

  35. 有些是事後生成(post-generate)主鍵的,如MySQL和SQL Server 所以如果是Oracle數據庫,則需要將selectKey寫在insert之前 -->

  36. </selectKey>

  37. </insert>


  38. <deleteid="deleteStudentById"parameterClass="int">

  39. <!-- #id#裏的id可以隨意取,但是上面的insert則會有影響,因爲上面的name會從Student裏的屬性裏去查找 -->

  40. <!-- 我們也可以這樣理解,如果有#佔位符,則ibatis會調用parameterClass裏的屬性去賦值 -->

  41. delete from tbl_student where id=#id#

  42. </delete>


  43. <updateid="updateStudent"parameterClass="Student">

  44. update tbl_student set

  45. name=#name#,birth=#birth#,score=#score# where id=#id#

  46. </update>


  47. </sqlMap>

 

說明:

如果xml 中沒有ibatis 的提示,則window --> Preference--> XML-->XML Catalog---> 點擊add

選擇uri URI: 請選擇本地文件系統上

iBatisDemo1/WebContent/WEB-INF/lib/sql-map-config-2.dtd 文件;

Key Type: 選擇Schema Location;

Key: 需要聯網的,不建議使用;

 

SqlMapConfig.xml :

  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"

  3. "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">


  4. <sqlMapConfig>

  5. <!-- 引用JDBC屬性的配置文件 -->

  6. <propertiesresource="com/iflytek/entity/SqlMap.properties"/>

  7. <!-- 使用JDBC的事務管理 -->

  8. <transactionManagertype="JDBC">

  9. <!-- 數據源 -->

  10. <dataSourcetype="SIMPLE">

  11. <propertyname="JDBC.Driver"value="${driver}"/>

  12. <propertyname="JDBC.ConnectionURL"value="${url}"/>

  13. <propertyname="JDBC.Username"value="${username}"/>

  14. <propertyname="JDBC.Password"value="${password}"/>

  15. </dataSource>

  16. </transactionManager>

  17. <!-- 這裏可以寫多個實體的映射文件 -->

  18. <sqlMapresource="com/iflytek/entity/Student.xml"/>

  19. </sqlMapConfig>

 

StudentDao :

  1. package com.iflytek.dao;


  2. import java.util.List;


  3. import com.iflytek.entity.Student;


  4. /**

  5. * @author xudongwang 2011-12-31

  6. *

  7. * Email:[email protected]

  8. *

  9. */

  10. publicinterface StudentDao {


  11. /**

  12. * 添加學生信息

  13. *

  14. * @param student

  15. * 學生實體

  16. * @return 返回是否添加成功

  17. */

  18. publicboolean addStudent(Student student);


  19. /**

  20. * 根據學生id刪除學生信息

  21. *

  22. * @param id

  23. * 學生id

  24. * @return 刪除是否成功

  25. */

  26. publicboolean deleteStudentById(int id);


  27. /**

  28. * 更新學生信息

  29. *

  30. * @param student

  31. * 學生實體

  32. * @return 更新是否成功

  33. */

  34. publicboolean updateStudent(Student student);


  35. /**

  36. * 查詢全部學生信息

  37. *

  38. * @return 返回學生列表

  39. */

  40. public List<Student> selectAllStudent();


  41. /**

  42. * 根據學生姓名模糊查詢學生信息

  43. *

  44. * @param name

  45. * 學生姓名

  46. * @return 學生信息列表

  47. */

  48. public List<Student> selectStudentByName(String name);


  49. /**

  50. * 根據學生id查詢學生信息

  51. *

  52. * @param id

  53. * 學生id

  54. * @return 學生對象

  55. */

  56. public Student selectStudentById(int id);


  57. }

 

StudentDaoImpl :

  1. package com.iflytek.daoimpl;


  2. import java.io.IOException;

  3. import java.io.Reader;

  4. import java.sql.SQLException;

  5. import java.util.List;


  6. import com.ibatis.common.resources.Resources;

  7. import com.ibatis.sqlmap.client.SqlMapClient;

  8. import com.ibatis.sqlmap.client.SqlMapClientBuilder;

  9. import com.iflytek.dao.StudentDao;

  10. import com.iflytek.entity.Student;


  11. /**

  12. * @author xudongwang 2011-12-31

  13. *

  14. * Email:[email protected]

  15. *

  16. */

  17. publicclass StudentDaoImpl implements StudentDao {


  18. privatestatic SqlMapClient sqlMapClient = null;


  19. // 讀取配置文件

  20. static {

  21. try {

  22. Reader reader = Resources

  23. .getResourceAsReader("com/iflytek/entity/SqlMapConfig.xml");

  24. sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);

  25. reader.close();

  26. } catch (IOException e) {

  27. e.printStackTrace();

  28. }

  29. }


  30. publicboolean addStudent(Student student) {

  31. Object object = null;

  32. boolean flag = false;

  33. try {

  34. object = sqlMapClient.insert("addStudent", student);

  35. System.out.println("添加學生信息的返回值:" + object);

  36. } catch (SQLException e) {

  37. e.printStackTrace();

  38. }

  39. if (object != null) {

  40. flag = true;

  41. }

  42. return flag;

  43. }


  44. publicboolean deleteStudentById(int id) {

  45. boolean flag = false;

  46. Object object = null;

  47. try {

  48. object = sqlMapClient.delete("deleteStudentById", id);

  49. System.out.println("刪除學生信息的返回值:" + object + ",這裏返回的是影響的行數");

  50. } catch (SQLException e) {

  51. e.printStackTrace();

  52. }

  53. if (object != null) {

  54. flag = true;


  55. }

  56. return flag;


  57. }


  58. publicboolean updateStudent(Student student) {

  59. boolean flag = false;

  60. Object object = false;

  61. try {

  62. object = sqlMapClient.update("updateStudent", student);

  63. System.out.println("更新學生信息的返回值:" + object + ",返回影響的行數");

  64. } catch (SQLException e) {

  65. e.printStackTrace();

  66. }

  67. if (object != null) {

  68. flag = true;

  69. }

  70. return flag;

  71. }


  72. public List<Student> selectAllStudent() {

  73. List<Student> students = null;

  74. try {

  75. students = sqlMapClient.queryForList("selectAllStudent");

  76. } catch (SQLException e) {

  77. e.printStackTrace();

  78. }

  79. return students;

  80. }


  81. public List<Student> selectStudentByName(String name) {

  82. List<Student> students = null;

  83. try {

  84. students = sqlMapClient.queryForList("selectStudentByName",name);

  85. } catch (SQLException e) {

  86. e.printStackTrace();

  87. }

  88. return students;

  89. }


  90. public Student selectStudentById(int id) {

  91. Student student = null;

  92. try {

  93. student = (Student) sqlMapClient.queryForObject(

  94. "selectStudentById", id);

  95. } catch (SQLException e) {

  96. e.printStackTrace();

  97. }

  98. return student;

  99. }

  100. }

 

 

TestIbatis.java :

  1. package com.iflytek.test;


  2. import java.sql.Date;

  3. import java.util.List;


  4. import com.iflytek.daoimpl.StudentDaoImpl;

  5. import com.iflytek.entity.Student;


  6. /**

  7. * @author xudongwang 2011-12-31

  8. *

  9. * Email:[email protected]

  10. *

  11. */

  12. publicclass TestIbatis {


  13. publicstaticvoid main(String[] args) {

  14. StudentDaoImpl studentDaoImpl = new StudentDaoImpl();


  15. System.out.println("測試插入");

  16. Student addStudent = new Student();

  17. addStudent.setName("李四");

  18. addStudent.setBirth(Date.valueOf("2011-09-02"));

  19. addStudent.setScore(88);

  20. System.out.println(studentDaoImpl.addStudent(addStudent));


  21. System.out.println("測試根據id查詢");

  22. System.out.println(studentDaoImpl.selectStudentById(1));


  23. System.out.println("測試模糊查詢");

  24. List<Student> mohuLists = studentDaoImpl.selectStudentByName("李");

  25. for (Student student : mohuLists) {

  26. System.out.println(student);

  27. }


  28. System.out.println("測試查詢所有");

  29. List<Student> students = studentDaoImpl.selectAllStudent();

  30. for (Student student : students) {

  31. System.out.println(student);

  32. }


  33. System.out.println("根據id刪除學生信息");

  34. System.out.println(studentDaoImpl.deleteStudentById(1));


  35. System.out.println("測試更新學生信息");

  36. Student updateStudent = new Student();

  37. updateStudent.setId(1);

  38. updateStudent.setName("李四1");

  39. updateStudent.setBirth(Date.valueOf("2011-08-07"));

  40. updateStudent.setScore(21);

  41. System.out.println(studentDaoImpl.updateStudent(updateStudent));


  42. }

  43. }


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