`

ibatis 实例配置

阅读更多

以以下配置为例说明Ibatis的配置:

 

<sqlMapConfig>
    <settings
      cacheModelsEnabled="true"
      enhancementEnabled="true"
      lazyLoadingEnabled="true"
      errorTracingEnabled="true"
      maxRequests="32"
      maxSessions="10"
      maxTransactions="5"
      useStatementNamespaces="false"
     />

       <transactionManager type="JDBC">

              <dataSource type="SIMPLE">

                   <property name="JDBC.Driver"    value="com.p6spy.engine.spy.P6SpyDriver"/>
                   <property name="JDBC.ConnectionURL"   value="jdbc:mysql://localhost/sample"/>
                   <property name="JDBC.Username" value="user"/>
                   <property name="JDBC.Password" value="mypass"/>
                   <property name="Pool.MaximumActiveConnections"    value="10"/>
                   <property name="Pool.MaximumIdleConnections" value="5"/>
                   <property name="Pool.MaximumCheckoutTime"    value="120000"/>
                   <property name="Pool.TimeToWait" value="500"/>
                   <property name="Pool.PingQuery" value="select 1 from   XXX"/>
                   <property name="Pool.PingEnabled" value="false"/>
                   <property name="Pool.PingConnectionsOlderThan"   value="1"/>
                   <property name="Pool.PingConnectionsNotUsedFor"   value="1"/>

              </dataSource>

           </transactionManager>

 

         <sqlMap resource="com/ibatis/sample/User.xml"/>

  </sqlMapConfig>

=========================

     POJO示例:      

 

          public class User implements Serializable {

 

              private Integer id;
              private String name;
              private Integer sex;

 


              private Set addresses = new HashSet();
                 /** default constructor */
                public User() {
              }


              public Integer getId() {
                   return this.id;

              }

 

               public void setId(Integer id) {
                 this.id = id;
               }
             

               public String getName() {
                   return this.name;
                }

               public void setName(String name) {
                  this.name = name;
                }


                public Integer getSex() {
                    return this.sex;
                }


                public void setSex(Integer sex) {
                    this.sex = sex;
                 }

 

 

         }

 

 

=============

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

 

 

<sqlMap namespace="User">
     <typeAlias alias="user" type="com.ibatis.sample.User"/>
     <select id="getUser"
            parameterClass="java.lang.String"
            resultClass="user">
            <![CDATA[
                 select
                 name,
                 sex
                 from t_user

                 where name = #name#
                 ]]>
      </select>
      <update id="updateUser"    parameterClass="user">
         <![CDATA[
                UPDATE t_user
                SET
                name=#name#,
                sex=#sex#
                WHERE id = #id#
          ]]>
      </update>
      <insert id="insertUser"   parameterClass="user">
         INSERT INTO t_user (
         name,
         sex)
         VALUES (
         #name#,
         #sex#
         )        
     </insert>
     <delete id="deleteUser"    parameterClass="java.lang.String">
         delete from t_user
         where id = #value#
     </delete>
</sqlMap>

 

 

⑴ ID
指定了操作ID,之后我们可以在代码中通过指定操作id 来执行此节点所定
义的操作,如:
sqlMap.update("updateUser",user);
ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节点,以不同id区分)

 

⑵ parameterClass
指 定 了操作所需的参数类型, 此例中update 操作以
com.ibatis.sample.User 类型的对象作为参数,目标是将提供的User实例更新到数据库。
parameterClass="user"中,user为“com.ibatis.sample.User”
类的别名,别名可通过typeAlias节点指定,如示例配置文件中的:
<typeAlias alias="user" type="com.ibatis.sample.User"/>

 

 

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

 

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

 

 

⑸ SQL中所需的用户名参数,“#name#”在运行期会由传入的user对象的name属性填充。

 

 

⑹ SQL 中所需的用户性别参数“#sex#”,将在运行期由传入的user 对象的sex属性填充。

 

 

⑺ SQL中所需的条件参数“#id#”,将在运行期由传入的user对象的id属性填充。

 

对于这个示例,ibatis在运行期会读取id 为“updateUser”的update节点的SQL定义,并调用指定的user对象的对应getter方法获取属性值,并用此属性值,对SQL中的参数进行填充后提交数据库执行。

 

 

 

此例对应的应用级代码如下,其中演示了ibatis SQLMap的基本使用方法:

 

 

String resource ="com/ibatis/sample/SqlMapConfig.xml";
Reader reader;

reader = Resources.getResourceAsReader(resource);
XmlSqlMapClientBuilder xmlBuilder =new XmlSqlMapClientBuilder();
SqlMapClient sqlMap = xmlBuilder.buildSqlMap(reader);
//sqlMap系统初始化完毕,开始执行update操作
try{
    sqlMap.startTransaction();
    User user = new User();
    user.setId(new Integer(1));
    user.setName("Erica");
    user.setSex(new Integer(1));
    sqlMap.update("updateUser",user);
    sqlMap.commitTransaction();
finally{
    sqlMap.endTransaction();
}

 

 

其中,SqlMapClient是ibatis运作的核心,所有操作均通过SqlMapClient实例完成。

可以看出,对于应用层而言,程序员面对的是传统意义上的数据对象,而非JDBC中烦杂的ResultSet,这使得上层逻辑开发人员的工作量大大减轻,同时代码更加清晰简洁。

数据库操作在映射文件中加以定义,从而将数据存储逻辑从上层逻辑代码中独立出来。
而底层数据操作的SQL可配置化,使得我们可以控制最终的数据操作方式,通过SQL的优化获得最佳的数据库执行效能,这在依赖SQL自动生成的“全自动”ORM机制中是所难以实现的。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics