iBatis開發(fā)詳解(1)---開發(fā)第一個程序

2018-10-13 11:03 更新

    Batis是一款使用方便的數(shù)據(jù)訪問工具,也可作為數(shù)據(jù)持久層的框架。和ORM框架(如Hibernate)將數(shù)據(jù)庫表直接映射為Java對象相比,iBatis是將SQL語句映射為Java對象。相對于全自動SQL的Hibernate,iBatis允許你對SQL有完全控制權(quán),可以視為半自動的數(shù)據(jù)訪問工具。 


    iBatis的最大優(yōu)點(diǎn)是簡便,輕量級,僅需iBatis的一個jar和數(shù)據(jù)庫的驅(qū)動即可運(yùn)行,而且使用iBatis僅需掌握SQL和XML的用法即可,而不像Hibernate那樣需要配置對象間的關(guān)系。學(xué)習(xí)iBatis的過程要比Hibernate快很多,在項目中,若人員水平不大一致時,使用iBatis代替Hibernate作為數(shù)據(jù)訪問工具可以有效提升開發(fā)效率。 


    不管是iBatis還是Hibernate,都作為訪問數(shù)據(jù)庫的工具,它們必然基于JDBC而來,目的解決是JDBC程序開發(fā)的繁瑣性和代碼的冗余性(如加載驅(qū)動,建立連接,初始化語句對象,執(zhí)行數(shù)據(jù)庫操作,返回結(jié)果,關(guān)閉各個對象這一重復(fù)且無技術(shù)含量的過程)。 


    我們還是首先來看一個典型的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)  
);  

 iBatis開發(fā)詳解


 創(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ù)庫,首先做些基礎(chǔ)準(zhǔn)備。寫一個簡單的數(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));  
    }  
}  

    下面我們進(jìn)入iBatis的配置。使用iBatis首先要獲取開發(fā)包,現(xiàn)在iBatis版本分為2和3,二者在使用上稍有差別,這里我們使用2的版本進(jìn)行說明。首先看下項目結(jié)構(gòu)。

iBatis


     數(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  


     iBatis的配置文件是SqlMapConfig.xml,這里面需要聲明數(shù)據(jù)庫連接的屬性信息,數(shù)據(jù)源配置信息,映射文件等信息。先看個例子,其中屬性含義先不必深究,當(dāng)然也可以去google。 

<?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后,我們就要進(jìn)行數(shù)據(jù)庫操作了,當(dāng)然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標(biāo)簽是設(shè)置別名用的,這里我們使用了一個Bean叫做User,聲明別名后,在文件的后續(xù)部分可以直接使用別名而不用再給出完整類型了,非常方便,如select標(biāo)簽中的resultClass屬性。 


    這個配置我們使用的是Bean作為返回的結(jié)果類型,當(dāng)然也可以使用Map,非常靈活。Select的id是標(biāo)識該SQL語句的標(biāo)識符,要在應(yīng)用程序中使用到,必須唯一。Select標(biāo)簽體內(nèi)的部分就是SQL語句了,當(dāng)然這里是最簡單的示例。 


    最后就是應(yīng)用程序,寫法也很簡單。首先是加載iBatis的配置文件,然后使用SqlMapClient接口提供的方法進(jìn)行數(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應(yīng)用就寫完了,相比于Hibernate,我們對SQL有完全的主動權(quán),對SQL的管理也高度統(tǒng)一,并且配置非常簡單。 
     歡迎交流,希望對學(xué)習(xí)者有用。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號