ibatis學習筆記


本節簡介:本節主要是對ibatis學習筆記的記載,通過對oracle數據庫自帶的部門表dept的CRUD來學習ibatis的使用

preparation

1.關於ibatis

ibatis是一種半自動化的ORM框架

 

2.項目環境介紹

System:WIN7 JDK:編譯1.4 開發1.5  數據庫:oracle的dept表

image

 

3.文件介紹

Dept.java  一個javabean

IDeptSV.java  一個接口,用來聲明增、刪、改、查的方法

DeptSVImpl.java 對IDeptSV接口的實現,主要包括獲得SqlMapClient對象以及方法體的實現

ShowDept.java 用來測試的方法.通過ECS插件把查詢的結果寫入到ibatis.html文件中

Dept.xml 實體和數據庫表對應的映射文件,主要是寫增、刪、改、查的sql語句

SqlMap.properties 數據庫配置文件,以鍵值對的形式聲明數據庫的driver、url、username、password

SqlMapConfig.xml  ibatis的核心配置文件,主要是引入數據庫配置文件,配置數據庫連接相關的屬性;引入實體類和數據庫表的映射文件(本次用到的只是最簡單的配置文件)

 

4.下載jar包

ibatis-2.3.4.jar ibatis的jar包

classes12.jar oracle數據庫的驅動包

ecs-1.4.2.jar ECS插件包,為了鞏固這個插件的使用故用此插件顯示查詢結果

三個jar包壓縮成了一個文件,下載路徑如下:http://files.cnblogs.com/java-pan/jar.rar

 

5.關於class&method的介紹

Reader

java.io.Reader

 

SqlMapClientBuilder

com.ibatis.sqlmap.client.SqlMapClientBuilder

 

SqlMapClient

com.ibatis.sqlmap.client.SqlMapClient

 

關於ECS插件相關類的介紹請見文章

http://www.cnblogs.com/java-pan/archive/2012/01/08/ecs.html

 

 

start

新建web project項目Ibatis,導入jar包(數據庫驅動包,ibatis包,ECS的jar包),各個文件的代碼如下:

1.Dept.java

Dept.java
 1 package ibatis;
2
3 /**
4 *Module: Dept.java
5 *Description: 使用orcle自帶的部門表dept--javabean
6 *Company:
7 *Author: ptp
8 *Date: Mar 19, 2012
9 */
10 public class Dept {
11 // 構造方法
12 public Dept() {
13
14 }
15
16 private int deptNo;
17 private String dName;
18 private String loc;
19
20 public int getDeptNo() {
21 return deptNo;
22 }
23
24 public void setDeptNo(int deptNo) {
25 this.deptNo = deptNo;
26 }
27
28 public String getDName() {
29 return dName;
30 }
31
32 public void setDName(String name) {
33 dName = name;
34 }
35
36 public String getLoc() {
37 return loc;
38 }
39
40 public void setLoc(String loc) {
41 this.loc = loc;
42 }
43 }

 

2.IDeptSV.java

IDeptSV.java
 1 package ibatis;
2
3 import java.util.List;
4
5 /**
6 *Module: IDeptSV.java
7 *Description: CRUD的接口類
8 *Company:
9 *Author: ptp
10 *Date: Mar 19, 2012
11 */
12 public interface IDeptSV {
13
14 // 添加
15 public void addDept(Dept dept);
16
17 //添加數據 主鍵自動生成
18 public void addDeptSequenct(Dept dept);
19
20 // 刪除
21 public void delByDeptNo(int deptNo);
22
23 // 查詢 所有記錄
24 public List queryDept();
25
26 // 根據條件查詢
27 public Dept queryByDeptNo(int deptNo);
28
29 //模糊查詢 按照DNAME查詢
30 public List queryByName(String dName);
31
32 // 修改
33 public void updateDept(Dept dept);
34
35 }

 

3.DeptSVImpl.java

DeptSVImpl.java
  1 package ibatis;
