iBatis开发环境搭建和第一个程序

来源:互联网 发布:mac win10截屏快捷键 编辑:程序博客网 时间:2024/04/30 06:15
iBatis是一款使用方便的数据访问工具,也可作为数据持久层的框架。和ORM框架(如Hibernate)将数据库表直接映射为Java对象相比,iBatis是将SQL语句映射为Java对象。相对于全自动SQL的Hibernate,iBatis允许你对SQL有完全控制权,可以视为半自动的数据访问工具。 
    iBatis的最大优点是简便,轻量级,仅需iBatis的一个jar和数据库的驱动即可运行,而且使用iBatis仅需掌握SQL和XML的用法即可,而不像Hibernate那样需要配置对象间的关系。学习iBatis的过程要比Hibernate快很多,在项目中,若人员水平不大一致时,使用iBatis代替Hibernate作为数据访问工具可以有效提升开发效率。 
    不管是iBatis还是Hibernate,都作为访问数据库的工具,它们必然基于JDBC而来,目的解决是JDBC程序开发的繁琐性和代码的冗余性(如加载驱动,建立连接,初始化语句对象,执行数据库操作,返回结果,关闭各个对象这一重复且无技术含量的过程)。 
    我们还是首先来看一个典型的JDBC示例,使用MySQL数据库,首先是建表。 
Sql代码  收藏代码
  1. create table users(  
  2.     ID INT(10) AUTO_INCREMENT PRIMARY KEY,  
  3.     USERNAME VARCHAR(10) NOT NULL,  
  4.     PASSWORD VARCHAR(32) NOT NULL,  
  5.     MOBILE VARCHAR(11) NOT NULL,  
  6.     EMAIL VARCHAR(40)  
  7. );  

 
    创建表之后在数据库中创建一条记录。创建一个类模型,描述User对象。 
Java代码  收藏代码
  1. package jdbc.model;  
  2. public class User implements java.io.Serializable {  
  3.     private Integer userId;  
  4.     private String userName;  
  5.     private String password;  
  6.     private String mobile;  
  7.     private String email;  
  8. //省略属性的getter和setter方法  
  9.     @Override  
  10.     public String toString() {  
  11.         return "User [email=" + email + ", mobile=" + mobile + ", password="  
  12.                 + password + ", userId=" + userId + ", userName=" + userName  
  13.                 + "]";  
  14.     }  
  15. }  

    要访问数据库,首先做些基础准备。写一个简单的数据库访问工具类,配置信息从属性文件中读取,比较方便。 
