ibatis学习(四)

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

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.测试查询

查询之前数据库查询如下:

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。











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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不讲理的胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值