`
Jameslyy
  • 浏览: 401929 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iBATIS tips

阅读更多

1、iBATIS的配置文件

2、对象映射文件

3、编写应用程序

4、自动生成主键

5、DB2保存数据空值问题

6、传入参数

7、Result Map

8、复杂类型属性

9、缓存Mapped Statement结果集

10、动态Mapped Statement

11、事务处理

12、批处理

13、分页查询

14、Ibator

 

      iBATIS 在Java和.NET两种环境下都可以使用,它使得使用数据库变得很容易,iBATIS 通过XML描述文件确定对象和存储过程/SQL语句之间的对应关系。简单是iBATIS DATA Mapper 作为对象关系映射工具最大的优点。

      要使用iBATIS Data Mapper,依赖于你的对象、XML、SQL,不需要学习很多你不知道的东西,iBATIS Data Mapper 就可以很方便地获得SQL和存储过程全部强大的能力。

 

      Hibernate、Apache OJB这类ORM框架拥有自己的查询语言,和他们不同的是,iBATIS直接使用SQL,这具有局限性,也就是不能跨数据库使用,需要针对每一种数据库调整SQL语句,但也拥有很大的优点,直接使用SQL使得框架实现变得很简单,映射效率上的可能空间更大一些,可以直接使用SQL实现更高的数据库访问效率,直接使用SQL的特性使得iBATIS在某一些应用环境下更为适合开发的要求。

 

1、 iBATIS的配置文件:

<?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">
	<!-- Always ensure to use the correct XML header as above! -->
	<sqlMapConfig>
	
	<!-- The properties (name=value) in the file specified here can be used placeholders 
              in this config file (e.g. “${driver}”. 
               The file is relative to the classpath and is completely optional. -->
	<properties resource="com/ibatis/SqlMapConfig.properties" />
	
	<!-- These settings control SqlMap configuration details, primarily to do with 
              transaction management. They are all optional (see the Developer Guide 
              for more). -->
	<settings
		cacheModelsEnabled="true"
		enhancementEnabled="true"
		lazyLoadingEnabled="true"
		maxRequests="32"
		maxSessions="10"
		maxTransactions="5"
		useStatementNamespaces="false"
	/>

	<!-- Type aliases allow you to use a shorter name for long fully 
              qualified class names. -->
	<typeAlias alias="order" type="testdomain.Order"/>

	<!-- Configure a datasource to use with this SQL Map using SimpleDataSource.
		Notice the use of the properties from the above resource -->
	<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}"/>
			
			<!-- SIMPLE -->
			<property name="JDBC.DefaultAutoCommit" value="true" />
			<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 ACCOUNT"/>
			<property name="Pool.PingEnabled" value="false"/>
			<property name="Pool.PingConnectionsOlderThan" value="1"/>
			<property name="Pool.PingConnectionsNotUsedFor" value="1"/>
		</dataSource>
	</transactionManager>

	<!-- Identify all SQL Map XML files to be loaded by this SQL map. Notice the paths
		are relative to the classpath. For now, we only have one -->
	<sqlMap resource="com/ibatis/sample/User.xml" />

	<!-- <sqlMap url="file:///c:/config/User.xml " /> -->
	
</sqlMapConfig>
 

事务管理器别名
    JDBC      com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig
    JTA       com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig
    EXTERNAL com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig

Data Source Factory别名
    SIMPLE    com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory
    DBCP      com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory
    JNDI      com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory

 

DBCP的配置

    <property name="Pool.MaximumActiveConnections" value="10"/>
    <property name="Pool.MaximumIdleConnections" value="5"/>
    <property name="Pool.MaximumWait" value="60000"/>

    <!-- 
          Use of the validation query can be problematic.If you have difficulty, 
          try without it. 
    -->
    <property name="Pool.ValidationQuery" value="select 1 from ACCOUNT"/>
    <property name="Pool.LogAbandoned" value="false"/>
    <property name="Pool.RemoveAbandoned" value="false"/>
    <property name="Pool.RemoveAbandonedTimeout" value="50000"/>

 

JNDI JTA

<transactionManager type="JDBC" >
    <dataSource type="JNDI">
          <property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
    </dataSource>
</transactionManager>

<transactionManager type="JTA" >
    <property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>
    <dataSource type="JNDI">
          <property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
    </dataSource>
</transactionManager>

 

2、对象映射文件

<sqlMap id=”Product”>
    <cacheModel id=”productCache” type=”LRU”>
        <flushInterval hours=”24”/>
        <property name=”size” value=”1000” />
    </cacheModel>
    <typeAlias alias=”product” type=”com.ibatis.example.Product” />
    <parameterMap id=”productParam” class=”product”>
        <parameter property=”id”/>
    </parameterMap>
    <resultMap id=”productResult” class=”product”>
        <result property=”id” column=”PRD_ID”/>
        <result property=”description” column=”PRD_DESCRIPTION”/>
    </resultMap>
    <select id=”getProduct” parameterMap=”productParam” 
       resultMap=”productResult” cacheModel=”product-cache”>
            select * from PRODUCT where PRD_ID = ?
    </select>
</sqlMap>

 

也可以简化 来写:

<sqlMap id=”Product”>
	<select id=”getProduct” parameterClass=” com.ibatis.example.Product”
           resultClass=”com.ibatis.example.Product”>
		select
			PRD_ID as id,
			PRD_DESCRIPTION as description
		from PRODUCT
		where PRD_ID = #id#
	</select>
</sqlMap>
 

为了在SQL语句中使用特殊符号 可以把SQL放在XML中的CDATA 里面:

<statement id="getPersonsByAge" parameterClass=”int” 
    resultClass="examples.domain.Person">
	<![CDATA[
	SELECT *
	FROM PERSON
	WHERE AGE > #value#
	]]>
</statement>

 

3、编写应用程序

import com.ibatis.common.resources.Resources;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

try {
    String resource = "com/simple/SqlMapConfig.xml";
    Reader reader = Resources.getResourceAsReader(resource);
    SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
    e.printStackTrace();
    throw new RuntimeException(
    "Error initializing TourPlanIBatisConfig class. Cause: " + e);
}

 

SqlMapClient 接口拥有各种操作数据库的方法,例如:

    sqlMap.queryForObject (“getPerson”, personPk);

    sqlMap.update(“updatePerson”, person);

 

4、自动生成主键

<!—Oracle SEQUENCE Example -->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
	<selectKey resultClass="int" keyProperty="id" >
		SELECT STOCKIDSEQUENCE.NEXTVAL AS ID 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="com.domain.Product">
	insert into PRODUCT (PRD_DESCRIPTION)
	values (#description#)
	<selectKey resultClass="int" keyProperty="id" >
		SELECT @@IDENTITY AS ID
	</selectKey>
</insert>
 

大多数数据库的写法如下:

<selectKey>
	Cloudscape  VALUES IDENTITY_VAL_LOCAL()
	DB2         VALUES IDENTITY_VAL_LOCAL()
	Derby       VALUES IDENTITY_VAL_LOCAL()
	HSQLDB      CALL IDENTITY()
	MySql       SELECT LAST_INSERT_ID()
	SqlServer   SELECT SCOPE_IDENTITY()
	SYBASE      SELECT @@IDENTITY
	ORACLE      SELECT CUSTOM_SQL.NEXTVAL AS ID FROM DUAL 

 

5、DB2保存数据空值问题

    iBATIS使用prepareStatement,在没有显示mapping定义数据类型的情况下,首先使用参数值的java类型决定传输给prepareStatement的参数类型,如果参数是值是null,则使用Type.OTHER 。在DB2的driver下,Type.OTHER类型不能正确执行。要解决这个问题,就要在mapping中显示声明参数(列)的类型:
        1、对于bean参数进行可以如下声明:

            <insert  id="userInsert" parameterClass="com.sample.User">
                     insert into USER(USERID) VALUES (#userId:VARCHAR#)
            </insert>

        2、对于map参数,可以使用parameterMap定义每个参数的类型
            <parameterMap class="com.sample.User" id="userMap">
                   <parameter  property="userId" typeName="VARCHAR"  />
            </parameterMap>

 

6、传入参数

 

    parameterMap

<parameterMap id=”insert-product-param”     class=”com.domain.Product”>
    <parameter property=”id” jdbcType=”NUMERIC” javaType=”int” nullValue=”-9999999”/>
    <parameter property=”description” jdbcType=”VARCHAR” nullValue=”NO_ENTRY”/>
    </parameterMap>
<statement id=”insertProduct” parameterMap=”insert-product-param”>
    insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);
</statement>
 

    Inline Parameter Map

<statement id=”insertProduct”    parameterClass=”com.domain.Product”>
    insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
values (#id#, #description#);
</statement>
在内嵌参数中指定数据类型可以用下面的语法:
<statement id=”insertProduct”   parameterClass=”com.domain.Product”>
    insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
    values (#id:NUMERIC#, #description:VARCHAR#);
</statement>
在内嵌参数中指定数据类型和NULL的替代值可以用这样的语法:
<statement id=”insertProduct”   parameterClass=”com.domain.Product”>
    insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
    values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);
</statement>
 

    基本类型输入参数

<statement id=”insertProduct” parameter=”java.lang.Integer”>
    select * from PRODUCT where PRD_ID = #value#
</statement>
 

    Map类型输入参数

<statement id=”insertProduct” parameterClass=”java.util.Map”>
    select * from PRODUCT
    where PRD_CAT_ID = #catId# and PRD_CODE = #code#
</statement>

 

7、Result Map

<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
    <result property=”id” column=”PRD_ID”/>
    <result property=”description” column=”PRD_DESCRIPTION”/>
    <result property=”subCode” column=”PRD_SUB_CODE” nullValue=”-999”/>
</resultMap>

 

    隐式的Result Map

<statement id=”getProduct” resultClass=”com.ibatis.example.Product”>
    select
    PRD_ID as id,
    PRD_DESCRIPTION as description
    from PRODUCT
    where PRD_ID = #value#
</statement>

 

    基本类型的Result(即String,Integer,Boolean)

<resultMap id=”get-product-result” class=”java.lang.String”>
    <result property=”value” column=”PRD_DESCRIPTION”/>
</resultMap>

<statement id=”getProductCount” resultClass=”java.lang.Integer”>
    select count(1) as value
    from PRODUCT
</statement>

 

    Map类型的Result

<resultMap id=”get-product-result” class=”java.util.HashMap”>
    <result property=”id” column=”PRD_ID”/>
    <result property=”code” column=”PRD_CODE”/>
    <result property=”description” column=”PRD_DESCRIPTION”/>
    <result property=”suggestedPrice” column=”PRD_SUGGESTED_PRICE”/>
</resultMap>
 

8、复杂类型属性

<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
    <result property=”id” column=”PRD_ID”/>
    <result property=”description” column=”PRD_DESCRIPTION”/>
    <result property=”category” column=”PRD_CAT_ID” select=”getCategory”/>
</resultMap>
<resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
    <result property=”id” column=”CAT_ID”/>
    <result property=”description” column=”CAT_DESCRIPTION”/>
</resultMap>
<statement id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>
    select * from PRODUCT where PRD_ID = #value#
</statement>
<statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>
    select * from CATEGORY where CAT_ID = #value#
</statement>
 

 避免N+1 Select(1:1)

<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
    <result property=”id” column=”PRD_ID”/>
    <result property=”description” column=”PRD_DESCRIPTION”/>
    <result property=”category.id” column=”CAT_ID” />
    <result property=”category.description” column=”CAT_DESCRIPTION” />
</resultMap>
<statement id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>
    select *
    from PRODUCT, CATEGORY
    where PRD_CAT_ID=CAT_ID
    and PRD_ID = #value#
</statement>

 

 复杂类型集合的属性

<resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
    <result property=”id” column=”CAT_ID”/>
    <result property=”description” column=”CAT_DESCRIPTION”/>
    <result property=”productList” column=”CAT_ID” select=” getProductsByCatId”/>
</resultMap>
<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
    <result property=”id” column=”PRD_ID”/>
    <result property=”description” column=”PRD_DESCRIPTION”/>
</resultMap>
<statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>
    select * from CATEGORY where CAT_ID = #value#
</statement>
<statement id=”getProductsByCatId” parameterClass=”int” resultMap=”get-product-result”>
    select * from PRODUCT where PRD_CAT_ID = #value#
</statement>

 

 组合键值或多个复杂参数属性

<resultMap id=”get-order-result” class=”com.ibatis.example.Order”>
    <result property=”id” column=”ORD_ID”/>
    <result property=”customerId” column=”ORD_CST_ID”/>
    …
    <result property=”payments” column=”{itemId=ORD_ID, custId=ORD_CST_ID}”
select=” getOrderPayments”/>
</resultMap>
<statement id=”getOrderPayments” resultMap=”get-payment-result”>
    select * from PAYMENT
    where PAY_ORD_ID = #itemId#
            and PAY_CST_ID = #custId#
</statement>

 

9、缓存Mapped Statement结果集

    通过在查询statement中指定cacheModel属性,可以缓存Mapped Statement中得到的查询结果。

Cache model是在SQL Map XML文件中定义的可配置缓存模式,可以使用cacheModel元素来配置。

<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name=”cache-size” value=”1000” />
</cacheModel>

LRU: 近期最少使用

 

<statement id=”getProductList” cacheModel=”product-cache”>
    select * from PRODUCT where PRD_CAT_ID = #value#
</statement>

 

缓存类型:

    “MEMORY” (com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)

          只对“reference-type”属性产生作用,value:STRONG,SOFT和WEAK,默认WEAK。

          <property name=”reference-type” value=”WEAK” />

    “LRU” (com.ibatis.db.sqlmap.cache.lru.LruCacheController)

          “近期最少使用”原则。只对“cache-size”属性产生作用。

          <property name=”cache-size” value=”1000” />

    “OSCACHE” (com.ibatis.db.sqlmap.cache.oscache.OSCacheController)

 

10、动态Mapped Statement

<statement id="dynamicGetAccountList" resultMap="account-result" >
    select * from ACCOUNT
    <dynamic prepend="WHERE">
        <isNotNull prepend="AND" property="firstName">
            (ACC_FIRST_NAME = #firstName#
            <isNotNull prepend="OR" property="lastName">
               ACC_LAST_NAME = #lastName#
            </isNotNull>
            )
        </isNotNull>
        <isNotNull prepend="AND" property="emailAddress">
            ACC_EMAIL like #emailAddress#
        </isNotNull>
        <isGreaterThan prepend="AND" property="id" compareValue="0">
            ACC_ID = #id#
        </isGreaterThan>
    </dynamic>
    order by ACC_LAST_NAME
</statement>

 

11、事务处理

String resource = “com/ibatis/example/sqlMap-config.xml”;
Reader reader = Resources.getResourceAsReader (resource);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMap(reader);

 

public void startTransaction () throws SQLException
public void commitTransaction () throws SQLException
public void endTransaction () throws SQLException
 

 

private Reader reader = new Resources.getResourceAsReader(
        "com/ibatis/example/sqlMapconfig.xml");
private SqlMapClient sqlMap = XmlSqlMapBuilder.buildSqlMap(reader);

public updateItemDescription (String itemId, String newDescription) throws SQLException {
    try {
        sqlMap.startTransaction ();
        Item item = (Item) sqlMap.queryForObject ("getItem", itemId);
        item.setDescription (newDescription);
        sqlMap.update ("updateItem", item);
        sqlMap.commitTransaction ();
    } finally {
        sqlMap.endTransaction ();
    }
}

      事务不能嵌套。在调用commit()或rollback()之前,从同一线程多次调用.startTransaction,将引起抛出例外。换句话说,对于每个SqlMap实例,每个线程最多只能打开一个事务。
      SqlMapClient事务处理使用Java的ThreadLocal保存事务对象。这意味着在处理事务时,每个调用startTransaction()的线程,将得到一个唯一的Connection对象。将一个Connection对象返回数据源(或关闭连接)唯一的方法是调用commitTransaction()或rollbackTransaction()方法。否则,会用光连接池中的连接并导致死锁。

 

12、批处理

sqlMap.startBatch();
//…execute statements in between
sqlMap.executeBatch();
 

13、分页查询

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

14Ibator:iBatis 的自动生成工具

    http://ibatis.apache.org/ibator.html

    建议: 如果使用 Ibator,就不要试图去修改其生成的代码,能够使用就可以了,不然会带来很大麻烦。如果需要自己编写定制的、高性能的SQL,就不要使用Ibator了。

 

 

 

分享到:
评论
2 楼 lhb3015 2011-12-13  
                   
1 楼 lelejpmc 2009-01-21  
clean & straight forward, very helpful, thanks a lot!

相关推荐

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将SQL语句与Java代码分离,从而更好地管理数据库操作。Ibatis的出现,解决了传统JDBC中手动编写SQL和结果集映射的繁琐工作,...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    《深入解析iBatis源码》 iBatis,一个优秀的Java持久层框架,以其轻量级、灵活的特性在众多ORM(Object-Relational Mapping)框架中独树一帜。iBatis的核心在于它的SQL映射机制,它将数据库操作与业务逻辑解耦,...

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    iBATIS DAO是Java开发中的一个持久层框架,它提供了数据访问对象(DAO)的实现,使得数据库操作更加简单和灵活。在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好...

    Ibatis入门例子,Ibatis教程

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写SQL语句上,而无需关注JDBC代码的编写。Ibatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的...

    ibatis教程,ibatis帮助文档

    iBATIS是一个由Clinton Begin创建,目前由Apache基金会支持的持久化框架,它专注于数据库查询的简化,尤其在JDBC编程方面提供了极大的便利。相对于全自动化ORM解决方案如Hibernate,iBATIS被称为“半自动化”ORM实现...

    ibatis api,ibatis文档,ibatis说明文档

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,将数据库操作与业务逻辑解耦,使得开发者可以更专注于业务逻辑的实现,而无需关心繁琐的SQL语句编写。本篇文章将深入探讨Ibatis API、文档...

    Ibatis3手册 Ibatis3参考手册

    ### Ibatis3手册知识点概述 Ibatis3作为一款流行的持久层框架,在软件开发领域具有重要的地位。本篇文章基于“Ibatis3手册 Ibatis3参考手册”的标题及描述,深入解析Ibatis3的核心概念、架构特点以及如何进行实际...

    ibatis2指南及ibatis包

    ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南

    ibatis应对批量update

    ### ibatis应对批量update 在处理大量数据更新时,传统的for循环方式往往会导致效率低下。这是因为每一次循环都需要执行一次数据库连接操作,对于批量更新来说,这样的处理方式显然不够高效。为了解决这个问题,...

    iBatis开发指南和一个iBatis实例

    iBatis是一个轻量级的Java持久层框架,它提供了SQL映射框架,将SQL语句与Java代码分离,使得数据库访问更为灵活和可控。在本压缩包中,你将找到一系列关于iBatis的学习资源,包括PDF文档、实例代码等,这些都是深入...

    ibatis api 帮助文档+IBATIS 开发文档

    **IBATIS API 帮助文档与IBATIS开发文档详解** IBATIS,一个由iBATIS公司开发的开源持久层框架,是Java世界中广泛使用的数据访问接口(DAO)工具。它允许开发者将SQL语句直接写在XML配置文件中,实现了SQL与Java...

    Spring与iBATIS的集成

    Spring与iBATIS的集成 iBATIS似乎已远离众说纷纭的OR框架之列,通常人们对非常流行的Hibernate情有独钟。但正如Spring A Developer's Notebook作者Bruce Tate 和Justin Gehtland所说的那样,与其他的OR框架相比...

    Ibatis

    **Ibatis 指南** Ibatis 是一个优秀的开源持久层框架,它允许开发者将 SQL 查询与 Java 代码分离,从而避免了传统的 JDBC 编程中的大量模板代码。作为一个轻量级的框架,Ibatis 提供了灵活的映射机制,使得 XML 或...

    iBATIS实战.pdf

    《iBATIS实战》是讲述iBATIS框架的权威著作。书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。《iBATIS实战》的最后给出了一个...

    Ibatis 入门经典 实例

    《Ibatis 入门经典 实例》 Ibatis 是一款著名的轻量级 Java 持久层框架,它提供了一种映射 SQL 和 Java 对象的简单方式,从而减轻了开发人员在数据库操作中的工作负担。这篇实例教程将带你深入理解 Ibatis 的核心...

    Spring+ibatis 保留ibatis事务的配置

    根据提供的文件信息,本文将详细解析如何在Spring与ibatis框架整合时,通过特定配置来保留ibatis事务处理机制,并实现对事务的自定义控制。文章将围绕标题、描述及部分代码片段展开讨论。 ### Spring与ibatis整合...

    C# IBatis IBatis基础 完整项目

    【标题】:“C# IBatis IBatis基础 完整项目” 【描述】中提到的是一个基于C#的IBatis学习项目,适用于初学者。IBatis是一个流行的数据访问层框架,它允许开发者将SQL语句与应用程序代码分离,提高了代码的可维护性...

    ibatis

    Ibatis 是一个优秀的Java持久层框架,它提供了一个SQL映射框架,使开发者能够将SQL语句与Java代码分离,从而实现数据访问层的解耦合。Ibatis 的设计目标是简化开发工作,减少JDBC代码量,提高开发效率,并且在数据库...

    ibatisDemo 入门源码

    《IbatisDemo入门源码详解》 IbatisDemo是一个典型的基于Ibatis框架的入门示例,它为我们展示了如何在Java项目中使用Ibatis进行数据库操作。Ibatis,一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件...

Global site tag (gtag.js) - Google Analytics