最近做项目需要使用ibatis(已改名为Mybatis),以前也没接触过,所以也是网上学习,但是网上很多资料很乱,所以自己在简单成功后,写篇文章,帮助解决那些后面要学习的童鞋,本意在于写的清楚完善,不偷懒过程,以避免不必要的麻烦。“对自己的懒惰,就是对别人看你文章学习的不负责任。”O(∩_∩)O
1 基本介绍
iBatis是一款使用方便的数据访问工具,也可作为数据持久层的框架。和ORM框架(如Hibernate)将数据库表直接映射为Java对象相比,iBatis是将SQL语句映射为Java对象。相对于全自动SQL的Hibernate,iBatis允许你对SQL有完全控制权,可以视为半自动的数据访问工具。
概念什么的,自己去google下吧,MyBatis是个持久层框架,另外的著名的也有 hibernate。[区别:http://zhidao.baidu.com/question/99674664.html]
ibatis经常和MVC框架一起用,本人就是Spring MVC + Mybatis。[MVC框架、持久层框架:http://zhidao.baidu.com/question/250857885.html]
2 为什么要用
不管是iBatis还是Hibernate,都作为访问数据库的工具,它们必然基于JDBC而来,目的解决是JDBC程序开发的繁琐性和代码的冗余性(如加载驱动,建立连接,初始化语句对象,执行数据库操作,返回结果,关闭各个对象这一重复且无技术含量的过程)。
3 JDBC Demo
先看下demo目录,注意JDBC DEMO和ibatis DEMO我放在同一个工程了。请忽略solr,和本工程无关,我本人用于测试Solr的。
首先解决JDBC方式,之后介绍ibatis方式。
3.1 数据库Oracle
使用的是scott/tiger示例EMP[别告诉我,你连这个都忘了,。。。cmd->sqlplus scott/tiger SQL>select * from emp;]
3.2 Java代码
model代码,用于描述数据库对象
package jdbc.model;
public class User implements java.io.Serializable {
private Integer empNO;
private String ename;
private String job;
private String mgr;
private String sal;
public Integer getEmpNO() {
return empNO;
}
public void setEmpNO(Integer 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 String getMgr() {
return mgr;
}
public void setMgr(String mgr) {
this.mgr = mgr;
}
public String getSal() {
return sal;
}
public void setSal(String sal) {
this.sal = sal;
}
@Override
public String toString() {
return "EMP [empNO=" + empNO + ", ename=" + ename + ", job="
+ job + ", mgr=" + mgr + ", sal=" + sal
+ "]";
}
}
要访问数据库,首先做些基础准备。写一个简单的数据库访问工具类,配置信息从属性文件[jdbc.properties]中读取,比较方便。
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:ORCL
jdbc.username=scott
jdbc.password=tiger
工具类,从jdbc.properties读取数据库信息,并连接数据库。
package jdbc.util;
import java.sql.*;
import java.util.ResourceBundle;
public class DBUtil {
private static Connection conn = null;
private static String url = "jdbc:oracle:thin:@localhost:1521:ORCL";//驱动程序名:@主机名/IP:端口号:数据库实例名
private static String driver = "oracle.jdbc.driver.OracleDriver";
private static String userName = "scott";
private static String passWord = "tiger";
public DBUtil() {
}
public static Connection getConnection() {
try {
Class.forName(driver);
//DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());//实例化驱动程序类
conn = DriverManager.getConnection(url, userName, passWord);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
Demo测试
package jdbc;
import java.sql.*;
import jdbc.model.User;
import jdbc.util.DBUtil;
public class JDBCDemo {
public static User getUser(int id) throws SQLException {
User user = null;
String sql = "select * from EMP where EMPNO=?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
while (rs.next()) {
user = new User();
user.setEmpNO(rs.getInt("EMPNO"));
user.setEname(rs.getString("ENAME"));
user.setJob(rs.getString("JOB"));
user.setMgr(rs.getString("MGR"));
user.setSal(rs.getString("SAL"));
}
} finally {
try {
if (rs != null) {
rs.close();
}
} finally {
try {
if (pstmt != null) {
pstmt.close();
}
} finally {
if (conn != null) {
conn.close();
}
}
}
}
return user;
}
public static void main(String[] args) throws Exception {
System.out.println(getUser(7369));
}
}
这是一个最朴素的JDBC应用程序,所有操作必须人为显式完成,如有遗漏可能就会对程序造成影响,比如连接不释放,数据更新操作时使用事务。不可否认的是,JDBC直接操作数据库的效率是最高的,一旦使用了持久层的框架,会在效率上造成一定影响。这点要权衡利弊,做出决定。
iBatis的配置文件是SqlMapConfig.xml,这里面需要声明数据库连接的属性信息,数据源配置信息,映射文件等信息。
配置好iBatis后,我们就要进行数据库操作了,当然iBatis本身的SQL语句也是写在映射文件中的,那么就要看User.xml了。 getUsers根据id获取数据,getAllUsers获取所有,看代码就懂了。
typeAlias标签是设置别名用的,这里我们使用了一个Bean叫做User,声明别名后,在文件的后续部分可以直接使用别名而不用再给出完整类型了,非常方便,如select标签中的resultClass属性。
package ibatis;
import ibatis.model.User;
import java.io.*;
import java.sql.SQLException;
import java.util.List;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.*;
public class iBatisDemo {
public static void main(String[] args) throws IOException, SQLException {
String config = "ibatis/SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(config);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
//Object o =new Object();
List list = sqlMap.queryForList("getUsers",7499);
for (User user : list) {
System.out.println(user);
}
System.out.println("===============================================================");
List list1 = sqlMap.queryForList("getAllUsers");
for (User user : list1) {
System.out.println(user);
}
}
}
这样,就结束了,下面是输出结果
EMP [empNO=7499, ename=ALLEN, job=SALESMAN, mgr=7698, sal=1600]
===============================================================
EMP [empNO=8900, ename=lihao, job=it, mgr=7902, sal=20000]
EMP [empNO=7369, ename=SMITH, job=CLERK, mgr=7902, sal=800]
EMP [empNO=7499, ename=ALLEN, job=SALESMAN, mgr=7698, sal=1600]
EMP [empNO=7521, ename=WARD, job=SALESMAN, mgr=7698, sal=1250]
EMP [empNO=7566, ename=JONES, job=MANAGER, mgr=7839, sal=2975]
EMP [empNO=7654, ename=MARTIN, job=SALESMAN, mgr=7698, sal=1250]
EMP [empNO=7698, ename=BLAKE, job=MANAGER, mgr=7839, sal=2850]
EMP [empNO=7782, ename=CLARK, job=MANAGER, mgr=7839, sal=2450]
EMP [empNO=7788, ename=SCOTT, job=ANALYST, mgr=7566, sal=3000]
EMP [empNO=7839, ename=KING, job=PRESIDENT, mgr=null, sal=5000]
EMP [empNO=7844, ename=TURNER, job=SALESMAN, mgr=7698, sal=1500]
EMP [empNO=7876, ename=ADAMS, job=CLERK, mgr=7788, sal=1100]
EMP [empNO=7900, ename=JAMES, job=CLERK, mgr=7698, sal=950]
EMP [empNO=7902, ename=FORD, job=ANALYST, mgr=7566, sal=3000]
EMP [empNO=7934, ename=MILLER, job=CLERK, mgr=7782, sal=1300]