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