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

package com.ibatis.entity;

import java.util.Date;

public class Emp {
	//变量的名字必须和数据库的字段名一致,否则会映射不出来
	private int empno;
	private String ename;
	private String job;
	private Integer mgr;
	private Date hiredate;
	private int sal;
	private int comm;
	private int deptno;
	
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}

	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public Integer getMgr() {
		return mgr;
	}
	public void setMgr(Integer mgr) {
		this.mgr = mgr;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	public int getSal() {
		return sal;
	}
	public void setSal(int sal) {
		this.sal = sal;
	}
	public int getComm() {
		return comm;
	}
	public void setComm(int comm) {
		this.comm = comm;
	}
	public int getDeptno() {
		return deptno;
	}
	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}
	
@Override
public String toString() {
	return "empno="+empno
			+"\tname="+ename
			+"\tjob="+job
			+"\tmgr="+mgr
			+"\thiredate="+hiredate;
 }
}


SqlMap.properties

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

 

Emp.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="Emp" type="com.ibatis.entity.Emp"/>
      
      <!-- id表示select里的sql语句,resultClass表示返回结果的类型 -->  
      <select id="selectAllEmp" resultClass="Emp">
         select * from emp
      </select>
      
       <!-- parameterClass表示参数的内容 -->  
       <!-- #表示这是一个外部调用的需要传进的参数,可以理解为占位符 -->  
       
       <select id="selectEmpById" parameterClass="int" resultClass="Emp">
         select * from emp 
              where empno=#empno#
       </select>
      
      <!-- 不使用主键的方式 -->
      <insert id="addEmp" parameterClass="Emp">
            insert into 
              emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
              values(#empno#,#ename#,#job#,#mgr#,#hiredate#,#sal#,#comm#,#deptno#)
      </insert>
      
      <delete id="deleteEmpbyId" parameterClass="int">
       <!-- #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的ename会从Emp里的属性里去查找 -->  
       <!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 --> 
         delete from emp where empno=#id#
      </delete>
      
      <update id="updateEmpById" parameterClass="Emp">
            update emp 
             set ename=#ename#
            where empno=#empno# 
      </update>
      
      <!-- 模糊查询没有使用#,而使用了$符号 -->
      <select id="selectEmpByEname" parameterClass="String" resultClass="Emp">
          select empno,ename,sal,hiredate
            from emp
            where ename like '%$ename$%' 
      </select>
      
      <!-- 主键插入方式 -->
      <insert id="insertEmp" parameterClass="Emp">
      <!-- 对于Oracle 需要将selectKey放在insert前面 -->
      <selectKey resultClass="int" keyProperty="empno">
            select empPkempno.Nextval as empno
             from dual
      </selectKey>
          insert into 
              emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
              values(#empno#,#ename#,#job#,#mgr#,#hiredate#,#sal#,#comm#,#deptno#)
      </insert>
      
</sqlMap>


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>
	<!-- 引用JDBC属性的配置文件 -->
	<properties resource="com/ibatis/SqlMap.properties" />
	<!-- 使用JDBC的事务管理 -->
	<transactionManager type="JDBC">
		<!-- 数据源 -->
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="${driver}" />
			<property name="JDBC.ConnectionURL" value="${url}" />
			<property name="JDBC.Username" value="${username}" />
			<property name="JDBC.Password" value="${password}" />
		</dataSource>
	</transactionManager>
	<!-- 这里可以写多个实体的映射文件 -->
	<sqlMap resource="com/ibatis/Emp.xml" />
	
</sqlMapConfig>

 

IEmpDao.java

package com.ibatis.dao;

import java.util.List;

import com.ibatis.entity.Emp;

public interface IEmpDao {
	/**
	 * 不使用主键的方式添加数据
	 * @param emp
	 */
   public void addEmp(Emp emp);
   /**
    * 使用主键的方式添加数据
    * @param emp
    */
   public void addEmpBySequence(Emp emp);
   /**
    * 根据id删除指定的员工
    * @param id
    */
   public void deleteEmpById(int id);
   /**
    * 根据id修改员工数据
    * @param emp
    */
   public void updateEmpById(Emp emp);
   /**
    * 查询所有的员工数据
    * @return
    */
   public List<Emp> queryAllEmp();
   /**
    * 模糊查询
    * @param name
    * @return
    */
   public List<Emp> queryEmpByName(String name);
   /**
    * 根据ID查询指定的员工数据
    * @param id
    * @return
    */
   public Emp queryEmpById(int id);
}


IEmpDaoImpl.java

package com.ibatis.impl;

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.dao.IEmpDao;
import com.ibatis.entity.Emp;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class IEmpDaoImpl implements IEmpDao{
	
	private static SqlMapClient sqlMapClient=null; 
	
	//读取配置文件start
	static{
		try {
			Reader reader=Resources.getResourceAsReader("com/ibatis/SqlMapConfig.xml");
			sqlMapClient=SqlMapClientBuilder.buildSqlMapClient(reader);
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//end
	/**
	 * 不使用主键的方式添加数据
	 * @param emp
	 */
	@Override
	public void addEmp(Emp emp) {
		Object object=null;
	  try {
	    	object=sqlMapClient.insert("addEmp", emp);
	    	System.out.println("添加员工的返回值:"+object);
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
     /**
	    * 使用主键的方式添加数据
	    * @param emp
	   */
	@Override
	public void addEmpBySequence(Emp emp) {
		try {
			//1.从数据库序列中获取主键值
			//2.往emp表中插入记录
			sqlMapClient.insert("insertEmp", emp);
			System.out.println(emp.getEmpno());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void deleteEmpById(int id) {
		try {
			int num=sqlMapClient.delete("deleteEmpbyId", id);
			System.out.println(num);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void updateEmpById(Emp emp) {
	   try {
		int num=sqlMapClient.update("updateEmpById", emp);
		System.out.println(num);
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

	@Override
	public List<Emp> queryAllEmp() {
		List<Emp> emps=null;
		    try {
				emps=sqlMapClient.queryForList("selectAllEmp");
			} catch (SQLException e) {
				e.printStackTrace();
			}
		return emps;
	}
	/**
	 * 模糊查询
	 */
	@Override
	public List<Emp> queryEmpByName(String name) {
		List<Emp> empList=null;
		try {
			empList=sqlMapClient.queryForList("selectEmpByEname", name);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return empList;
	}

	/**
	 * 根据id查询指定的员工值
	 */
	@Override
	public Emp queryEmpById(int id) {
		Emp emp=null;
		try {
			emp=(Emp) sqlMapClient.queryForObject("selectEmpById", id);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return emp;
	}
	
}

 

TestIbatis.java

package com.ibatis.test;

import java.util.Date;
import java.util.List;

import com.ibatis.dao.IEmpDao;
import com.ibatis.entity.Emp;
import com.ibatis.impl.IEmpDaoImpl;

public class TestIbatis {
	 public static void main(String[] args) {
		 
		 /**
		  * 查询所有员工
		  */
		IEmpDao dao=new IEmpDaoImpl();
			for(Emp emp:dao.queryAllEmp()){
				System.out.println(emp.toString());
			}
			 /**
			  * 根据id查找员工
			  */
  		  System.out.println(dao.queryEmpById(7839));
			  /**
			   * 不使用主键的方式添加员工
			   */
			    Emp emp =new Emp();
				 emp.setEmpno(2010);
				 emp.setEname("董秀锦");
				 emp.setComm(30);
				 emp.setDeptno(20);
				 emp.setMgr(7839);
				 emp.setSal(2000);
				 emp.setJob("达人");
				 emp.setHiredate(new Date());
				 dao.addEmp(emp);
			     /**
			      * 使用主键的方式添加数据
			      */
				 Emp emp2 =new Emp();
				 emp2.setEmpno(2223); //这个不其作用了,使用的是序列生成的主键值
				 emp2.setEname("董秀锦");
				 emp2.setComm(30);
				 emp2.setDeptno(20);
				 emp2.setMgr(7839);
				 emp2.setSal(2000);
				 emp2.setJob("达人");
				 emp2.setHiredate(new Date());
				 dao.addEmpBySequence(emp2) ; 
			/**
			 * 删除
			 */
			 dao.deleteEmpById(2010);
			/**
			 * 修改
			 */
				 Emp emp1 =new Emp();
				 emp1.setEmpno(7566);
				 emp1.setEname("董秀锦");
				 dao.updateEmpById(emp1);
				 
		/**
		 * 模糊查询
		 */
			    List<Emp> empList= dao.queryEmpByName("秀");
			     for(Emp e:empList){
			    	System.out.println(e); 
			     }
			
		 }
	 
	 
}

 

iBatis 的优缺点:

优点:

1、 减少代码量,简单;

2、 性能增强;

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

4、 增强了移植性;

缺点:

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

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

 

  

 

 

posted on 2014-02-12 12:14  吴一达  阅读(173)  评论(0编辑  收藏  举报

导航