2
3 import java.io.IOException;
4 import java.io.Reader;
5 import java.sql.SQLException;
6 import java.util.List;
7 import com.ibatis.common.resources.Resources;
8 import com.ibatis.sqlmap.client.SqlMapClient;
9 import com.ibatis.sqlmap.client.SqlMapClientBuilder;
10 /**
11 * Module: DeptSVImpl.java
12 * Description: CRUD的實現類
13 * Company:
14 * Author: ptp
15 * Date: Mar 19, 2012
16 */
17 public class DeptSVImpl implements IDeptSV {
18 // 定義ibatis映射文件的位置
19 private static String resource = "ibatis/SqlMapConfig.xml";
20 private static SqlMapClient sqlMapClient = null;
21 static {
22 try {
23 Reader reader = Resources.getResourceAsReader(resource);
24 sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
25 reader.close();
26 // 設置為自動提交
27 // System.out.println(sqlMapClient.getDataSource().getConnection()
28 // .getAutoCommit());
29 } catch (IOException e) {
30 e.printStackTrace();
31 }
32 }
33
34 /*
35 * (non-Javadoc) 添加記錄
36 */
37 public void addDept(Dept dept) {
38 try {
39 sqlMapClient.startTransaction();// 開啟事務
40 sqlMapClient.insert("insertDept", dept);
41 sqlMapClient.commitTransaction();// 提交事務
42 System.out.println("******成功添加1條記錄******");
43 } catch (SQLException e) {
44 try {
45 sqlMapClient.getCurrentConnection().rollback();// 回滾事務
46 } catch (SQLException e1) {
47 e1.printStackTrace();
48 }
49 e.printStackTrace();
50 } finally {
51 try {
52 sqlMapClient.endTransaction();// 結束事務
53 } catch (SQLException e) {
54 e.printStackTrace();
55 }
56 }
57 }
58
59 /*
60 * (non-Javadoc) 刪除記錄 一次只刪除一條記錄
61 */
62 public void delByDeptNo(int deptNo) {
63 try {
64 sqlMapClient.startTransaction();// 開始事務
65 sqlMapClient.delete("deleteDeptById", new Integer(deptNo));
66 sqlMapClient.commitTransaction();// 提交事務
67 System.out.println("******成功刪除1條記錄******");
68 } catch (SQLException e) {
69 try {
70 sqlMapClient.getCurrentConnection().rollback();// 回滾事務
71 } catch (SQLException e1) {
72 e1.printStackTrace();
73 }
74 e.printStackTrace();
75 } finally {
76 try {
77 sqlMapClient.endTransaction();// 結束事務
78 } catch (SQLException e) {
79 e.printStackTrace();
80 }
81 }
82 }
83
84 /*
85 * (non-Javadoc) 查詢 查詢所有記錄
86 */
87 public List queryDept() {
88 List rows = null;
89 try {
90 sqlMapClient.startTransaction();// 開始事務
91 rows = sqlMapClient.queryForList("selectAllDept");
92 sqlMapClient.commitTransaction();// 提交事務
93 System.out.println("******成功查詢所有記錄******");
94 } catch (SQLException e) {
95 try {
96 sqlMapClient.getCurrentConnection().rollback();// 回滾事務
97 } catch (SQLException e1) {
98 e1.printStackTrace();
99 }
100 e.printStackTrace();
101 } finally {
102 try {
103 sqlMapClient.endTransaction();// 結束事務
104 } catch (SQLException e) {
105 e.printStackTrace();
106 }
107 }
108 return rows;
109 }
110
111 /*
112 * (non-Javadoc) 查詢 查詢一條記錄
113 */
114 public Dept queryByDeptNo(int deptNo) {
115 Dept dept = null;
116 try {
117 sqlMapClient.startTransaction();// 開始事務
118 dept = (Dept) sqlMapClient.queryForObject("selectById",
119 new Integer(deptNo));
120 sqlMapClient.commitTransaction();// 提交事務
121 System.out.println("******成功查詢1條記錄******");
122 } catch (SQLException e) {
123 try {
124 sqlMapClient.getCurrentConnection().rollback();// 回滾事務
125 } catch (SQLException e1) {
126 e1.printStackTrace();
127 }
128 e.printStackTrace();
129 } finally {
130 try {
131 sqlMapClient.endTransaction();// 結束事務
132 } catch (SQLException e) {
133 e.printStackTrace();
134 }
135 }
136 return dept;
137 }
138
139 /*
140 * (non-Javadoc) 更新 一次只更新一條記錄
141 */
142 public void updateDept(Dept dept) {
143 try {
144 sqlMapClient.startTransaction();// 開始事務
145 sqlMapClient.update("updateDeptById", dept);
146 sqlMapClient.commitTransaction();// 提交事務
147 System.out.println("******成功更新1條記錄******");
148 } catch (SQLException e) {
149 try {
150 sqlMapClient.getCurrentConnection().rollback();// 回滾事務
151 } catch (SQLException e1) {
152 e1.printStackTrace();
153 }
154 e.printStackTrace();
155 } finally {
156 try {
157 sqlMapClient.endTransaction();// 結束事務
158 } catch (SQLException e) {
159 e.printStackTrace();
160 }
161 }
162 }
163
164 /*
165 * (non-Javadoc) 模糊查詢
166 */
167 public List queryByName(String name) {
168 List depts = null;
169 try {
170 sqlMapClient.startTransaction();// 開始事務
171 depts = sqlMapClient.queryForList("selectByName", name);
172 sqlMapClient.commitTransaction();// 提交事務
173 System.out.println("******模糊查詢成功******");
174 } catch (SQLException e) {
175 try {
176 sqlMapClient.getCurrentConnection().rollback();// 回滾事務
177 } catch (SQLException e1) {
178 e1.printStackTrace();
179 }
180 e.printStackTrace();
181 } finally {
182 try {
183 sqlMapClient.endTransaction();// 結束事務
184 } catch (SQLException e) {
185 e.printStackTrace();
186 }
187 }
188 return depts;
189 }
190
191 /*
192 * (non-Javadoc)主鍵自動生成 添加記錄
193 */
194 public void addDeptSequenct(Dept dept) {
195 try {
196 sqlMapClient.startTransaction();// 開始事務
197 sqlMapClient.insert("insertDeptBySequence", dept);
198 sqlMapClient.commitTransaction();// 提交事務
199 System.out.println("******成功添加1條記錄(主鍵自動生成)******");
200 } catch (SQLException e) {
201 try {
202 sqlMapClient.getCurrentConnection().rollback();// 回滾事務
203 } catch (SQLException e1) {
204 e1.printStackTrace();
205 }
206 e.printStackTrace();
207 } finally {
208 try {
209 sqlMapClient.endTransaction();// 結束事務
210 } catch (SQLException e) {
211 e.printStackTrace();
212 }
213 }
214 }
215 }

 

