iBatis 入门实例教程



iBatis 入门实例教程。

iBatis 简介:

iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。

官网为:http://www.mybatis.org/

 

今天学习下ibatis ,要学习他,首先需要搭建ibatis需要的环境

1.导入相关的jar包

2.编写配置文件

jdbc连接的属性文件

总配置文件,SqlMapConfig.xml

关于每个实体的映射文件(Map文件)

 

下面是我学习时做的Demo:

Emp.java

  1. package com.ibatis.entity;
  2. import java.util.Date;
  3. public class Emp {
  4.     //变量的名字必须和数据库的字段名一致,否则会映射不出来
  5.     private int empno;
  6.     private String ename;
  7.     private String job;
  8.     private Integer mgr;
  9.     private Date hiredate;
  10.     private int sal;
  11.     private int comm;
  12.     private int deptno;
  13.     public int getEmpno() {
  14.         return empno;
  15.     }
  16.     public void setEmpno(int empno) {
  17.         this.empno = empno;
  18.     }
  19.     public String getEname() {
  20.         return ename;
  21.     }
  22.     public void setEname(String ename) {
  23.         this.ename = ename;
  24.     }
  25.     public String getJob() {
  26.         return job;
  27.     }
  28.     public void setJob(String job) {
  29.         this.job = job;
  30.     }
  31.     public Integer getMgr() {
  32.         return mgr;
  33.     }
  34.     public void setMgr(Integer mgr) {
  35.         this.mgr = mgr;
  36.     }
  37.     public Date getHiredate() {
  38.         return hiredate;
  39.     }
  40.     public void setHiredate(Date hiredate) {
  41.         this.hiredate = hiredate;
  42.     }
  43.     public int getSal() {
  44.         return sal;
  45.     }
  46.     public void setSal(int sal) {
  47.         this.sal = sal;
  48.     }
  49.     public int getComm() {
  50.         return comm;
  51.     }
  52.     public void setComm(int comm) {
  53.         this.comm = comm;
  54.     }
  55.     public int getDeptno() {
  56.         return deptno;
  57.     }
  58.     public void setDeptno(int deptno) {
  59.         this.deptno = deptno;
  60.     }
  61. @Override
  62. public String toString() {
  63.     return “empno=”+empno
  64.             +”\tname=”+ename
  65.             +”\tjob=”+job
  66.             +”\tmgr=”+mgr
  67.             +”\thiredate=”+hiredate;
  68. }
  69. }

SqlMap.properties

  1. driver=oracle.jdbc.driver.OracleDriver
  2. url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
  3. username=scott
  4. password=yulei123

 

Emp.xml

  1. <?xml version=”1.0″ encoding=”UTF-8″ ?>
  2. <!DOCTYPE sqlMap PUBLIC “-//ibatis.apache.org//DTD SQL Map 2.0//EN”
  3.    “http://ibatis.apache.org/dtd/sql-map-2.dtd”>
  4. <sqlMap>
  5.       <typeAlias alias=”Emp” type=”com.ibatis.entity.Emp”/>
  6.       <!– id表示select里的sql语句,resultClass表示返回结果的类型 –>
  7.       <select id=”selectAllEmp” resultClass=”Emp”>
  8.          select * from emp
  9.       </select>
  10.        <!– parameterClass表示参数的内容 –>
  11.        <!– #表示这是一个外部调用的需要传进的参数,可以理解为占位符 –>
  12.        <select id=”selectEmpById” parameterClass=”int” resultClass=”Emp”>
  13.          select * from emp
  14.               where empno=#empno#
  15.        </select>
  16.       <!– 不使用主键的方式 –>
  17.       <insert id=”addEmp” parameterClass=”Emp”>
  18.             insert into
  19.               emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
  20.               values(#empno#,#ename#,#job#,#mgr#,#hiredate#,#sal#,#comm#,#deptno#)
  21.       </insert>
  22.       <delete id=”deleteEmpbyId” parameterClass=”int”>
  23.        <!– #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的ename会从Emp里的属性里去查找 –>
  24.        <!– 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 –>
  25.          delete from emp where empno=#id#
  26.       </delete>
  27.       <update id=”updateEmpById” parameterClass=”Emp”>
  28.             update emp
  29.              set ename=#ename#
  30.             where empno=#empno#
  31.       </update>
  32.       <!– 模糊查询没有使用#,而使用了$符号 –>
  33.       <select id=”selectEmpByEname” parameterClass=”String” resultClass=”Emp”>
  34.           select empno,ename,sal,hiredate
  35.             from emp
  36.             where ename like ‘%$ename$%’
  37.       </select>
  38.       <!– 主键插入方式 –>
  39.       <insert id=”insertEmp” parameterClass=”Emp”>
  40.       <!– 对于Oracle 需要将selectKey放在insert前面 –>
  41.       <selectKey resultClass=”int” keyProperty=”empno”>
  42.             select empPkempno.Nextval as empno
  43.              from dual
  44.       </selectKey>
  45.           insert into
  46.               emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
  47.               values(#empno#,#ename#,#job#,#mgr#,#hiredate#,#sal#,#comm#,#deptno#)
  48.       </insert>
  49. </sqlMap>


SqlMapConfig.xml

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <!DOCTYPE sqlMapConfig PUBLIC “-//ibatis.apache.org//DTD SQL Map Config 2.0//EN”
  3.     “http://ibatis.apache.org/dtd/sql-map-config-2.dtd”>
  4. <sqlMapConfig>
  5.     <!– 引用JDBC属性的配置文件 –>
  6.     <properties resource=”com/ibatis/SqlMap.properties” />
  7.     <!– 使用JDBC的事务管理 –>
  8.     <transactionManager type=”JDBC”>
  9.         <!– 数据源 –>
  10.         <dataSource type=”SIMPLE”>
  11.             <property name=”JDBC.Driver” value=”${driver}” />
  12.             <property name=”JDBC.ConnectionURL” value=”${url}” />
  13.             <property name=”JDBC.Username” value=”${username}” />
  14.             <property name=”JDBC.Password” value=”${password}” />
  15.         </dataSource>
  16.     </transactionManager>
  17.     <!– 这里可以写多个实体的映射文件 –>
  18.     <sqlMap resource=”com/ibatis/Emp.xml” />
  19. </sqlMapConfig>

 

IEmpDao.java

  1. package com.ibatis.dao;
  2. import java.util.List;
  3. import com.ibatis.entity.Emp;
  4. public interface IEmpDao {
  5.     /**
  6.      * 不使用主键的方式添加数据
  7.      * @param emp
  8.      */
  9.    public void addEmp(Emp emp);
  10.    /**
  11.     * 使用主键的方式添加数据
  12.     * @param emp
  13.     */
  14.    public void addEmpBySequence(Emp emp);
  15.    /**
  16.     * 根据id删除指定的员工
  17.     * @param id
  18.     */
  19.    public void deleteEmpById(int id);
  20.    /**
  21.     * 根据id修改员工数据
  22.     * @param emp
  23.     */
  24.    public void updateEmpById(Emp emp);
  25.    /**
  26.     * 查询所有的员工数据
  27.     * @return
  28.     */
  29.    public List<Emp> queryAllEmp();
  30.    /**
  31.     * 模糊查询
  32.     * @param name
  33.     * @return
  34.     */
  35.    public List<Emp> queryEmpByName(String name);
  36.    /**
  37.     * 根据ID查询指定的员工数据
  38.     * @param id
  39.     * @return
  40.     */
  41.    public Emp queryEmpById(int id);
  42. }

IEmpDaoImpl.java

  1. package com.ibatis.impl;
  2. import java.io.IOException;
  3. import java.io.Reader;
  4. import java.sql.SQLException;
  5. import java.util.List;
  6. import com.ibatis.common.resources.Resources;
  7. import com.ibatis.dao.IEmpDao;
  8. import com.ibatis.entity.Emp;
  9. import com.ibatis.sqlmap.client.SqlMapClient;
  10. import com.ibatis.sqlmap.client.SqlMapClientBuilder;
  11. public class IEmpDaoImpl implements IEmpDao{
  12.     private static SqlMapClient sqlMapClient=null;
  13.     //读取配置文件start
  14.     static{
  15.         try {
  16.             Reader reader=Resources.getResourceAsReader(“com/ibatis/SqlMapConfig.xml”);
  17.             sqlMapClient=SqlMapClientBuilder.buildSqlMapClient(reader);
  18.             reader.close();
  19.         } catch (IOException e) {
  20.             e.printStackTrace();
  21.         }
  22.     }
  23.     //end
  24.     /**
  25.      * 不使用主键的方式添加数据
  26.      * @param emp
  27.      */
  28.     @Override
  29.     public void addEmp(Emp emp) {
  30.         Object object=null;
  31.       try {
  32.             object=sqlMapClient.insert(“addEmp”, emp);
  33.             System.out.println(“添加员工的返回值:”+object);
  34.     } catch (SQLException e) {
  35.         e.printStackTrace();
  36.     }
  37. }
  38.      /**
  39.         * 使用主键的方式添加数据
  40.         * @param emp
  41.        */
  42.     @Override
  43.     public void addEmpBySequence(Emp emp) {
  44.         try {
  45.             //1.从数据库序列中获取主键值
  46.             //2.往emp表中插入记录
  47.             sqlMapClient.insert(“insertEmp”, emp);
  48.             System.out.println(emp.getEmpno());
  49.         } catch (SQLException e) {
  50.             e.printStackTrace();
  51.         }
  52.     }
  53.     @Override
  54.     public void deleteEmpById(int id) {
  55.         try {
  56.             int num=sqlMapClient.delete(“deleteEmpbyId”, id);
  57.             System.out.println(num);
  58.         } catch (SQLException e) {
  59.             e.printStackTrace();
  60.         }
  61.     }
  62.     @Override
  63.     public void updateEmpById(Emp emp) {
  64.        try {
  65.         int num=sqlMapClient.update(“updateEmpById”, emp);
  66.         System.out.println(num);
  67.     } catch (SQLException e) {
  68.         e.printStackTrace();
  69.     }
  70. }
  71.     @Override
  72.     public List<Emp> queryAllEmp() {
  73.         List<Emp> emps=null;
  74.             try {
  75.                 emps=sqlMapClient.queryForList(“selectAllEmp”);
  76.             } catch (SQLException e) {
  77.                 e.printStackTrace();
  78.             }
  79.         return emps;
  80.     }
  81.     /**
  82.      * 模糊查询
  83.      */
  84.     @Override
  85.     public List<Emp> queryEmpByName(String name) {
  86.         List<Emp> empList=null;
  87.         try {
  88.             empList=sqlMapClient.queryForList(“selectEmpByEname”, name);
  89.         } catch (SQLException e) {
  90.             e.printStackTrace();
  91.         }
  92.         return empList;
  93.     }
  94.     /**
  95.      * 根据id查询指定的员工值
  96.      */
  97.     @Override
  98.     public Emp queryEmpById(int id) {
  99.         Emp emp=null;
  100.         try {
  101.             emp=(Emp) sqlMapClient.queryForObject(“selectEmpById”, id);
  102.         } catch (SQLException e) {
  103.             e.printStackTrace();
  104.         }
  105.         return emp;
  106.     }
  107. }

 

TestIbatis.java

  1. package com.ibatis.test;
  2. import java.util.Date;
  3. import java.util.List;
  4. import com.ibatis.dao.IEmpDao;
  5. import com.ibatis.entity.Emp;
  6. import com.ibatis.impl.IEmpDaoImpl;
  7. public class TestIbatis {
  8.      public static void main(String[] args) {
  9.          /**
  10.           * 查询所有员工
  11.           */
  12.         IEmpDao dao=new IEmpDaoImpl();
  13.             for(Emp emp:dao.queryAllEmp()){
  14.                 System.out.println(emp.toString());
  15.             }
  16.              /**
  17.               * 根据id查找员工
  18.               */
  19.           System.out.println(dao.queryEmpById(7839));
  20.               /**
  21.                * 不使用主键的方式添加员工
  22.                */
  23.                 Emp emp =new Emp();
  24.                  emp.setEmpno(2010);
  25.                  emp.setEname(“董秀锦”);
  26.                  emp.setComm(30);
  27.                  emp.setDeptno(20);
  28.                  emp.setMgr(7839);
  29.                  emp.setSal(2000);
  30.                  emp.setJob(“达人”);
  31.                  emp.setHiredate(new Date());
  32.                  dao.addEmp(emp);
  33.                  /**
  34.                   * 使用主键的方式添加数据
  35.                   */
  36.                  Emp emp2 =new Emp();
  37.                  emp2.setEmpno(2223); //这个不其作用了,使用的是序列生成的主键值
  38.                  emp2.setEname(“董秀锦”);
  39.                  emp2.setComm(30);
  40.                  emp2.setDeptno(20);
  41.                  emp2.setMgr(7839);
  42.                  emp2.setSal(2000);
  43.                  emp2.setJob(“达人”);
  44.                  emp2.setHiredate(new Date());
  45.                  dao.addEmpBySequence(emp2) ;
  46.             /**
  47.              * 删除
  48.              */
  49.              dao.deleteEmpById(2010);
  50.             /**
  51.              * 修改
  52.              */
  53.                  Emp emp1 =new Emp();
  54.                  emp1.setEmpno(7566);
  55.                  emp1.setEname(“董秀锦”);
  56.                  dao.updateEmpById(emp1);
  57.         /**
  58.          * 模糊查询
  59.          */
  60.                 List<Emp> empList= dao.queryEmpByName(“秀”);
  61.                  for(Emp e:empList){
  62.                     System.out.println(e);
  63.                  }
  64.          }
  65. }

 

iBatis 的优缺点:

优点:

1、 减少代码量,简单;

2、 性能增强;

3、 Sql 语句与程序代码分离;

4、 增强了移植性;

缺点:

1、 和Hibernate 相比,sql 需要自己写;

2、 参数数量只能有一个,多个参数时不太方便;