Batis是一款使用方便的數(shù)據(jù)訪問工具,也可作為數(shù)據(jù)持久層的框架。和ORM框架(如Hibernate)將數(shù)據(jù)庫表直接映射為Java對象相比,iBatis是將SQL語句映射為Java對象。相對于全自動SQL的Hibernate,iBatis允許你對SQL有完全控制權,可以視為半自動的數(shù)據(jù)訪問工具。
iBatis的最大優(yōu)點是簡便,輕量級,僅需iBatis的一個jar和數(shù)據(jù)庫的驅(qū)動即可運行,而且使用iBatis僅需掌握SQL和XML的用法即可,而不像Hibernate那樣需要配置對象間的關系。學習iBatis的過程要比Hibernate快很多,在項目中,若人員水平不大一致時,使用iBatis代替Hibernate作為數(shù)據(jù)訪問工具可以有效提升開發(fā)效率。
不管是iBatis還是Hibernate,都作為訪問數(shù)據(jù)庫的工具,它們必然基于JDBC而來,目的解決是JDBC程序開發(fā)的繁瑣性和代碼的冗余性(如加載驅(qū)動,建立連接,初始化語句對象,執(zhí)行數(shù)據(jù)庫操作,返回結果,關閉各個對象這一重復且無技術含量的過程)。
我們還是首先來看一個典型的JDBC示例,使用MySQL數(shù)據(jù)庫,首先是建表。
create table users(
ID INT(10) AUTO_INCREMENT PRIMARY KEY,
USERNAME VARCHAR(10) NOT NULL,
PASSWORD VARCHAR(32) NOT NULL,
MOBILE VARCHAR(11) NOT NULL,
EMAIL VARCHAR(40)
);
創(chuàng)建表之后在數(shù)據(jù)庫中創(chuàng)建一條記錄。創(chuàng)建一個類模型,描述User對象。
ge jdbc.model;
public class User implements java.io.Serializable {
private Integer userId;
private String userName;
private String password;
private String mobile;
private String email;
//省略屬性的getter和setter方法
@Override
public String toString() {
return "User [email=" + email + ", mobile=" + mobile + ", password="
+ password + ", userId=" + userId + ", userName=" + userName
+ "]";
}
}
要訪問數(shù)據(jù)庫,首先做些基礎準備。寫一個簡單的數(shù)據(jù)庫訪問工具類,配置信息從屬性文件中讀取,比較方便。
package jdbc.util;
import java.sql.*;
import java.util.ResourceBundle;
public class DBUtil {
private static Connection conn = null;
private static Statement stmt;
private static PreparedStatement pstmt = null;
private static String url = "", driver = "", userName = "", password = "";
static {
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
url = bundle.getString("jdbc.url");
driver = bundle.getString("jdbc.driverClassName");
userName = bundle.getString("jdbc.username");
password = bundle.getString("jdbc.password");
}
public DBUtil() {
}
public static Connection getConnection() {
try {
Class.forName(driver);
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 users where ID=?";
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.setUserId(rs.getInt("ID"));
user.setUserName(rs.getString("USERNAME"));
user.setPassword(rs.getString("PASSWORD"));
user.setMobile(rs.getString("MOBILE"));
user.setEmail(rs.getString("EMAIL"));
}
} 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(1));
}
}
下面我們進入iBatis的配置。使用iBatis首先要獲取開發(fā)包,現(xiàn)在iBatis版本分為2和3,二者在使用上稍有差別,這里我們使用2的版本進行說明。首先看下項目結構。
數(shù)據(jù)庫的配置信息還是使用jdbc.properties文件即可,統(tǒng)一管理。
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123
<?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>
<properties resource="jdbc.properties" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${jdbc.driverClassName}" />
<property name="JDBC.ConnectionURL" value="${jdbc.url}" />
<property name="JDBC.Username" value="${jdbc.username}" />
<property name="JDBC.Password" value="${jdbc.password}" />
</dataSource>
</transactionManager>
<sqlMap resource="ibatis/resources/User.xml" />
</sqlMapConfig>
配置好iBatis后,我們就要進行數(shù)據(jù)庫操作了,當然iBatis本身的SQL語句也是寫在映射文件中的,那么就要看User.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="User" type="ibatis.model.User" />
<select id="getAllUsers" resultClass="User">
select *
from users
</select>
</sqlMap>
typeAlias標簽是設置別名用的,這里我們使用了一個Bean叫做User,聲明別名后,在文件的后續(xù)部分可以直接使用別名而不用再給出完整類型了,非常方便,如select標簽中的resultClass屬性。
這個配置我們使用的是Bean作為返回的結果類型,當然也可以使用Map,非常靈活。Select的id是標識該SQL語句的標識符,要在應用程序中使用到,必須唯一。Select標簽體內(nèi)的部分就是SQL語句了,當然這里是最簡單的示例。
最后就是應用程序,寫法也很簡單。首先是加載iBatis的配置文件,然后使用SqlMapClient接口提供的方法進行數(shù)據(jù)操作。
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);
List<User> list = sqlMap.queryForList("getAllUsers");
for (User user : list) {
System.out.println(user);
}
}
}
至此,一個簡單的iBatis應用就寫完了,相比于Hibernate,我們對SQL有完全的主動權,對SQL的管理也高度統(tǒng)一,并且配置非常簡單。
更多建議: