zoukankan      html  css  js  c++  java
  • 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
    			+"	name="+ename
    			+"	job="+job
    			+"	mgr="+mgr
    			+"	hiredate="+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、 参数数量只能有一个,多个参数时不太方便;

      

  • 相关阅读:
    当td中文字过长时,显示为省略号
    清除页面缓存
    在dwr的调用类里获取请求信息
    解决利用hibernate连接mysql时无法插入汉字的问题
    MySql的数据库方言问题
    解决IE升级后必须以管理员运行的问题
    form表单里的button调用js函数
    EF多租户实例:演变为读写分离
    EF多租户实例:快速实现分库分表
    EF多租户实例:如何快速实现和同时支持多个DbContext
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300388.html
Copyright © 2011-2022 走看看