ibatis实战之基础环境搭建

来源:互联网 发布:炫酷个人网站源码 编辑:程序博客网 时间:2024/05/05 10:32

关于ibatis的介绍、优缺点,以及ibatis和hibernate的比较再此不在赘述,可参阅其他资料。

一、准备工作

1、下载ibatis软件包http://download.csdn.net/detail/itmyhome/7473661

   所需jar包为:ibatis-xxx.jar,mysql-connector-java-xxx-bin.jar

2、创建测试数据库,并新建user表,其中包含三个字段:

   id(int)
   name(varchar)
   age(int)

   ps:以mysql数据库为例

  1. create tableuser
  2.     id int
  3.     name varchar(50), 
  4.     age int 
  5. ); 

二、构建ibatis基础代码

ibatis基础代码包括:

1、ibatis实例配置

   一个典型的配置文件如下

  1. <?xmlversion="1.0"encoding="UTF-8"?> 
  2. <!DOCTYPE sqlMapConfig 
  3. PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" 
  4. "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> 
  5. <sqlMapConfig> 
  6.     <settings  
  7.         cacheModelsEnabled="true"  
  8.         enhancementEnabled="true" 
  9.         lazyLoadingEnabled="true" 
  10.         errorTracingEnabled="true" 
  11.         maxRequests="32" 
  12.         maxSessions="10" 
  13.         maxTransactions="5" 
  14.         useStatementNamespaces="false"/> 
  15.     <transactionManagertype="JDBC"> 
  16.         <dataSourcetype="SIMPLE"> 
  17.             <propertyname="JDBC.Driver"value="com.mysql.jdbc.Driver"/> 
  18.             <propertyname="JDBC.ConnectionURL"value="jdbc:mysql://localhost:3306/ibatis"/> 
  19.             <propertyname="JDBC.Username"value="root"/> 
  20.             <propertyname="JDBC.Password"value="root"/> 
  21.             <propertyname="Pool.MaximumActiveConnections"value="10"/> 
  22.             <propertyname="Pool.MaximumIdleConnections"value="5"/> 
  23.             <propertyname="Pool.MaximumCheckoutTime"value="120000"/> 
  24.             <propertyname="Pool.TimeToWait"value="500"/> 
  25.             <propertyname="Pool.PingQuery"value="select 1 from ACCOUNT"/> 
  26.             <propertyname="Pool.PingEnabled"value="false"/> 
  27.             <propertyname="Pool.PingConnectionsOlderThan"value="1"/> 
  28.             <propertyname="Pool.PingConnectionsNotUsedFor"value="1"/> 
  29.         </dataSource> 
  30.     </transactionManager> 
  31.     <sqlMapresource="com/itmyhome/User.xml"/> 
  32. </sqlMapConfig> 

ibatis配置文件各节点简单说明:

(1)Settings节点

参数描述cacheModelsEnabled是否启用 SqlMapClient 上的缓存机制。
建议设为"true"
enhancementEnabled是否针对POJO启用字节码增强机制以提升
getter/setter 的调用效能,避免使用Java
Reflect 所带来的性能开销。
同时,这也为Lazy Loading带来了极大的性能
提升。建议设为"true"
errorTracingEnabled是否启用错误日志,在开发期间建议设为"true"
以方便调试
lazyLoadingEnabled是否启用延迟加载机制,建议设为"true"maxRequests最大并发请求数(Statement并发数)maxTransactions最大并发事务数maxSessions最大Session数.即当前最大允许的并发SqlMapClient数
maxSessions设定必须介于
maxTransactions和maxRequests之间,即
maxTransactions<maxSessions=< maxRequests
useStatementNamespaces是否使用Statement命名空间。
这里的命名空间指的是映射文件中,sqlMap节点
的namespace属性,如在上例中针对user
表的映射文件sqlMap节点:
<sqlMap namespace="User">
这里,指定了此sqlMap节点下定义的操作均从
属于"User"命名空间。
在useStatementNamespaces="true"的情况下,
Statement调用需追加命名空间,如:
sqlMap.update("User.updateUser",user);
否则直接通过Statement名称调用即可,如:
sqlMap.update("updateUser",user);
但请注意此时需要保证所有映射文件中,
Statement定义无重名

