ibatis的jdbctype和ENDDATE="#endDate:DATETIME#"
不用ibatis的自动识别,提高效率。
--------------sql-map.config.xml文件--------------根元素<sqlMapConfig>
1,<properties>元素(唯一)
如:<properties resource="config/database.properties" />
2,<settings>元素
maxRequests同时执行SQL语句的最大线程数。大于这个值的线程将阻塞直到另一个线程执行完成。
缺省值:512
maxSessions
同一时间内活动的最大session数。可以是代码请求的显式session,也可以是当线程使用SqlMapClient实例(即执行一条语句)自动获得的session。
减小这个参数值通常能减少内存使用。
缺省值:128
maxTransactions
同时进入SqlMapClient.startTransaction()的最大线程数。
缺省值:32
cacheModelsEnabled
全局性地启用或禁用SqlMapClient的所有缓存model。调试程序时使用。
缺省值:true(启用)
lazyLoadingEnabled
全局性地启用或禁用SqlMapClient的所有延迟加载。调试程序时使用。
缺省值:true(启用)
enhancementEnabled
是否针对POJO启用字节码增加机制以提升geter/seter的调用效用,为延迟加载带来了及大的性能提升。
缺省值:false(禁用)
useStatementNamespaces
如果启用本属性,必须使用全限定名来引用mapped statement。
如,queryForObject("User.getUserById", id);"User"就是Namespaces
缺省值:false//个人喜欢设为true
3,<typeAlias alias="user" type="persistence.model.User"/>元素
//user.xml中也用typeAlias
预定义的个别名:
事务管理器别名
JDBC--com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig
让JDBC管理事务
JTA--com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig
器使用一个JTA全局事务,使SQL Map的事务包括在更大的事务范围内,
这个更大的事务范围可能包括了其他的数据库和事务资源。
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
例子:
<transactionManager type="JDBC">
<dataSource type="DBCP">
<property value="${driver}" name="JDBC.Driver" />
</..>
4,<transactionManager type="JDBC" >元素
<dataSource type="SIMPLE">//它基于iBatis的SimpleDataSource连接池实现。
<dataSource type="DBCP">//使用Jakarta DBCP的DataSource API提供连接池
</dataSource>
</transactionManager>
JndiDataSourceFactory在应用容器内部从JNDI Context中查找DataSource实现。
当使用应用服务器,并且服务器提供了容器管理的连接池和相关DataSource实现的情况下,
可以使用JndiDataSourceFactory。使用JDBC DataSource的标准方法是通过JNDI来查找。
应用服务器,以处理逻辑为主,
web服务器,以处理HTTP为主
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
</dataSource>
</transactionManager>
以上配置使用了常用的JDBC事务管理。但对于容器管理的资源,您可能需要象下面的例子一样配置,让它能和全局事务一起工作:
<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>
注意,UserTransaction属性指向UserTransaction实例所在的JNDI位置。JTA事务管理需要它,
以使SQL Map能够参与涉及其他数据库和事务资源的范围更大的事务。
5,<sqlMap resource="sql/user.xml" />
----------------------SQL Map(映射)文件----------根元素<sqlMap>
#与$区别"#"好用。
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$'
resultMap,resultClass
关联可以有2种方式,:
1. SELECT a.*,b.cname cateCName FROM param a,category b WHERE a.categoryid=b.id and a.id=#id#
resultMap如何写?
2. <resultMap id=...>
<result property="addresses" column="id" select="User.getAddressByUserId" />
<resultMap id="paramCateResult" class="param">
<select id="getParam" resultMap="paramCateResult" parameterClass="long">
<select id="calculateParamResultSet" resultClass="int" parameterClass="string">
parameterClass="java.util.HashMap","int","long"...
map.put("name", "zhouxingchi");
map.put("age", 49);
list=(List) client.queryForList("getStudent2",map);
<select id="getStudent2" parameterClass="java.util.HashMap" resultMap="get-student-result">
SELECT * FROM student WHERE sname=#name# AND sage=#age#;
</select>
parameterMap
<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”/>
<result property="addList" column="id" select="User.getAddressByUserId" />################
//关联查询,自动关联。延迟加载?
</resultMap>
<select id=”getProduct” parameterMap=”productParam” resultMap=”productResult” cacheModel=”product-cache”>
select * from PRODUCT where PRD_ID = ?
</select>
</sqlMap>
<select>
属性:id,parameterClass,resultClass,parameterMap,resultMap,cacheModel
子元素:所有动态元素
<select>
<procedure>[prə'si:dʒə]
属性:id,parameterClass,resultClass,parameterMap,resultMap,xmlResultName
子元素:所有动态元素
<![CDATA[select...]]>//表示转义,因为xml不能解释"<",">"等
<selectKey>来支持自动生成的键值//Oracle预生成//selectKey是insert特有的
<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>
Inline Parameter
<cacheModel id="product-cache" imlementation="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”size” value=”1000” />
</cacheModel>
<statement id=”getProductList” parameterClass=”int” cacheModel=”product-cache”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
xmlResultName//返回 xml格式,person为根元素
<select id="getPerson" parameterClass=”int” resultClass="xml" xmlResultName=”person”>
//4008111111
<parameterMap id=”parameterMapName” [class=”com.domain.Product”]>
<parameter property =”propertyName” [jdbcType=”VARCHAR”] [javaType=”string”]
[nullValue=”NUMERIC”] [null=”-9999999”]/>
//jdbcType指定DB字段的数据类型
//一般:字段可以为NULL,或日期型,才需要jdbcType属性
<parameter …… />
<parameter …… />
</parameterMap>
<result property=”category” column=”PRD_CAT_ID” select=”getCategory”/>
category是用户定义的类型,JDBC不知道如何给它赋值。
select=”getCategory”使用PRD_CAT_ID字段的值去调用“getCategory”。
得到一个Category对象并赋值给Product的category属性。
//造成N+1 Select?
联合查询
<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#
</
column是 SQL查询的resultset的列名或别名(级别高)
<result property=”productList” column=”CAT_ID” select=” getProductsByCatId”/>
<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
//LRU近期最少使用,
//readOnly=”true”只读缓存(默认);readOnly=“false”可读写缓存
//type="LRC"|MEMORY|FIFO
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”cache-size” value=”1000” />
</cacheModel>
<statement id=”getProductList” cacheModel=”product-cache”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
dynamic MAP
<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
<dynamic>元素和条件元素都有“prepend”属性
二元条件元素<isGreaterThan prepend="AND" property="id" compareValue="0">
一元条件元素<isNotNull prepend="AND" property="emailAddress">
存在条件元素<isNotParameterPresent prepend=”AND”>
<iterate>元素
<iterate prepend=”AND” property=”userNameList” open=”(” close=”)” conjunction=”OR”>
username=#userNameList[]#
</iterate>