Java代码  收藏代码
  1. package jdbc.util;  
  2. import java.sql.*;  
  3. import java.util.ResourceBundle;  
  4. public class DBUtil {  
  5.     private static Connection conn = null;  
  6.     private static Statement stmt;  
  7.     private static PreparedStatement pstmt = null;  
  8.     private static String url = "", driver = "", userName = "", password = "";  
  9.     static {  
  10.         ResourceBundle bundle = ResourceBundle.getBundle("jdbc");  
  11.         url = bundle.getString("jdbc.url");  
  12.         driver = bundle.getString("jdbc.driverClassName");  
  13.         userName = bundle.getString("jdbc.username");  
  14.         password = bundle.getString("jdbc.password");  
  15.     }  
  16.     public DBUtil() {  
  17.     }  
  18.     public static Connection getConnection() {  
  19.         try {  
  20.             Class.forName(driver);  
  21.             conn = DriverManager.getConnection(url, userName, password);  
  22.         } catch (Exception e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.         return conn;  
  26.     }  
  27. }  

    最后是一个Demo测试类。 
Java代码  收藏代码
  1. package jdbc;  
  2. import java.sql.*;  
  3. import jdbc.model.User;  
  4. import jdbc.util.DBUtil;  
  5. public class JDBCDemo {  
  6.     public static User getUser(int id) throws SQLException {  
  7.         User user = null;  
  8.         String sql = "select * from users where ID=?";  
  9.         Connection conn = null;  
  10.         PreparedStatement pstmt = null;  
  11.         ResultSet rs = null;  
  12.         try {  
  13.             conn = DBUtil.getConnection();  
  14.             pstmt = conn.prepareStatement(sql);  
  15.             pstmt.setInt(1, id);  
  16.             rs = pstmt.executeQuery();  
  17.             while (rs.next()) {  
  18.                 user = new User();  
  19.                 user.setUserId(rs.getInt("ID"));  
  20.                 user.setUserName(rs.getString("USERNAME"));  
  21.                 user.setPassword(rs.getString("PASSWORD"));  
  22.                 user.setMobile(rs.getString("MOBILE"));  
  23.                 user.setEmail(rs.getString("EMAIL"));  
  24.             }  
  25.         } finally {  
  26.             try {  
  27.                 if (rs != null) {  
  28.                     rs.close();  
  29.                 }  
  30.             } finally {  
  31.                 try {  
  32.                     if (pstmt != null) {  
  33.                         pstmt.close();  
  34.                     }  
  35.                 } finally {  
  36.                     if (conn != null) {  
  37.                         conn.close();  
  38.                     }  
  39.                 }  
  40.             }  
  41.         }  
  42.         return user;  
  43.     }  
  44.     public static void main(String[] args) throws Exception {  
  45.         System.out.println(getUser(1));  
  46.     }  
  47. }  

    这是一个最朴素的JDBC应用程序,所有操作必须人为显式完成,如有遗漏可能就会对程序造成影响,比如连接不释放,数据更新操作时使用事务。不可否认的是,JDBC直接操作数据库的效率是最高的,一旦使用了持久层的框架,会在效率上造成一定影响。这点要权衡利弊,做出决定。 
    下面我们进入iBatis的配置。使用iBatis首先要获取开发包,现在iBatis版本分为2和3,二者在使用上稍有差别,这里我们使用2的版本进行说明。首先看下项目结构。 
 
    数据库的配置信息还是使用jdbc.properties文件即可,统一管理。 
Java代码  收藏代码
  1. jdbc.driverClassName=com.mysql.jdbc.Driver  
  2. jdbc.url=jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8  
  3. jdbc.username=root  
  4. jdbc.password=123  

    iBatis的配置文件是SqlMapConfig.xml,这里面需要声明数据库连接的属性信息,数据源配置信息,映射文件等信息。先看个例子,其中属性含义先不必深究,当然也可以去google。 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE sqlMapConfig        
  3.     PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"        
  4.     "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">  
  5. <sqlMapConfig>  
  6.     <properties resource="jdbc.properties" />  
  7.     <transactionManager type="JDBC">  
  8.         <dataSource type="SIMPLE">  
  9.             <property name="JDBC.Driver" value="${jdbc.driverClassName}" />  
  10.             <property name="JDBC.ConnectionURL" value="${jdbc.url}" />  
  11.             <property name="JDBC.Username" value="${jdbc.username}" />  
  12.             <property name="JDBC.Password" value="${jdbc.password}" />  
  13.         </dataSource>  
  14.     </transactionManager>  
  15.     <sqlMap resource="ibatis/resources/User.xml" />  
  16. </sqlMapConfig>  

    配置好iBatis后,我们就要进行数据库操作了,当然iBatis本身的SQL语句也是写在映射文件中的,那么就要看User.xml了。 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE sqlMap        
  3.     PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"        
  4.     "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
  5. <sqlMap>  
  6.     <typeAlias alias="User" type="ibatis.model.User" />  
  7.     <select id="getAllUsers" resultClass="User">  
  8.         select *  
  9.         from users  
  10.     </select>  
  11. </sqlMap>  

    typeAlias标签是设置别名用的,这里我们使用了一个Bean叫做User,声明别名后,在文件的后续部分可以直接使用别名而不用再给出完整类型了,非常方便,如select标签中的resultClass属性。 
    这个配置我们使用的是Bean作为返回的结果类型,当然也可以使用Map,非常灵活。Select的id是标识该SQL语句的标识符,要在应用程序中使用到,必须唯一。Select标签体内的部分就是SQL语句了,当然这里是最简单的示例。 
    最后就是应用程序,写法也很简单。首先是加载iBatis的配置文件,然后使用SqlMapClient接口提供的方法进行数据操作。 
Java代码  收藏代码
  1. package ibatis;  
  2. import ibatis.model.User;  
  3. import java.io.*;  
  4. import java.sql.SQLException;  
  5. import java.util.List;  
  6. import com.ibatis.common.resources.Resources;  
  7. import com.ibatis.sqlmap.client.*;  
  8. public class IBatisDemo {  
  9.     public static void main(String[] args) throws IOException, SQLException {  
  10.         String config = "ibatis/SqlMapConfig.xml";  
  11.         Reader reader = Resources.getResourceAsReader(config);  
  12.         SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);  
  13.         List<User> list = sqlMap.queryForList("getAllUsers");  
  14.         for (User user : list) {  
  15.             System.out.println(user);  
  16.         }  
  17.     }  
  18. }  

    至此,一个简单的iBatis应用就写完了,相比于Hibernate,我们对SQL有完全的主动权,对SQL的管理也高度统一,并且配置非常简单。 

    欢迎交流,希望对学习者有用。

   转载:http://sarin.iteye.com/blog/677623

原创粉丝点击