4.ShowDept.java

ShowDept.java
  1 package ibatis;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.util.Iterator;
8 import java.util.List;
9 import org.apache.ecs.html.Body;
10 import org.apache.ecs.html.Html;
11 import org.apache.ecs.html.TH;
12 import org.apache.ecs.html.Table;
13 import org.apache.ecs.wml.Td;
14 import org.apache.ecs.wml.Tr;
15
16 public class ShowDept {
17 /**
18 * 用ECS.jar包顯示前台頁面
19 * @return
20 */
21 public String showEmp() {
22 IDeptSV sv = new DeptSVImpl();
23 List depts = sv.queryDept();
24 Html html = new Html();
25 Body body = new Body();
26 Table table = new Table();
27 Tr tr = new Tr();
28 Td td = new Td();
29 TH th = new TH();
30
31 /*
32 * 設置表格的樣式
33 */
34 table.setBorder(1);
35 table.setWidth("40%");
36 table.setBorder(1);
37 table.addAttribute("bordercolor", "A3DFF1");
38 table.addAttribute("cellpadding", 0);
39 table.addAttribute("cellspacing", 0);
40
41 /*
42 * 設置表格的title
43 */
44 th.addElement("序號");
45 tr.addElement(th);
46 th = new TH();
47 th.addElement("部門編號");
48 tr.addElement(th);
49 th = new TH();
50 th.addElement("部門名稱");
51 tr.addElement(th);
52 th = new TH();
53 th.addElement("部門位置");
54 tr.addElement(th);
55
56 //把第一行添加到table對象中
57 table.addElement(tr);
58
59 html.addElement(body);
60 body.addElement(table);
61
62 Iterator iterator = depts.iterator();
63 int i = 1;
64 while (iterator.hasNext()) {
65 Dept dept = new Dept();
66 dept = (Dept) iterator.next();
67 //新new一個tr對象,用來保存每一條記錄
68 tr = new Tr();
69 table.addElement(tr);
70
71 // 序號
72 td = new Td();
73 td.addElement(i + "");
74 tr.addElement(td);
75 // 部門編號
76 td = new Td();
77 int empNO = dept.getDeptNo();
78 tr.addElement(td);
79 td.addElement(empNO+"");
80 // 部門名稱
81 td = new Td();
82 String empName = dept.getDName();
83 tr.addElement(td);
84 td.addElement(empName);
85 //部門位置
86 td = new Td();
87 String job = dept.getLoc();
88 tr.addElement(td);
89 td.addElement(job);
90 i++;
91 }
92 // 把Html對象轉換為字符串輸出
93 return html.toString();
94 }
95
96 /**
97 * 向文件中寫入內容
98 * @param filepath 寫入文件的文件路徑
99 * @param write 寫入的內容
100 * @throws IOException
101 */
102 public static void writeFile(String filepath,String str) throws IOException {
103
104 // 1.使用File類找到一個文件,如果此文件不存在會新建一個
105 File file = new File(filepath);
106
107 // 2.通過子類實例化父類對象
108 OutputStream out = null;//准備好一個輸出的對象
109 //flag1=true,追加;flag1=false,覆蓋
110 out = new FileOutputStream(file, false);//實例化,flase表示默認覆蓋原來的文件
111
112 // 3.以循環的方式輸出
113 String result = str;
114 byte b[] = result.getBytes();
115 for (int i = 0; i < b.length; i++) {
116 out.write(b[i]);
117 }
118 out.close();
119 }
120
121 // 測試方法
122 public static void main(String args[]) throws IOException {
123
124 // 11.查詢獲得所有部門的信息並寫入到html文件中查看結果
125 /* String filePath = "src" + File.separator + "ibatis" + File.separator
126 + "ibatis.html";
127 String str = new ShowDept().showEmp();
128 writeFile(filePath, str);*/
129
130 // 2.根據部門編號查詢
131 /* Dept dept = new DeptSVImpl().queryByDeptNo(10);
132 if (dept != null)
133 System.out.println("根據部門編號查詢:\n" + dept.getDeptNo() + "\t"
134 + dept.getDName() + "\t" + dept.getLoc());*/
135
136 // 3.模糊查詢
137 /* List likeQuery = new DeptSVImpl().queryByName("C");
138 System.out.println(likeQuery.size());*/
139
140 // 4.插入一條記錄
141 /* Dept insert = new Dept();
142 insert.setDeptNo(50);
143 insert.setDName("Ibatis");
144 insert.setLoc("SHANGHAI");
145 new DeptSVImpl().addDept(insert);*/
146
147 // 5.主動主鍵 插入一條記錄
148 /* Dept sequenct = new Dept();
149 sequenct.setDName("SEQUENCE");
150 sequenct.setLoc("BEIJING");
151 new DeptSVImpl().addDeptSequenct(sequenct);*/
152
153 // 6.刪除一條記錄
154 /* new DeptSVImpl().delByDeptNo(50);*/
155
156 // 7.更新一條記錄
157 /* Dept update = new Dept();
158 update.setDeptNo(10);
159 update.setDName("ACCOUNTING0321");
160 update.setLoc("NEW YORK0321");
161 new DeptSVImpl().updateDept(update);*/
162 }
163 }

 