(2)transactionManager节点

   transactionManager节点定义了ibatis的事务管理器,目前提供了以下几种选择:
   1)  JDBC
   通过传统 JDBC Connection.commit/rollback实现事务支持。
   2)  JTA
   使用容器提供的JTA服务实现全局事务管理。
   3)  EXTERNAL
   外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自动的事务管理机制。

   此时ibatis将把所有事务委托给外部容器进行管理。此外,通过Spring等轻量级容器实现事务的配置化管理也是一个不错的选

   择。关于结合容器实现事务管理,参见“高级特性”中的描述。

(3)dataSource节点

   dataSource从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性。

   type属性:dataSource节点的type属性指定了dataSource的实现类型。

   可选项目:

   1)  SIMPLE:

   SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的数据库连接池机制,对应ibatis实现类为

   com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。

   3)  DBCP:

   基于Apache DBCP连接池组件实现的DataSource封装,当无容器提

   供DataSource服务时,建议使用该选项,对应ibatis实现类为com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。

   3)  JNDI:

   使用J2EE容器提供的DataSource实现,DataSource将通过指定

   的JNDI Name从容器中获取.对应ibatis实现类为com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。

    dataSource的子节点说明(SIMPLE&DBCP):

JDBC.DriverJDBC驱动.如:com.mysql.jdbc.DriverJDBC.ConnectionURL数据库URL。如:jdbc:mysql://localhost:3306/ibatis
如果用的是SQLServer JDBC Driver,需要
在url后追加SelectMethod=Cursor以获得
JDBC事务的多Statement支持。
JDBC.Username数据库用户名JDBC.Password数据库用户密码Pool.MaximumActiveConnections数据库连接池可维持的最大容量。Pool.MaximumIdleConnections数据库连接池中允许的挂起(idle)连接数。

(4)sqlMap节点

sqlMap节点指定了映射文件的位置,配置中可出现多个sqlMap节点,以指定

项目内所包含的所有映射文件。

2、POJO

