1.关于ibatis
ibatis是一种半自动化的ORM框架2.项目环境介绍
System:WIN7 JDK:编译1.4 开发1.5 数据库:oracle的dept表
3.文件介绍
Dept.java 一个javabeanIDeptSV.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
5.实例
新建web project项目Ibatis,导入jar包(数据库驱动包,ibatis包,ECS的jar包),各个文件的代码如下:
1.Dept.java
package ibatis;
/**
*Module: Dept.java
*Description: 使用orcle自带的部门表dept--javabean
*Company:
*Author: ptp
*Date: Mar 19, 2012
*/
public class Dept {
// 构造方法
public Dept() {
}
private int deptNo;
private String dName;
private String loc;
public int getDeptNo() {
return deptNo;
}
public void setDeptNo(int deptNo) {
this.deptNo = deptNo;
}
public String getDName() {
return dName;
}
public void setDName(String name) {
dName = name;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
}
2.IDeptSV.java
package ibatis;
import java.util.List;
/**
*Module: IDeptSV.java
*Description: CRUD的接口类
*Company:
*Author: ptp
*Date: Mar 19, 2012
*/
public interface IDeptSV {
// 添加
public void addDept(Dept dept);
//添加数据 主键自动生成
public void addDeptSequenct(Dept dept);
// 删除
public void delByDeptNo(int deptNo);
// 查询 所有记录
public List queryDept();
// 根据条件查询
public Dept queryByDeptNo(int deptNo);
//模糊查询 按照DNAME查询
public List queryByName(String dName);
// 修改
public void updateDept(Dept dept);
}
3.DeptSVImpl.java
package ibatis;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
/**
* Module: DeptSVImpl.java
* Description: CRUD的实现类
* Company:
* Author: ptp
* Date: Mar 19, 2012
*/
public class DeptSVImpl implements IDeptSV {
// 定义ibatis映射文件的位置
private static String resource = "ibatis/SqlMapConfig.xml";
private static SqlMapClient sqlMapClient = null;
static {
try {
Reader reader = Resources.getResourceAsReader(resource);
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
// 设置为自动提交
// System.out.println(sqlMapClient.getDataSource().getConnection()
// .getAutoCommit());
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* (non-Javadoc) 添加记录
*/
public void addDept(Dept dept) {
try {
sqlMapClient.startTransaction();// 开启事务
sqlMapClient.insert("insertDept", dept);
sqlMapClient.commitTransaction();// 提交事务
System.out.println("******成功添加1条记录******");
} catch (SQLException e) {
try {
sqlMapClient.getCurrentConnection().rollback();// 回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
sqlMapClient.endTransaction();// 结束事务
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/*
* (non-Javadoc) 删除记录 一次只删除一条记录
*/
public void delByDeptNo(int deptNo) {
try {
sqlMapClient.startTransaction();// 开始事务
sqlMapClient.delete("deleteDeptById", new Integer(deptNo));
sqlMapClient.commitTransaction();// 提交事务
System.out.println("******成功删除1条记录******");
} catch (SQLException e) {
try {
sqlMapClient.getCurrentConnection().rollback();// 回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
sqlMapClient.endTransaction();// 结束事务
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/*
* (non-Javadoc) 查询 查询所有记录
*/
public List queryDept() {
List rows = null;
try {
sqlMapClient.startTransaction();// 开始事务
rows = sqlMapClient.queryForList("selectAllDept");
sqlMapClient.commitTransaction();// 提交事务
System.out.println("******成功查询所有记录******");
} catch (SQLException e) {
try {
sqlMapClient.getCurrentConnection().rollback();// 回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
sqlMapClient.endTransaction();// 结束事务
} catch (SQLException e) {
e.printStackTrace();
}
}
return rows;
}
/*
* (non-Javadoc) 查询 查询一条记录
*/
public Dept queryByDeptNo(int deptNo) {
Dept dept = null;
try {
sqlMapClient.startTransaction();// 开始事务
dept = (Dept) sqlMapClient.queryForObject("selectById",
new Integer(deptNo));
sqlMapClient.commitTransaction();// 提交事务
System.out.println("******成功查询1条记录******");
} catch (SQLException e) {
try {
sqlMapClient.getCurrentConnection().rollback();// 回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
sqlMapClient.endTransaction();// 结束事务
} catch (SQLException e) {
e.printStackTrace();
}
}
return dept;
}
/*
* (non-Javadoc) 更新 一次只更新一条记录
*/
public void updateDept(Dept dept) {
try {
sqlMapClient.startTransaction();// 开始事务
sqlMapClient.update("updateDeptById", dept);
sqlMapClient.commitTransaction();// 提交事务
System.out.println("******成功更新1条记录******");
} catch (SQLException e) {
try {
sqlMapClient.getCurrentConnection().rollback();// 回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
sqlMapClient.endTransaction();// 结束事务
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/*
* (non-Javadoc) 模糊查询
*/
public List queryByName(String name) {
List depts = null;
try {
sqlMapClient.startTransaction();// 开始事务
depts = sqlMapClient.queryForList("selectByName", name);
sqlMapClient.commitTransaction();// 提交事务
System.out.println("******模糊查询成功******");
} catch (SQLException e) {
try {
sqlMapClient.getCurrentConnection().rollback();// 回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
sqlMapClient.endTransaction();// 结束事务
} catch (SQLException e) {
e.printStackTrace();
}
}
return depts;
}
/*
* (non-Javadoc)主键自动生成 添加记录
*/
public void addDeptSequenct(Dept dept) {
try {
sqlMapClient.startTransaction();// 开始事务
sqlMapClient.insert("insertDeptBySequence", dept);
sqlMapClient.commitTransaction();// 提交事务
System.out.println("******成功添加1条记录(主键自动生成)******");
} catch (SQLException e) {
try {
sqlMapClient.getCurrentConnection().rollback();// 回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
sqlMapClient.endTransaction();// 结束事务
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4.ShowDept.java
package ibatis;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import org.apache.ecs.html.Body;
import org.apache.ecs.html.Html;
import org.apache.ecs.html.TH;
import org.apache.ecs.html.Table;
import org.apache.ecs.wml.Td;
import org.apache.ecs.wml.Tr;
public class ShowDept {
/**
* 用ECS.jar包显示前台页面
* @return
*/
public String showEmp() {
IDeptSV sv = new DeptSVImpl();
List depts = sv.queryDept();
Html html = new Html();
Body body = new Body();
Table table = new Table();
Tr tr = new Tr();
Td td = new Td();
TH th = new TH();
/*
* 设置表格的样式
*/
table.setBorder(1);
table.setWidth("40%");
table.setBorder(1);
table.addAttribute("bordercolor", "A3DFF1");
table.addAttribute("cellpadding", 0);
table.addAttribute("cellspacing", 0);
/*
* 设置表格的title
*/
th.addElement("序号");
tr.addElement(th);
th = new TH();
th.addElement("部门编号");
tr.addElement(th);
th = new TH();
th.addElement("部门名称");
tr.addElement(th);
th = new TH();
th.addElement("部门位置");
tr.addElement(th);
//把第一行添加到table对象中
table.addElement(tr);
html.addElement(body);
body.addElement(table);
Iterator iterator = depts.iterator();
int i = 1;
while (iterator.hasNext()) {
Dept dept = new Dept();
dept = (Dept) iterator.next();
//新new一个tr对象,用来保存每一条记录
tr = new Tr();
table.addElement(tr);
// 序号
td = new Td();
td.addElement(i + "");
tr.addElement(td);
// 部门编号
td = new Td();
int empNO = dept.getDeptNo();
tr.addElement(td);
td.addElement(empNO+"");
// 部门名称
td = new Td();
String empName = dept.getDName();
tr.addElement(td);
td.addElement(empName);
//部门位置
td = new Td();
String job = dept.getLoc();
tr.addElement(td);
td.addElement(job);
i++;
}
// 把Html对象转换为字符串输出
return html.toString();
}
/**
* 向文件中写入内容
* @param filepath 写入文件的文件路径
* @param write 写入的内容
* @throws IOException
*/
public static void writeFile(String filepath,String str) throws IOException {
// 1.使用File类找到一个文件,如果此文件不存在会新建一个
File file = new File(filepath);
// 2.通过子类实例化父类对象
OutputStream out = null;//准备好一个输出的对象
//flag1=true,追加;flag1=false,覆盖
out = new FileOutputStream(file, false);//实例化,flase表示默认覆盖原来的文件
// 3.以循环的方式输出
String result = str;
byte b[] = result.getBytes();
for (int i = 0; i < b.length; i++) {
out.write(b[i]);
}
out.close();
}
// 测试方法
public static void main(String args[]) throws IOException {
// 11.查询获得所有部门的信息并写入到html文件中查看结果
/* String filePath = "src" + File.separator + "ibatis" + File.separator
+ "ibatis.html";
String str = new ShowDept().showEmp();
writeFile(filePath, str);*/
// 2.根据部门编号查询
/* Dept dept = new DeptSVImpl().queryByDeptNo(10);
if (dept != null)
System.out.println("根据部门编号查询:\n" + dept.getDeptNo() + "\t"
+ dept.getDName() + "\t" + dept.getLoc());*/
// 3.模糊查询
/* List likeQuery = new DeptSVImpl().queryByName("C");
System.out.println(likeQuery.size());*/
// 4.插入一条记录
/* Dept insert = new Dept();
insert.setDeptNo(50);
insert.setDName("Ibatis");
insert.setLoc("SHANGHAI");
new DeptSVImpl().addDept(insert);*/
// 5.主动主键 插入一条记录
/* Dept sequenct = new Dept();
sequenct.setDName("SEQUENCE");
sequenct.setLoc("BEIJING");
new DeptSVImpl().addDeptSequenct(sequenct);*/
// 6.删除一条记录
/* new DeptSVImpl().delByDeptNo(50);*/
// 7.更新一条记录
/* Dept update = new Dept();
update.setDeptNo(10);
update.setDName("ACCOUNTING0321");
update.setLoc("NEW YORK0321");
new DeptSVImpl().updateDept(update);*/
}
}
5.Dept.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="Dept" type="ibatis.Dept" />
<!-- 查询所有记录 -->
<select resultClass="Dept" id="selectAllDept">
select deptno,dname,loc from dept order by deptno ASC
</select>
<!-- 精确查询 按照条件查询记录 按照部门编号DEPTNO查询 -->
<select parameterClass="int" resultClass="Dept" id="selectById">
select deptno,dname,loc from dept where deptno=#deptNo#
</select>
<!-- 模糊查询 按照部门名称DNAME查询,请注意模糊查询表达式的写法-->
<select resultClass="Dept" id="selectByName"
parameterClass="String">
select deptno,dname,loc from dept where dname like '%$dName$%'
</select>
<!-- 插入一条记录 -->
<insert id="insertDept" parameterClass="Dept">
insert into dept (DEPTNO, DNAME, LOC) values (#deptNo#,#dName#,
#loc#)
</insert>
<!-- 主键生成 插入数据,主键采用序列自动生成 deptPKSequence为数据库中新建的序列名称 -->
<insert id="insertDeptBySequence" parameterClass="Dept">
<selectKey resultClass="int" keyProperty="deptNo"><!-- 此处的keyProperty指的是JavaBean中的字段名称 -->
select deptPKSequence.nextVal as deptno from dual
</selectKey>
insert into dept (DEPTNO, DNAME, LOC) values (#deptNo#,#dName#,
#loc#)
</insert>
<!-- 删除一条记录 -->
<delete id="deleteDeptById" parameterClass="int">
delete from dept where deptno=#deptNo#
</delete>
<!-- 更新一条记录 -->
<update id="updateDeptById" parameterClass="Dept">
update dept set DNAME=#dName#,LOC=#loc# where DEPTNO=#deptNo#
</update>
</sqlMap>
6.SqlMap.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:Oracle:thin:@127.0.0.1:1521:orcl
username=scott
password=orcl
7.SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!-- 数据库连接的属性文件 -->
<properties resource="ibatis/SqlMap.properties" />
<transactionManager type="JDBC"><!-- type:定义了ibatis的事务管理器有3种,JDBC、JTA、EXTERNAL -->
<dataSource type="SIMPLE"><!-- type属性指定了数据源的连接类型有3种,SIMPLE、DBCP、JNDI -->
<property value="${driver}" name="JDBC.Driver" />
<property value="${url}" name="JDBC.ConnectionURL" />
<property value="${username}" name="JDBC.Username" />
<property value="${password}" name="JDBC.Password" />
</dataSource>
</transactionManager>
<!-- 实体类和数据库表的映射 -->
<sqlMap resource="ibatis/Dept.xml" />
</sqlMapConfig>
8.在数据库新建一个序列deptPKSequence
-- Create sequence
create sequence DEPTPKSEQUENCE
minvalue 60
maxvalue 99
start with 70
increment by 1
nocache
order;
结果视图:
说明:ShowDept类中的main方法中分别对7个方法做了测试,测试哪个方法就放开对应的代码,测试某一个方法时,其他的6个测试对应的代码都要注释掉。 1.测试查询
查询之前数据库查询如下:
(1)查询所有记录的测试 方法名:queryDept()
后台日志:
ibatis.html文件的内容
(2)按照部门编号deptno查询 精确查询 方法名:queryByDeptNo(int deptNo)
传入部门编号10,
(3)按照部门名称dname查询 模糊查询 方法名:queryByName(String name)
传入部门名称C,
在数据库查询如下:
2.测试添加
(1)手动写主键 方法名:addDept(Dept dept)
添加之前数据库所有记录如下:
添加之后数据库所有记录入下:
后台日志:
(2)主键自动生成 方法名:addDeptSequenct(Dept dept)
添加之前数据库所有记录如下:
添加之后数据库所有记录如下:
后台日志
3.测试删除
方法名:delByDeptNo(int deptNo)
传入50
删除之前数据库所有记录如下:
删除之后数据库所有记录如下:
后台日志
4.测试更新
方法名:updateDept(Dept dept)
更新部门编号为10的记录
更新之前数据库所有记录如下:
更新之后数据库所有记录如下:
后台日志
总结:
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。