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,

只是最近项目不是很忙,

就花点时间去学习一些新的知识,

有什么问题请高手指正,

也欢迎各位拍砖。

转载于:https://www.cnblogs.com/java-pan/archive/2012/03/21/ibatis.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值