下面是我们用作示例的一个POJO

  1. public class Userimplements Serializable { 
  2.  
  3.     private staticfinallong serialVersionUID = 1L; 
  4.     private int id; 
  5.     private String name; 
  6.     private int age; 
  7.     public int getId() { 
  8.         return id; 
  9.     } 
  10.     public void setId(int id) { 
  11.         this.id = id; 
  12.     } 
  13.     public String getName() { 
  14.         return name; 
  15.     } 
  16.     public void setName(String name) { 
  17.         this.name = name; 
  18.     } 
  19.     public int getAge() { 
  20.         return age; 
  21.     } 
  22.     public void setAge(int age) { 
  23.         this.age = age; 
  24.     } 


3、映射文件

与Hibernate不同,因为需要人工编写sql代码 ibatis的映射文件一般采用手动编写

  1. <?xmlversion="1.0"encoding="UTF-8"?>   
  2. <!DOCTYPE sqlMap   
  3. PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"   
  4. "http://www.ibatis.com/dtd/sql-map-2.dtd"> 
  5. <sqlMapnamespace="User"> 
  6.     <typeAliasalias="user"type="com.itmyhome.User"/> 
  7.     <!-- 查询 --> 
  8.     <selectid="getUser"parameterClass="java.lang.Integer"resultClass="user"> 
  9.         <![CDATA[
  10.             select name,age from user where id = #id#
  11.         ]]> 
  12.     </select> 
  13.     <!-- 插入 --> 
  14.     <insertid="insertUser"parameterClass="user"> 
  15.             insert into user values(#id#,#name#,#age#) 
  16.     </insert> 
  17.     <!-- 更新 --> 
  18.     <updateid="updateUser"  
  19.             parameterClass="user">  
  20.         <![CDATA[
  21.             update user
  22.             SET name=#name#, age=#age#
  23.             WHERE id = #id#
  24.         ]]> 
  25.     </update> 
  26.     <!-- 删除 --> 
  27.     <deleteid="deleteUser"parameterClass="java.lang.Integer"> 
  28.             delete from user where id = #id#  
  29.     </delete> 
  30. </sqlMap> 
从上面的映射文件可以看出,通过<insert>、<delete>、<update>、

<select>四个节点,我们分别定义了针对User对象的增删改查操作。在这

四个节点中,我们指定了对应的SQL语句,以update节点为例:

  1. <updateid="updateUser"                        (1 )
  2.     parameterClass="user">                     (2 )
  3.     <![CDATA[                                  (3 )

       4.        update user                            (4 )

       5.        SET name=#name#, age=#age#             (5)

       6.        WHERE id = #id#

       7.    ]]> 

      8.</update> 

⑴ID

指定了操作ID,之后我们可以在代码中通过指定操作id来执行此节点所定义的操作,如:

sqlMap.update("updateUser",user);

ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节点,以不同id区分)

⑵ parameterClass

指定了操作所需的参数类型,此例中update操作以

com.itmyhome.User 类型的对象作为参数,目标是将提供的User实例更新到数据库。

parameterClass="user"中,user为"com.itmyhome.User"类的别名,别名可通过typeAlias节点指定,

如示例配置文件中的:<typeAlias alias="user" type="com.itmyhome.User"/>

⑶  <![CDATA[… ]]>

通过<![CDATA[… ]]>节点,可以避免SQL中与XML规范相冲突的字符对XML映射文件的合法性造成影响。

⑷执行更新操的SQL,这里的SQL即实际数据库支持的SQL语句,将由ibatis填入参数后交给数据库执行。

⑸ SQL中所需的用户名参数,"#name#"在运行期会由传入的user对象的name属性填充。(其他参数同)

对于这个示例,ibatis在运行期会读取id为"updateUser"的update节点

的SQL定义,并调用指定的user对象的对应getter方法获取属性值,并用此

属性值,对SQL中的参数进行填充后提交数据库执行。

好了,我们完成了所有的配置文件和映射文件,就剩下应用的编码工作了。

首先要设置SQL Map,读入刚创建好的SQL Map XML配置文件。为简化这个工作,可以使用

SQL Map架构中提供的Resources类。

  1. Stringresource ="SqlMapConfig.xml";  
  2. Readerreader=Resources.getResourceAsReader(resource);  
  3. SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); 

以上的SqlMapClient对象是线程安全,并且应持久生存。对于一个特定的应用,只需

进行一次SqlMap配置。因此,它可以作为基类的一个静态对象(即DAO对象的基类),或

者,如果您想让它有更大的作用范围,可以把它封装在方便使用的类中。例如:

  1. public class MyAppSqlConfig { 
  2.     private staticfinal SqlMapClient sqlMap; 
  3.     static
  4.         try
  5.             String resource = "SqlMapConfig.xml"
  6.             Reader reader = Resources.getResourceAsReader(resource); 
  7.             sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); 
  8.         } catch (Exception e) { 
  9.             e.printStackTrace(); 
  10.             throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause: " + e); 
  11.         } 
  12.     } 
  13.     public static SqlMapClient getSqlMapInstance() { 
  14.         return sqlMap; 
  15.     } 

从数据库读取对象

既然SqlMap对象已完成初始化,那么就可以方便地使用它了。首先我们用它

从数据库中读取一个User对象(本例中 先假设User表中一村庄N条记录,id从i到N)

要从数据库中得到一个User对象,只需要SqlMap实例,让我们读入id为1的User对象

  1. SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance();  
  2. User user = (User)sqlMap.queryForObject ("getUser",1); 

把对象写入数据库
  1. User u = new User(); 
  2. u.setId(2); 
  3. u.setName("wangwu"); 
  4. u.setAge(23); 
  5. sqlMap.insert("insertUser",u); 

更新对象

  1. User u = new User(); 
  2. u.setId(3); 
  3. u.setName("itmyhome"); 
  4. u.setAge(25); 
  5. sqlMap.update("updateUser",u) 

删除对象

  1. sqlMap.delete("deleteUser",1

 

项目工程图如下:


0 0
原创粉丝点击