ibatis

1 优点
   1. ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大便
利。
    2. ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了Java数
据库编程的重复工作。
    3. 简单易于学习,易于使用, 非常实用。
    4. 因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,因
此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。


2 与 hibernate的比较
                             IBATIS                             HIBERNATE
    ORM类型                  半自动                                一站式全自动
    映射关系               实体类和SQL语句                          实体类和数据库
    学习门槛                 容易                                  3倍于IBATIS
    SQL 的 优化           方便,进行细粒度的优化                    1 一般情况下,HIBERNATE 会把所有的字段都SELECT 2 UPDATE一般也是更新所有字段
    开发效率             IBATIS要求开发者编写具体的SQL 语句         HIBERNATE会自动生成SQL 语句
    数据库移植           标准SQL方便移植                             不同数据库类型的支持

3 使用 ibaitis
     <1>导包
     <2>数据库连接配置以及映射文件导入  假设文件名为sqlMapConf.xml
     

         <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE sqlMapConfig
        PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
        "http://www.ibatis.com/dtd/sql-map-config-2.dtd">

        <sqlMapConfig>

            <properties resource="sqlMapConf.properties" />
           
            <transactionManager type="JDBC" >
                <dataSource type="SIMPLE">
                    <property name="JDBC.Driver" value="${driver}"/>
                    <property name="JDBC.ConnectionURL" value="${url}"/>
                    <property name="JDBC.Username" value="${username}"/>
                    <property name="JDBC.Password" value="${password}"/>
                </dataSource>
            </transactionManager>
            <!-- 把对应的xml文件添加到这里 -->
            <sqlMap resource="person.xml" />

        </sqlMapConfig>
            
     
          上述中的sqlMapConf.properties示例
            driver=com.mysql.jdbc.Driver
        url=jdbc:mysql://localhost/j2ee
        username=root
        password=123456

       当然也可以不用qlMapConf.properties文件,直接在配置文件写






     <3>编写映射文件,示例
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE sqlMap
        PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
        "http://www.ibatis.com/dtd/sql-map-2.dtd">
        <sqlMap>
            <!-- 给类定义别名 -->
            <typeAlias alias="person" type="com.Person"/>
           
            <!-- bean属性和数据库字段的对应关系 -->
            <resultMap id="pResultMap" class="person">
                <result property="id" column="id"  />
                <result property="name" column="name"/>
            </resultMap>
           
            <!-- 获得所有列表 -->
            <statement id="getList" resultMap="pResultMap">
                SELECT *
                FROM person
            </statement>
                     
                          <!-- 插入一条记录-->
              <statement id="insertPerson" parameterClass="person">
            insert into person(id,name,age)
            values(#id#,#name#,#age#)
            </statement>
                        
            <!-- 更新一条记录-->
            <statement id="updatePerson" parameterClass="person">
            update person set
            name=#name#,
            age=#age#
            where id=#id#
            </statement>
            <!-- 删除一条记录-->
                         <statement id="deletePerson" parameterClass="int">
                      delete from person where id=#id#
                     </statement>
             <!-- 根据id加载-->
                      <statement id="getById" parameterClass="int" resultMap="pResultMap">
                      select *  from person where id=#id#
                  </statement>

               <!-- 根据map加载-->
            <statement id="getByMap" parameterClass="java.util.Map" resultMap="pResultMap">
                           select *  from person where name like #name# and age>=#age#
                    </statement>

            </sqlMap>

    <3> 客户端使用
        获得 SqlMapClient实例
                     Reader reader = Resources.getResourceAsReader("sqlMapConf.xml");
                SqlMapClient      sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
                 sqlMap.queryForList("getList")//getList为映射文件中的某个id
               
        //map条件使用示例

             Map map=new HashMap();
            map.put("name", "%a");
            map.put("age", 20);
            List<Person> list=qlMap.queryForList("getByMap",map);
            for(Person p:list)
            System.out.println(p.getName()+"--"+p.getId());

4  iBATIS事务

   看看上面连接数据库的配置
     <transactionManager type="JDBC" >
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver" value="${driver}"/>
            <property name="JDBC.ConnectionURL" value="${url}"/>
            <property name="JDBC.Username" value="${username}"/>
            <property name="JDBC.Password" value="${password}"/>
        </dataSource>
    </transactionManager>
     
        <transationManager>元素让您为SQL Map配置事务管理服务。
        属 性type指定所使用的事务管理器类型。
        这个属性值可以是一个类名,也可以是一个别 名。
        包含在框架的三个事务管理器分别是:JDBC,JTA和EXTERNAL。

        JDBC: 通过常用的Connection commit()和rollback()方法,让JDBC管理事务。

        JTA: 本事务管理器使用一个JTA全局事务,使SQL Map的事务包括在更大的事务范围内,
        这 个更大的事务范围可能包括了其他的数据库和事务资源。
        这个配置需要一个 UserTransaction属性,以便从JNDI获得一个UserTransaction。

        EXTERNAL: 这个配置可以让您自己管理事务。您仍然可以配置一个数据源,
        但事 务不再作为框架生命周期的一部分被提交或回退。
        这意味着 SQL Map外部应用的一部分必须自己管理事务。
        这个配置也可 以用于没有事务管理的数据库(例如只读数据库)。

             程序中启动事务
               qlMap.startTransaction();
            .........

              qlMap.commitTransaction();
               qlMap.endTransaction();



4  ibatis 分页
    一直以来ibatis的分页都是通过滚动ResultSet实现的,应该算是逻辑分页吧。逻辑分页虽然能很干净地独立于特定数据库,但效率在多数情
况下不及特定数据库支持的物理分页,而hibernate的分页则是直接组装sql,充分利用了特定数据库的分页机制,效率相对较高
 

      PaginatedList list = sqlMap.queryForPaginatedList (“getProductList”, 10);
      list.nextPage();
     list.previousPage();

     对于一个刚刚学习ibatis初学者来说,看到这个方法一定会很高兴,因为他可以让我们更加容易的进行过分页,但是当我们打开帮我文档的时候我们会发现这个方法已经过时了,我们于是可能会联想到是不是又有啥跟好的方法了,其实不是的,这个方法不像hibernate自带的分页方法,会根据不同的数据库进行优化,他完全是依赖jdbc驱动程序来实现分页的。

调用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()

他取出来的数据要放到内存中,这个一来,如果数据量很大的,会严重的影响系统的性能,因此我不建议大家使用这种方式进行分页


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/caolijunmingyan/archive/2010/01/19/5212441.aspx

5  spring 集成  ibaitis

     spring 中有一个类叫
        org.springframework.orm.ibatis.SqlMapClientFactoryBean  给它注入ibatis的配置文件以及datasource,用spring的datasource整合ibatis中的datasource
        配置如下
        <bean id="sqlMapClient"
        class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation">
        <description>
        iBATIS SQL Mapping配置文件名,系统要能够在CLASSPATH中找到该文件
        </description>
        <value>classpath:sqlmap-config.xml</value><!--对应文件在src目录下-->
        </property>

        <property name="dataSource"><ref local="dataSource"></ref></property><!--整合dataSource-->

        </bean>

       

        而在sqlmap-config.xml中则是存放其它的需要的配置文件资源
       
        <?xml version="1.0" encoding="GB2312"?>
        <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
        "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
        <sqlMapConfig>
        <settings cacheModelsEnabled="true"
        enhancementEnabled="false"
        lazyLoadingEnabled="false"
        maxRequests="3000"
        maxSessions="3000"
        maxTransactions="3000"
        useStatementNamespaces="false"/>
        <sqlMap resource="sqlmap-mapping-mailmanage.xml"/>
        </sqlMapConfig>

                 
         有了 SqlMapClient实例,我们就可以操作了


      当然spring 提供类SqlMapClientDaoSupport以及SqlMapClientTemplate(来对ibatis的支持


        使用的时候,我们只要继承SqlMapClientDaoSupport,并注入SqlMapClient实例 之
        那么.就可以在代码中.
        getSqlMapClientTemplate().queryForList(sqlStmID,param);
    
       

5  ibatis主键生成的不同数据库实现
        <!-- oracle Example -->
        <insert id="insertProduct-ORACLE" parameterClass="product">  
            <selectKey resultClass="int" type="pre" keyProperty="id" >  
            SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL  
            </selectKey>  
            insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)  
        </insert>  
          
        <!-- Microsoft SQL Server IDENTITY Column Example -->  
        <insert id="insertProduct-MS-SQL" parameterClass="product">  
            insert into PRODUCT (PRD_DESCRIPTION)  
            values (#description#)  
            <selectKey resultClass="int" type="post" keyProperty="id" >  
            select @@IDENTITY as value  
            </selectKey>  
        </insert>  
          
        <!-- MySQL Example -->  
        <insert id="insertProduct-MYSQL" parameterClass="product">  
            insert into PRODUCT (PRD_DESCRIPTION)  
            values (#description#)  
            <selectKey resultClass="int" type="post" keyProperty="id" >  
            select LAST_INSERT_ID() as value  
            </selectKey>  
        </insert>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值