iBatis 入门实例教程。
iBatis 简介:
iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。
今天学习下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、 参数数量只能有一个,多个参数时不太方便;