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 +" 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、 参数数量只能有一个,多个参数时不太方便;