1.关于ibatis

ibatis是一种半自动化的ORM框架

2.项目环境介绍

System:WIN7 JDK:编译1.4 开发1.5 数据库:oracle的dept表

[置顶]          ibatis学习(四)_String

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

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

[置顶]          ibatis学习(四)_测试_02

(1)查询所有记录的测试 方法名:queryDept()

后台日志:

[置顶]          ibatis学习(四)_iBATIS_03

ibatis.html文件的内容

[置顶]          ibatis学习(四)_测试_04

 

(2)按照部门编号deptno查询  精确查询 方法名:queryByDeptNo(int deptNo)

传入部门编号10,

[置顶]          ibatis学习(四)_String_05

 

(3)按照部门名称dname查询   模糊查询 方法名:queryByName(String name)

传入部门名称C,

[置顶]          ibatis学习(四)_数据库_06

在数据库查询如下:

[置顶]          ibatis学习(四)_测试_07

 

2.测试添加

(1)手动写主键 方法名:addDept(Dept dept)

添加之前数据库所有记录如下:

[置顶]          ibatis学习(四)_测试_08

添加之后数据库所有记录入下:

[置顶]          ibatis学习(四)_String_09

后台日志:

[置顶]          ibatis学习(四)_数据库_10

 

(2)主键自动生成 方法名:addDeptSequenct(Dept dept)

添加之前数据库所有记录如下:

[置顶]          ibatis学习(四)_测试_11

添加之后数据库所有记录如下:

[置顶]          ibatis学习(四)_事务_12

后台日志

[置顶]          ibatis学习(四)_测试_13

 

3.测试删除

方法名:delByDeptNo(int deptNo)

传入50

删除之前数据库所有记录如下:

[置顶]          ibatis学习(四)_iBATIS_14

删除之后数据库所有记录如下:

[置顶]          ibatis学习(四)_iBATIS_15

后台日志

[置顶]          ibatis学习(四)_String_16

 

4.测试更新

方法名:updateDept(Dept dept)

更新部门编号为10的记录

更新之前数据库所有记录如下:

[置顶]          ibatis学习(四)_iBATIS_17

更新之后数据库所有记录如下:

[置顶]          ibatis学习(四)_数据库_18

后台日志

[置顶]          ibatis学习(四)_iBATIS_19

 

总结:

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。