System:WIN7 JDK:编译1.4 开发1.5 数据库:oracle的dept表
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
新建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=orcl7.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
结果视图:
说明: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。