iBATIS

iBATIS wiki:
[color=red][b][url]http://opensource.atlassian.com/confluence/oss/display/IBATIS/Home[/url][/b][/color]

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

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

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

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


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

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


ibatis mapping 时 井号和美元符号的区别[quote]
在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$'
[/quote]


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


[b]namespace & typeAlias type in sqlMap.xml:[/b]

<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);
}
}



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


Ibatis 关于空值(NULL)的处理:
[url]http://blog.sina.com.cn/s/blog_520998920100b4d3.html[/url][quote]
使用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>
[b][color=red]如果属性userEmail,description为空时,Ibatis把NULL存入数据库[/color].
数据库取出值为NULL,对应的属性为String类型的时候,无需作特别处理,Ibatis会把相应属性设置为空.[/b]
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',否则容易导致数据库的不一致.
这种做法虽然保证了数据库的一致性,但对程序来说并不雅观,在程序中如果要判断该属性是否为空,只要判断它是否等于"神奇数字",不得已而为之.
[/quote]
[b][color=red]总结:ibatis对实体类的未赋值属性的处理:非基本类型未赋值为null,如果未作“是否为Null”判断直接对某未赋值属性做update,update之会该属性的null会冲掉库中对应字段已有数据(字段被置为空);基本类型未赋值的话有默认值(如int默认0),未对该基本类型属性赋值情况下做update,会不会用默认值冲掉库中字段值那?应该会(待验证); 所以,在使用ibatis时,对应实体的属性请使用非基本类型,基本类型用其包装类,从而在做update时使未赋值字段能统一使用"是否为Null"做判断条件来决定是否update该字段[/color][/b]!


[color=red][b][size=medium]关于<procedure>[/size][/b][/color]:
Oracle REF CURSOR Solutions:
[b][url]http://www.apachebookstore.com/confluence/oss/display/IBATIS/Oracle+REF+CURSOR+Solutions[/url][/b]
Ibatis访问存储过程的配置:
[b][url]http://www.alisdn.com/wordpress/?cat=6&paged=2[/url][/b]
Oracle/PLSQL: Procedure that outputs a dynamic PLSQL cursor:
[url]http://www.techonthenet.com/oracle/questions/cursor1.php[/url]
使用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;



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


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

注:这里的 [b]'%$customerId$%'[/b] 如果改为 [b]'%$customerId[color=red]:VARCHAR[/color]$%'[/b] ,是不行的,最终输出sql会变为 " [b][color=red]like '%%'[/color][/b] "
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 代码生成工具
[url]http://ibatis.apache.org/docs/tools/abator/[/url]
其对应的MyBatis工具为:[url]https://code.google.com/p/mybatis/wiki/Generator[/url][quote]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="???" .../>

[color=red]用来定制某列所对应实体类属性的属性名、类型等[/color]。该element的属性有:column property javaType jdbcType typeHandler delimitedColumnName。其中只有column是必选的。参见:
[url]http://ibatis.apache.org/docs/tools/abator/configreference/columnOverride.html[/url]
如:
<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”
[/quote]
反过来,iBatis可以做DDL操作吗?
和Hibernate不同,iBatis并没有提供对DDL操作的直接支持,尽管可以通过形如下的方式来做DDL操作:
<statement id="createT"> 
CREATE TABLE T(...);
</statement>
但并不推荐这种方式。在<statement>里写create语句,你图个什么?脱了裤子撒尿多此一举。
[url]http://stackoverflow.com/questions/5559210/ibatis-creating-a-table[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值