`

iBATIS

    博客分类:
  • J2EE
阅读更多
iBATIS wiki:
http://opensource.atlassian.com/confluence/oss/display/IBATIS/Home

http://opensource.atlassian.com/confluence/oss/pages/viewpage.action?pageId=407

http://opensource.atlassian.com/confluence/oss/display/IBATIS/Why+can't+I+get+selectKey+and+sequences+to+work+properly+with+Oracle

http://www.blogjava.net/rosen/archive/2005/08/12/9932.html

Ibatis学习随笔
http://www.blogjava.net/pdw2009/archive/2007/01/04/91844.html


关于<resultMap>中的<result>与使用此resultMap的<select>里sql中select到的字段的对应:
select到的字段可以不映射到<resultMap>的<result>中;
<resultMap>的<result>上的column属性,必须在sql的select中有对应的查找到的字段!
即:<resultMap>里的<result>数目 <= 使用此resultMap的<select>里sql select到的字段数目

isNotNull与isNotEmpty区别
isNotNull判断参数是否存在,Integer类型
isNotEmpty判断字串不为空,isEmpty可以判断字串为空


ibatis mapping 时 井号和美元符号的区别
引用

在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如:

select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是'id'类型,如果id为整型,那么#id#就是id类型。

select * from table where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成 select * from table where id = '$id$'



Ibatis传入数组参数
http://blog.csdn.net/xinyu173089/archive/2009/07/19/4361610.aspx


namespace & typeAlias type in sqlMap.xml:
<sqlMap namespace="SomeEntity">
  <typeAlias alias="someEntity" type="com.xxx.SomeEntity" />
  ...
</sqlMap>
namespace 一般请写成首字母大写,typeAlias 一般请写成首字母小写;如果想在Dao中使用 namespace,还记得在 sql-map-config.xml 中配置 useStatementNamespaces="true":
<sqlMapConfig>
    <settings
        ...
        useStatementNamespaces="true"
    />
</sqlMapConfig>
public class SomeEntityDaoImpl extends SqlMapClientDaoSupport implements SomeEntityDao {
  public void insert(SomeEntity someEntity) {
    this.getSqlMapClientTemplate().insert("SomeEntity.insert", someEntity);
  }
}




Return id on Insert with iBatis:
http://stackoverflow.com/questions/1769688/howto-return-ids-on-inserts-with-ibatis-with-returning-keyword
引用
多种方式,sql 中拼 RETURNING id;在 insert 元素下使用 selectKey 元素,等;另外 mybatis中新增了(ibatis中没有的)另一种方式:在 insert 元素上使用 useGeneratedKeys 标签,详见:
http://mybatis.github.io/mybatis-3/sqlmap-xml.html#insert_update_and_delete




Ibatis 关于空值(NULL)的处理:
http://blog.sina.com.cn/s/blog_520998920100b4d3.html
引用

使用Ibatis作为数据库持久层的人都有体会,Ibatis 对NULL值的处理并不优雅.本文讨论常见的NULL值处理方案.jdbcType 应该是java.sql.Types 中所列举的类型中的一种.
1.String为NULL的处理:拿SQL Server 来说,其中与String对应的类型有很多种,如VARCHAR,NVARCHAR,TEXT...如果存入数据库中的值有可能为NULL的时候,我们只要在插入或者更新的时候指定它的类型为VARCHAR,或者LONGVARCHAR,对应TEXT类型,(注意不能为NVARCHAR,和LONGNVARCHAR):如下
<update id="update">
   UPDATE [ArtT_user]
   SET [ArtT_sUserName] = #userName#
      ,[ArtT_sUserPwd] = #password#
      ,[ArtT_sUserEmail] = #userEmail:VARCHAR#
      ,[ArtT_sUserDescription] = #description:LONGVARCHAR#
     WHERE [ArtT_iUserId] = #userId#
  </update>
如果属性userEmail,description为空时,Ibatis把NULL存入数据库.
数据库取出值为NULL,对应的属性为String类型的时候,无需作特别处理,Ibatis会把相应属性设置为空.

2.date ,datetime的处理:与String的处理相类似,插入或者更新数据时,应该指定日期的类型,DATE 或者TIMESTAMP,如下:
<update id="update">
   UPDATE [ArtT_user]
   SET [ArtT_sUserName] = #userName#
      ,[ArtT_sUserPwd] = #password#
      ,[ArtT_dLastLoginTime] = #lastLoginTime:TIMESTAMP#
      ,[ArtT_sCreateDate] = #createDate:DATE#
WHERE [ArtT_iUserId] = #userId#
  </update>
同时,从数据库中取出值时,在resultMap中也应该指定明确的类型,DATE 或者DATETIME,如下:
<result property="lastLoginTime"column="ArtT_dLastLoginTime" columnIndex="12"jdbcType="TIMESTAMP"/>
<result property="createDate" column="ArtT_sCreateDate" columnIndex="13" jdbcType="DATE"/>
3.int,double,float的处理:根据Ibatis 官方文档介绍,因为在javaBean中如果属性为int ,double, float 时,不允许设置为NULL,可以采用一个"神奇数字"来代替属性中的NULL,如-9999.
数据存入数据库时,当检测到属性值为-9999时,Ibatis把空值存入数据库中.
数据从数据库中取出时,当数据库中该字段为NULL时,Ibatis给javaBean中的属性赋值为-9999.
因此,在XML映射文件中,应该同时在存入与取出处指定nullValue='-9999',否则容易导致数据库的不一致.
这种做法虽然保证了数据库的一致性,但对程序来说并不雅观,在程序中如果要判断该属性是否为空,只要判断它是否等于"神奇数字",不得已而为之.

总结:ibatis对实体类的未赋值属性的处理:非基本类型未赋值为null,如果未作“是否为Null”判断直接对某未赋值属性做update,update之会该属性的null会冲掉库中对应字段已有数据(字段被置为空);基本类型未赋值的话有默认值(如int默认0),未对该基本类型属性赋值情况下做update,会不会用默认值冲掉库中字段值那?应该会(待验证); 所以,在使用ibatis时,对应实体的属性请使用非基本类型,基本类型用其包装类,从而在做update时使未赋值字段能统一使用"是否为Null"做判断条件来决定是否update该字段





关于<procedure>:
Oracle REF CURSOR Solutions:
http://www.apachebookstore.com/confluence/oss/display/IBATIS/Oracle+REF+CURSOR+Solutions
Ibatis访问存储过程的配置:
http://www.alisdn.com/wordpress/?cat=6&paged=2
Oracle/PLSQL: Procedure that outputs a dynamic PLSQL cursor:
http://www.techonthenet.com/oracle/questions/cursor1.php
使用oracle REF CURSOR的例子(scott用户):
CREATE OR REPLACE PROCEDURE p_refcursor_test (
       in_field IN VARCHAR2,
       in_value IN VARCHAR2,
       rslt_cur OUT SYS_REFCURSOR
) IS
  str_sql VARCHAR2(300);
  TYPE t_EmpRecord IS RECORD(
                ename emp.ename%TYPE,
                job emp.job%TYPE,
                sal emp.sal%TYPE
                );
  
  v_EmpRecord t_EmpRecord;
BEGIN
  str_sql := 'SELECT ename,job,sal FROM emp ';
  
  IF(length(in_field)>0) and (length(in_value)>0)
   THEN
       str_sql := str_sql || 'WHERE ' || in_field || ' like ''%' || in_value || '%''';
  END IF;
  
  dbms_output.put_line(str_sql);
  --execute immediate str_sql; --动态执行
  OPEN rslt_cur FOR str_sql;


--如果这个procedure是被java程序调用的(如ibatis中的<procedure>),则这里不可以fetch该rslt_cur,要将下面这个loop循环给注掉!!!否则返回给java ResultSet的结果集将会是空的 
  LOOP
       FETCH rslt_cur INTO v_EmpRecord;
       EXIT WHEN rslt_cur%NOTFOUND;
       DBMS_OUTPUT.PUT_LINE('名字: ' || v_EmpRecord.ename ||
                                        ' 工作: ' || v_EmpRecord.job ||
                                        ' 薪水: ' || v_EmpRecord.sal
                                        );
     
     END LOOP;

--With the ref cursor, you're doing everything you need to. That is the way it is done. The caller (your Java program) is responsible for the "close" call -- you don't do that in PL/SQL when the client fetches from the cursor

  EXCEPTION
    when others then
    DBMS_OUTPUT.PUT_LINE('------>' ||SQLERRM);
END p_refcursor_test;





iBATIS Many TO Many:
iBATIS多对多映射:
http://blog.csdn.net/aloie/archive/2009/06/22/4289264.aspx
iBatis2学习笔记:多对多映射(双向):
http://lavasoft.blog.51cto.com/62575/83905
iBATIS一对多/多对多N+1问题解决方案:
http://www.iteye.com/topic/544207




常用Map写法:
1 like:
<dynamic prepend="where">
		<isNotEmpty prepend="AND" property="customerId">
			CUSTNO like '%$customerId$%'
		</isNotEmpty>
		<isNotEmpty prepend="AND" property="name">
			CUSTNAME like '%$name$%'
		</isNotEmpty>
	</dynamic>	

注:这里的 '%$customerId$%' 如果改为 '%$customerId:VARCHAR$%' ,是不行的,最终输出sql会变为 " like '%%' "
2 传入数组:
WHERE parc.par_cat_id = 'SO'
		<iterate open="" close="" conjunction="" property="selectedParIds">
			<isNotEmpty prepend="" property="selectedParIds[]" > 
				AND parc.PAR_ID != #selectedParIds[]#
			 </isNotEmpty> 
	    </iterate>




Abator —— IBatis 代码生成工具
http://ibatis.apache.org/docs/tools/abator/
其对应的MyBatis工具为:https://code.google.com/p/mybatis/wiki/Generator
引用
Abator可以用来生成数据库表对应的: POJOs / Map XML / DAO。
作为eclipse插件的安装url为 http://ibatis.apache.org/tools/abator
安装后在eclipse中File - new - Abator for iBatis Configration File新建Abator配置文件。
配置文件样子和解释:
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE abatorConfiguration PUBLIC "-//Apache Software Foundation//DTD Abator for iBATIS Configuration 1.0//EN"   
  "http://ibatis.apache.org/dtd/abator-config_1_0.dtd">  
<abatorConfiguration>  
  <abatorContext>    <!-- TODO: Add Database Connection Information -->  
    <jdbcConnection driverClass="???"  
        connectionURL="???"  
        userId="???"  
        password="???">  
      <classPathEntry location="???" />  
    </jdbcConnection>  
    <javaModelGenerator targetPackage="???" targetProject="???" />  
    <sqlMapGenerator targetPackage="???" targetProject="???" />  
    <daoGenerator type="IBATIS" targetPackage="???" targetProject="???" />  
    <table schema="???" tableName="???">  
      <columnOverride column="???" property="???" />  
    </table>  
  </abatorContext>  
</abatorConfiguration>  
你需要做的是替换一些???:
1. 填写driverClass(jdbc驱动,例如oracle的就是oracle.jdbc.driver.OracleDriver)
2. 填写connectionURL(连接字符串,例如oracle的就是jdbc:oracle:thin:@192.168.0.246:1521:test)
3. 填写classPathEntry的location(jdbc驱动jar包的位置,例如E:/project/ibatistest/WebContent/WEB-INF/lib/ojdbc14.jar)
4. 填写javaModelGenerator,生成的DTO(java model 类)
    targetPackage:目标包的位置,如 com.test.dto
    targetProject:目标工程名称,填写配置文件所在的eclipse工程名
5. 填写sqlMapGenerator ,生成的xml sqlmap的相关配置
    targetPackage:目标位置,如 com.test.sqlmap
    targetProject:目标工程名称,填写配置文件所在的eclipse工程名
6. 填写daoGenerator ,生成的DAO的相关配置
    type:生成的dao实现的类型,如果你使用spring的话写SPRING,否则写IBATIS
    targetPackage:目标位置,如 com.test.dao
    targetProject:目标工程名称,填写配置文件所在的eclipse工程名
7. 配置相关数据库的表
    schema:数据库schema,oracle就是填写数据库的用户名
    tableName:表名

关于:
<columnOverride column="???" property="???" .../>  

用来定制某列所对应实体类属性的属性名、类型等。该element的属性有:column property javaType jdbcType typeHandler delimitedColumnName。其中只有column是必选的。参见:
http://ibatis.apache.org/docs/tools/abator/configreference/columnOverride.html
如:
<columnOverride column="WIDTH_HV" javaType="Double"/>

则表的WIDTH_HV列对应的实体类属性名字为widthHv(columnOverride未指定property属性,故ibatis使用默认的方式),其类型为java.lang.Double。


如果是想为数据库某schema下的所有表生成POJOs/Map XML/DAO,可以使用 %:
<table schema="MySchema" tableName="%" /> 
    This will pick all tables in the schema. 
</table>


生成POJOs / Map XML / DAO:
在配置文件上点解右键,选择 “Generate iBatis Artifacts”

反过来,iBatis可以做DDL操作吗?
和Hibernate不同,iBatis并没有提供对DDL操作的直接支持,尽管可以通过形如下的方式来做DDL操作:
<statement id="createT"> 
    CREATE TABLE T(...); 
</statement>
但并不推荐这种方式。在<statement>里写create语句,你图个什么?脱了裤子撒尿多此一举。
http://stackoverflow.com/questions/5559210/ibatis-creating-a-table
分享到:
评论

相关推荐

    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的工作原理,并通过添加注释来帮助我们更好...

    Spring与iBATIS的集成

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

    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独立)

    在IT行业中,数据库操作是必不可少的一部分,而Ibatis作为一款流行的Java持久层框架,它使得SQL与Java代码更好地结合,提供了灵活的数据库操作方式。然而,数据处理时遇到的编码问题,如乱码,常常会给开发者带来...

    iBATIS2.3.4 jar包及源码

    iBATIS 是一款著名的开源Java持久层框架,它在2005年由Clinton Begin创建,最初命名为Apache MyBatis,后来发展为独立的项目。在本主题中,我们关注的是iBATIS 2.3.4版本的jar包及其源码。 首先,`ibatis-2.3.4.jar...

    ibatis应对批量update

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

    ibatis官方资料及所需要的Jar包

    Ibatis官方资料大全提供了全面的学习资源,包括ibatis-common.jar、ibatis-Dao.jar和ibatis-sqlmap.jar等核心组件的详细讲解和相关jar文件,是学习和使用Ibatis不可或缺的参考资料。 首先,我们来了解一下ibatis-...

    ibatis 自己学的一个ibatis项目(只是打通了Oracle) 非常适合入门

    自己写了一个Ibatis入门文件 JDK用的1.4 ibatis用的2.3.0 一定要注意版本问题,不然出现本本不兼容很费劲,我调了一上午,注意一定要用JDK1.4 ibatis2.3.0! 数据库自己建一张简单的表就行了,特别说明 只适合新手...

    ibatis_with_memcached

    本项目"ibatis_with_memcached"就是关于如何将Ibatis与Memcached集成,实现高效的数据库缓存策略的实例。 Ibatis是一个基于Java的SQL映射框架,它允许开发者编写SQL语句并与Java对象进行绑定,从而避免了传统的JDBC...

    ibatis教程 输入参数详解

    标题:ibatis教程 输入参数详解 描述:ibatis教程 输入参数详解 ibatis快速入门 标签:ibatis list 部分内容:这段部分提供了ibatis用户指南的警告,关于从文档复制代码的问题,以及ibatis的概述、如何开始使用...

    maven整合ibatis的简单例子

    在Java开发中,Maven和iBatis是两个非常重要的工具。Maven是一个项目管理和综合工具,它帮助开发者管理依赖、构建项目,并提供了一种标准化的项目结构。而iBatis则是一个SQL映射框架,它将SQL语句与Java代码分离,...

    Ibatis3手册 Ibatis3参考手册

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

    Ibatis 入门经典 实例

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

    ibatis拼接字符串

    在本篇文章中,我们将深入探讨如何使用 Java 编程语言结合 iBatis 框架进行 SQL 字符串的动态拼接。通过分析提供的代码片段,我们可以了解到在实际开发过程中,这种动态 SQL 的构建方式非常常见,尤其是在处理复杂的...

    spring ibatis整合所需jar包

    在Java Web开发中,Spring和iBatis是两个非常重要的框架。Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、事务管理等特性,而iBatis则是一个优秀的持久层框架,它将SQL语句与Java代码分离,...

    Ibatis入门例子,Ibatis教程

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

    ibatis-2.3.0.677.jar

    标题 "ibatis-2.3.0.677.jar" 指向的是一个特定版本的 iBATIS 库,即版本号为 2.3.0.677 的 JAR 文件。iBATIS 是一个开源的 Java 框架,主要用于简化数据库与应用程序之间的交互。它在早期广泛应用于企业级应用开发...

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

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

    ibatis教程,ibatis帮助文档

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

Global site tag (gtag.js) - Google Analytics