5.Dept.xml

Dept.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <!DOCTYPE sqlMap
4 PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
5 "http://ibatis.apache.org/dtd/sql-map-2.dtd">
6
7 <sqlMap>
8 <typeAlias alias="Dept" type="ibatis.Dept" />
9
10 <!-- 查詢所有記錄 -->
11 <select resultClass="Dept" id="selectAllDept">
12 select deptno,dname,loc from dept order by deptno ASC
13 </select>
14
15 <!-- 精確查詢 按照條件查詢記錄 按照部門編號DEPTNO查詢 -->
16 <select parameterClass="int" resultClass="Dept" id="selectById">
17 select deptno,dname,loc from dept where deptno=#deptNo#
18 </select>
19
20 <!-- 模糊查詢 按照部門名稱DNAME查詢,請注意模糊查詢表達式的寫法-->
21 <select resultClass="Dept" id="selectByName"
22 parameterClass="String">
23 select deptno,dname,loc from dept where dname like '%$dName$%'
24 </select>
25
26 <!-- 插入一條記錄 -->
27 <insert id="insertDept" parameterClass="Dept">
28 insert into dept (DEPTNO, DNAME, LOC) values (#deptNo#,#dName#,
29 #loc#)
30 </insert>
31
32 <!-- 主鍵生成 插入數據,主鍵采用序列自動生成 deptPKSequence為數據庫中新建的序列名稱 -->
33 <insert id="insertDeptBySequence" parameterClass="Dept">
34 <selectKey resultClass="int" keyProperty="deptNo"><!-- 此處的keyProperty指的是JavaBean中的字段名稱 -->
35 select deptPKSequence.nextVal as deptno from dual
36 </selectKey>
37 insert into dept (DEPTNO, DNAME, LOC) values (#deptNo#,#dName#,
38 #loc#)
39 </insert>
40
41
42 <!-- 刪除一條記錄 -->
43 <delete id="deleteDeptById" parameterClass="int">
44 delete from dept where deptno=#deptNo#
45 </delete>
46
47 <!-- 更新一條記錄 -->
48 <update id="updateDeptById" parameterClass="Dept">
49 update dept set DNAME=#dName#,LOC=#loc# where DEPTNO=#deptNo#
50 </update>
51
52 </sqlMap>

 

6.SqlMap.properties

SqlMap.properties
1 driver=oracle.jdbc.driver.OracleDriver
2 url=jdbc:Oracle:thin:@127.0.0.1:1521:orcl
3 username=scott
4 password=orcl

 

7.SqlMapConfig.xml

SqlMapConfig.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <!DOCTYPE sqlMapConfig
4 PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
5 "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
6
7 <sqlMapConfig>
8
9 <!-- 數據庫連接的屬性文件 -->
10 <properties resource="ibatis/SqlMap.properties" />
11 <transactionManager type="JDBC"><!-- type:定義了ibatis的事務管理器有3種,JDBC、JTA、EXTERNAL -->
12 <dataSource type="SIMPLE"><!-- type屬性指定了數據源的連接類型有3種,SIMPLE、DBCP、JNDI -->
13 <property value="${driver}" name="JDBC.Driver" />
14 <property value="${url}" name="JDBC.ConnectionURL" />
15 <property value="${username}" name="JDBC.Username" />
16 <property value="${password}" name="JDBC.Password" />
17 </dataSource>
18 </transactionManager>
19
20 <!-- 實體類和數據庫表的映射 -->
21 <sqlMap resource="ibatis/Dept.xml" />
22
23 </sqlMapConfig>

 

8.在數據庫新建一個序列deptPKSequence

-- Create sequence
create sequence DEPTPKSEQUENCE
minvalue 60
maxvalue 99
start with 70
increment by 1
nocache
order;

result

說明:ShowDept類中的main方法中分別對7個方法做了測試,測試哪個方法就放開對應的代碼,測試某一個方法時,其他的6個測試對應的代碼都要注釋掉。 1.測試查詢

查詢之前數據庫查詢如下:

image

(1)查詢所有記錄的測試 方法名:queryDept()

后台日志:

image

ibatis.html文件的內容

image

 

(2)按照部門編號deptno查詢  精確查詢 方法名:queryByDeptNo(int deptNo)

傳入部門編號10,

image

 

(3)按照部門名稱dname查詢   模糊查詢 方法名:queryByName(String name)

傳入部門名稱C,

image

在數據庫查詢如下:

image

 

2.測試添加

(1)手動寫主鍵 方法名:addDept(Dept dept)

添加之前數據庫所有記錄如下:

image

添加之后數據庫所有記錄入下:

image

后台日志:

image

 

(2)主鍵自動生成 方法名:addDeptSequenct(Dept dept)

添加之前數據庫所有記錄如下:

image

添加之后數據庫所有記錄如下:

image

后台日志

image

 

3.測試刪除

方法名:delByDeptNo(int deptNo)

傳入50

刪除之前數據庫所有記錄如下:

image

刪除之后數據庫所有記錄如下:

image

后台日志

image

 

4.測試更新

方法名:updateDept(Dept dept)

更新部門編號為10的記錄

更新之前數據庫所有記錄如下:

image

更新之后數據庫所有記錄如下:

image

后台日志

image

 

總結:

1.ibatis作為一個半自動的ORM框架,主要有以下優勢:

(1)易於學習,易於使用,上手快

(2)修改表結構、字段名稱、序列等對象后不用更改任何的java代碼,實現java代碼和sql語句的分離

(3)可以有效控制sql發送的數據,提高數據層的執行效率

 

下面是傳智播客總結出的ibatis的一些優點,我也給貼出來:
    1. ibatis把sql語句從Java源程序中獨立出來,放在單獨的XML文件中編寫,給程序維護帶來了很大便利。
    2. ibatis封裝了底層JDBC API的調用細節,並能自動將結果集轉換成Java Bean對象,大大簡化了Java數
據庫編程的重復工作。
    3. 簡單易於學習,易於使用, 非常實用。
    4. 因為Ibatis需要程序員自己去編寫sql語句,程序員可以結合數據庫自身的特點靈活控制sql語句,因
此能夠實現比hibernate等全自動orm框架更高的查詢效率,能夠完成復雜查詢。
    5. 阿里巴巴、慧點科技等多家知名軟件公司都使用Ibatis。

 

項目中暫時也沒有用到ibatis,

只是最近項目不是很忙,

就花點時間去學習一些新的知識,

有什么問題請高手指正,

也歡迎各位拍磚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM