- 浏览: 54337 次
- 性别:
- 来自: 北京
最新评论
-
jaredhu:
换个顺序测试下,就傻眼了
java字符串分割性能比较 -
heipacker:
这测试会不会有点片面呀
java字符串分割性能比较 -
meihaoderizi123:
您好,请问nginx配置中,#!nginx(-) 这行代码是什 ...
nginx安装与配置
ibatis2学习总结
iBATIS学习总结
=========================== SqlMapConfig ===========================
1、classpath依赖项目
下载最新 ibatis-x.x.x.xxx.zip 文件,获取最新的 ibatis-2.3.4.726.jar,
并根据其中 jar-dependencies 文件的描述下载 iBATIS 依赖的 jar 包,把以上
jar 包添加到项目 classpath 中。
2、SQL Map 配置文件
2.1、SQL Map 配置文件拥有唯一的<properties>元素
<properties resource="com/newbee/SqlMapConfig.properties" />
2.2、/sqlMapConfig/settings 全局参数
cacheModelsEnabled="true" # 全局性地启用或禁用SqlMapClient的所有缓存model
enhancementEnabled="true" # 全局性地启用或禁用运行时字节码增强,以优化访问Java Bean属性的性能
lazyLoadingEnabled="true" # 全局性地启用或禁用SqlMapClient的所有延迟加载
maxRequests="32" # 同时执行SQL语句的最大线程数
maxSessions="10" # 同一时间内活动的最大session数
maxTransactions="5" # 同时进入SqlMapClient.startTransaction()的最大线程数
useStatementNamespaces="false" # 使用全限定名来引用mapped statement
2.3、dataSource 类型
2.3.1、SIMPLE 类型
<transactionManager type="JDBC" commitRequired="false"> # commitRequired 查询语句select是否需要提交
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="org.postgresql.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:postgresql://server:5432/dbname"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="password"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<property name="Pool.TimeToWait" value="10000"/>
<property name="Pool.PingQuery" value="select * from dual"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan" value="0"/>
<property name="Pool.PingConnectionsNotUsedFor" value="0"/>
</dataSource>
</transactionManager>
2.3.2、DBCP 类型(CS应用推荐)
<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<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 * from ACCOUNT"/>
<property name="Pool.LogAbandoned" value="false"/>
<property name="Pool.RemoveAbandoned" value="false"/>
<property name="Pool.RemoveAbandonedTimeout" value="50000"/>
</datasource>
</transactionManager>
2.3.3、JNDI 类型(服务器推荐)
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/newbee"/>
</dataSource>
</transactionManager>
3、/sqlMapConfig/sqlMap Map文件引用参数
<sqlMap resource="com/newbee/domain/Account.xml" />
=========================== SqlMap ===========================
1、namespace 命名空间,避免属性名称冲突
<sqlMap namespace="Account">
2、<typeAlias>元素让您为一个通常较长的、全限定类名指定一个较短的别名
<typeAlias alias="Account" type="com.newbee.domain.Account"/> # 这里定义
<resultMap id="AccountResult" class="Account"> # 这里使用
<result property="id" column="ACC_ID"/>
<result property="firstName" column="ACC_FIRST_NAME"/>
<result property="lastName" column="ACC_LAST_NAME"/>
<result property="emailAddress" column="ACC_EMAIL"/>
</resultMap>
3、<statement>元素是个通用声明,可以用于任何类型的SQL语句,甚至包含多个语句(用;分隔)。通常,使用下面具体的statement类型是个好主意。
<insert>
<update>
<delete>
<select>
<procedure>
4、特殊SQL字符:因为SQL语句是嵌在XML文档中的,因此有些特殊的字符不能直接使用,例如大于号和小于号(<>)。
只需将包含特殊字符的SQL语句放在XML的CDATA区里面就可以了
<statement id="getPersonsByAge" parameterClass="int" resultClass="examples.domain.Person">
<![CDATA[SELECT *
FROM PERSON
WHERE AGE > #value#
]]>
</statement>
3、自动生成主键:很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。
SQL Map通过<insert>的子元素<selectKey>来支持自动生成的键值。它同时支持预生成(如Oracle)
和后生成两种类型(如MS-SQL Server)。这个值就是SQL Map执行 insert() 方法的返回值。
<!—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>
4、SQL Map通过<procedure>元素支持存储过程。如果参数的mode属性设为INOUT或OUT,则参数对象的值被修改,IN参数对象
的值不会被修改。
<parameterMap id="swapParameters" class="map" >
<parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
<parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
</parameterMap>
<procedure id="swapEmailAddresses" parameterMap="swapParameters" >
{call swap_email_address (?, ?)}
</procedure>
5、SQL 输入参数(是对单一参数的描述)
5.1、定义Java Bean作为输入参数(parameterClass、parameterMap 和 Inline Parameter 混合使用)
简化版:
<statement id="insertProduct" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
values (#id#, #description#);
</statement>
精确版:(date类型对应的字段要指定字段类型,可以为空字段要指定字段类型和空值判断,不支持Blob字段类型)
<statement id="insertProduct" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);
</statement>
5.2、基本类型输入参数
假如没必要写一个Java Bean作为参数,可以直接使用基本类型的包装类(即String,Integer,Date等)作为参数。
<statement id="insertProduct" parameter="java.lang.Integer">
select * from PRODUCT where PRD_ID = #value#
</statement>
5.3、Map类型输入参数
假如没必要写一个Java Bean作为参数,而要传入的参数又不只一个时,可以使用Map类(如HashMap,TreeMap等)作为参数对象。
<statement id="insertProduct" parameterClass="java.util.Map">
select * from PRODUCT
where PRD_CAT_ID = #catId#
and PRD_CODE = #code#
</statement>
6、SQL 返回值 (是对单一返回值的描述)
6.1、定义Java Bean作为返回值
简化版:
<statement id="getProduct" resultClass="com.ibatis.example.Product">
select
PRD_ID as id, # id 字段属性
PRD_DESCRIPTION as description # description 字段属性
from PRODUCT
where PRD_ID = #value#
</statement>
精确版:(date类型对应的字段要指定字段类型,可以为空字段要指定字段类型和空值判断,已经支持Blob字段类型)
<resultMap id="get-product-result" class="com.ibatis.example.Product">
<result property="id" column="PRD_ID"/>
<result property="description" column="PRD_DESCRIPTION" jdbcType="VARCHAR" nullValue="NO_ENTRY"/>
</resultMap>
<statement id="getProduct" resultMap="get-product-result">
select
PRD_ID as id, # id 字段属性
PRD_DESCRIPTION as description # description 字段属性
from PRODUCT
where PRD_ID = #value#
</statement>
6.2、基本类型返回值
<statement id=”getProductCount” resultClass=”java.lang.Integer”>
select count(*) as value
from PRODUCT
</statement>
6.3、Map类型返回值
<statement id=”getProductCount” resultClass=”java.util.HashMap”>
select * from PRODUCT
</statement>
7、缓存Mapped Statement结果集(只在select中使用)
7.1、定义缓存模式
<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
<flushInterval hours="24"/> # 24小时自动刷新一次,也有其他单位
<flushOnExecute statement="insertProduct"/> # 指定在执行了哪个statement后要刷新一次
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”cache-size” value=”1000” /> # 缓存的大小
</cacheModel>
7.2、使用缓存模式
<statement id=”getProductList” cacheModel=”product-cache”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
8、动态Mapped Statement
8.1、二元动态条件
<isEqual> 比较属性值和静态值或另一个属性值是否相等。
<isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan> 比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual> 比较属性值是否大于等于静态值或另一个属性值。
<isLessThan> 比较属性值是否小于静态值或另一个属性值。
<isLessEqual> 比较属性值是否小于等于静态值或另一个属性值。
可用属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
compareProperty - 另一个用于和前者比较的属性(必选或选择compareValue)
compareValue - 用于比较的值(必选或选择compareProperty)
例子:
<statement id="someName" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan prepend="and" property="id" compareValue="0"> # 二元条件,and 会被 where 覆盖
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend=”and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</statement>
8.2、一元动态条件
<isPropertyAvailable>
检查是否存在该属性(存在parameter bean的属性)。
<isNotPropertyAvailable>
检查是否不存在该属性(不存在parameter bean的属性)。
<isNull>
检查属性是否为null。
<isNotNull>
检查属性是否不为null。
<isEmpty>
检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1)。
<isNotEmpty>
检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0)。
可用属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
8.3、其他动态条件
8.3.1、Parameter Present:这些元素检查参数对象是否存在
<isParameterPresent>
检查是否存在参数对象(不为null)。
<isNotParameterPresent>
检查是否不存在参数对象(参数对象为null)。
可用属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
例子:
<isNotParameterPresent prepend=”AND”>
EMPLOYEE_TYPE = ‘DEFAULT’
</isNotParameterPresent>
8.3.2、Iterate:这属性遍历整个List集合,并为集合中的每个元素重复内容。
<iterate> 遍历类型为java.util.List的元素。
可用属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 类型为java.util.List的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)
例子:
<iterate prepend=”AND” property=”userNameList”
open=”(” close=”)” conjunction=”OR”>
username=#userNameList[]# -- []不要丢掉了
</iterate>
8.3.3、动态SQL元素
帮助实现动态的order by子句,动态的查询字段或SQL语句的其他动态部分。
它从根本上改变了SQL语句本身,比仅仅简单地改变参数值严重得多。
它使用$而不是#包括动态变量。
<statement id=”getProduct” resultMap=”get-product-result”>
select * from PRODUCT order by $preferredOrder$
</statement>
9、批处理SQL
sqlMap.startBatch();
// execute statements in between
sqlMap.executeBatch();
10、事务相关
10.1、默认每执行一个SQL就会自动提交并管理事务
10.2、如果使用了以下的代码,就要自己管理事务了
try {
sqlMap.startTransaction ();
// insert,update,delete statements
sqlMap.commitTransaction ();
} finally {
sqlMap.endTransaction ();
}
11、配置log4j显示执行的SQL
11.1、拷贝 log4j.jar 到项目类路径中
11.2、配置 log4j.properties 文件全部内容如下(放在源代码文件夹根目录下)
#--------------------------------
# LEVEL = FATAL ERROR WARN INFO DEBUG
log4j.rootLogger=DEBUG, stdout, fileout # BEBUG 改为其他级别则不再显示SQL
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=/home/guo/ibatis.log
log4j.appender.fileout.MaxFileSize=10000KB
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} :%m%n
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH:mm:ss} :%m%n
=========================== SqlMapConfig ===========================
1、classpath依赖项目
下载最新 ibatis-x.x.x.xxx.zip 文件,获取最新的 ibatis-2.3.4.726.jar,
并根据其中 jar-dependencies 文件的描述下载 iBATIS 依赖的 jar 包,把以上
jar 包添加到项目 classpath 中。
2、SQL Map 配置文件
2.1、SQL Map 配置文件拥有唯一的<properties>元素
<properties resource="com/newbee/SqlMapConfig.properties" />
2.2、/sqlMapConfig/settings 全局参数
cacheModelsEnabled="true" # 全局性地启用或禁用SqlMapClient的所有缓存model
enhancementEnabled="true" # 全局性地启用或禁用运行时字节码增强,以优化访问Java Bean属性的性能
lazyLoadingEnabled="true" # 全局性地启用或禁用SqlMapClient的所有延迟加载
maxRequests="32" # 同时执行SQL语句的最大线程数
maxSessions="10" # 同一时间内活动的最大session数
maxTransactions="5" # 同时进入SqlMapClient.startTransaction()的最大线程数
useStatementNamespaces="false" # 使用全限定名来引用mapped statement
2.3、dataSource 类型
2.3.1、SIMPLE 类型
<transactionManager type="JDBC" commitRequired="false"> # commitRequired 查询语句select是否需要提交
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="org.postgresql.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:postgresql://server:5432/dbname"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="password"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<property name="Pool.TimeToWait" value="10000"/>
<property name="Pool.PingQuery" value="select * from dual"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan" value="0"/>
<property name="Pool.PingConnectionsNotUsedFor" value="0"/>
</dataSource>
</transactionManager>
2.3.2、DBCP 类型(CS应用推荐)
<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<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 * from ACCOUNT"/>
<property name="Pool.LogAbandoned" value="false"/>
<property name="Pool.RemoveAbandoned" value="false"/>
<property name="Pool.RemoveAbandonedTimeout" value="50000"/>
</datasource>
</transactionManager>
2.3.3、JNDI 类型(服务器推荐)
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/newbee"/>
</dataSource>
</transactionManager>
3、/sqlMapConfig/sqlMap Map文件引用参数
<sqlMap resource="com/newbee/domain/Account.xml" />
=========================== SqlMap ===========================
1、namespace 命名空间,避免属性名称冲突
<sqlMap namespace="Account">
2、<typeAlias>元素让您为一个通常较长的、全限定类名指定一个较短的别名
<typeAlias alias="Account" type="com.newbee.domain.Account"/> # 这里定义
<resultMap id="AccountResult" class="Account"> # 这里使用
<result property="id" column="ACC_ID"/>
<result property="firstName" column="ACC_FIRST_NAME"/>
<result property="lastName" column="ACC_LAST_NAME"/>
<result property="emailAddress" column="ACC_EMAIL"/>
</resultMap>
3、<statement>元素是个通用声明,可以用于任何类型的SQL语句,甚至包含多个语句(用;分隔)。通常,使用下面具体的statement类型是个好主意。
<insert>
<update>
<delete>
<select>
<procedure>
4、特殊SQL字符:因为SQL语句是嵌在XML文档中的,因此有些特殊的字符不能直接使用,例如大于号和小于号(<>)。
只需将包含特殊字符的SQL语句放在XML的CDATA区里面就可以了
<statement id="getPersonsByAge" parameterClass="int" resultClass="examples.domain.Person">
<![CDATA[SELECT *
FROM PERSON
WHERE AGE > #value#
]]>
</statement>
3、自动生成主键:很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。
SQL Map通过<insert>的子元素<selectKey>来支持自动生成的键值。它同时支持预生成(如Oracle)
和后生成两种类型(如MS-SQL Server)。这个值就是SQL Map执行 insert() 方法的返回值。
<!—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>
4、SQL Map通过<procedure>元素支持存储过程。如果参数的mode属性设为INOUT或OUT,则参数对象的值被修改,IN参数对象
的值不会被修改。
<parameterMap id="swapParameters" class="map" >
<parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
<parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
</parameterMap>
<procedure id="swapEmailAddresses" parameterMap="swapParameters" >
{call swap_email_address (?, ?)}
</procedure>
5、SQL 输入参数(是对单一参数的描述)
5.1、定义Java Bean作为输入参数(parameterClass、parameterMap 和 Inline Parameter 混合使用)
简化版:
<statement id="insertProduct" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
values (#id#, #description#);
</statement>
精确版:(date类型对应的字段要指定字段类型,可以为空字段要指定字段类型和空值判断,不支持Blob字段类型)
<statement id="insertProduct" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);
</statement>
5.2、基本类型输入参数
假如没必要写一个Java Bean作为参数,可以直接使用基本类型的包装类(即String,Integer,Date等)作为参数。
<statement id="insertProduct" parameter="java.lang.Integer">
select * from PRODUCT where PRD_ID = #value#
</statement>
5.3、Map类型输入参数
假如没必要写一个Java Bean作为参数,而要传入的参数又不只一个时,可以使用Map类(如HashMap,TreeMap等)作为参数对象。
<statement id="insertProduct" parameterClass="java.util.Map">
select * from PRODUCT
where PRD_CAT_ID = #catId#
and PRD_CODE = #code#
</statement>
6、SQL 返回值 (是对单一返回值的描述)
6.1、定义Java Bean作为返回值
简化版:
<statement id="getProduct" resultClass="com.ibatis.example.Product">
select
PRD_ID as id, # id 字段属性
PRD_DESCRIPTION as description # description 字段属性
from PRODUCT
where PRD_ID = #value#
</statement>
精确版:(date类型对应的字段要指定字段类型,可以为空字段要指定字段类型和空值判断,已经支持Blob字段类型)
<resultMap id="get-product-result" class="com.ibatis.example.Product">
<result property="id" column="PRD_ID"/>
<result property="description" column="PRD_DESCRIPTION" jdbcType="VARCHAR" nullValue="NO_ENTRY"/>
</resultMap>
<statement id="getProduct" resultMap="get-product-result">
select
PRD_ID as id, # id 字段属性
PRD_DESCRIPTION as description # description 字段属性
from PRODUCT
where PRD_ID = #value#
</statement>
6.2、基本类型返回值
<statement id=”getProductCount” resultClass=”java.lang.Integer”>
select count(*) as value
from PRODUCT
</statement>
6.3、Map类型返回值
<statement id=”getProductCount” resultClass=”java.util.HashMap”>
select * from PRODUCT
</statement>
7、缓存Mapped Statement结果集(只在select中使用)
7.1、定义缓存模式
<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
<flushInterval hours="24"/> # 24小时自动刷新一次,也有其他单位
<flushOnExecute statement="insertProduct"/> # 指定在执行了哪个statement后要刷新一次
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”cache-size” value=”1000” /> # 缓存的大小
</cacheModel>
7.2、使用缓存模式
<statement id=”getProductList” cacheModel=”product-cache”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
8、动态Mapped Statement
8.1、二元动态条件
<isEqual> 比较属性值和静态值或另一个属性值是否相等。
<isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan> 比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual> 比较属性值是否大于等于静态值或另一个属性值。
<isLessThan> 比较属性值是否小于静态值或另一个属性值。
<isLessEqual> 比较属性值是否小于等于静态值或另一个属性值。
可用属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
compareProperty - 另一个用于和前者比较的属性(必选或选择compareValue)
compareValue - 用于比较的值(必选或选择compareProperty)
例子:
<statement id="someName" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan prepend="and" property="id" compareValue="0"> # 二元条件,and 会被 where 覆盖
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend=”and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</statement>
8.2、一元动态条件
<isPropertyAvailable>
检查是否存在该属性(存在parameter bean的属性)。
<isNotPropertyAvailable>
检查是否不存在该属性(不存在parameter bean的属性)。
<isNull>
检查属性是否为null。
<isNotNull>
检查属性是否不为null。
<isEmpty>
检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1)。
<isNotEmpty>
检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0)。
可用属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
8.3、其他动态条件
8.3.1、Parameter Present:这些元素检查参数对象是否存在
<isParameterPresent>
检查是否存在参数对象(不为null)。
<isNotParameterPresent>
检查是否不存在参数对象(参数对象为null)。
可用属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
例子:
<isNotParameterPresent prepend=”AND”>
EMPLOYEE_TYPE = ‘DEFAULT’
</isNotParameterPresent>
8.3.2、Iterate:这属性遍历整个List集合,并为集合中的每个元素重复内容。
<iterate> 遍历类型为java.util.List的元素。
可用属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 类型为java.util.List的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)
例子:
<iterate prepend=”AND” property=”userNameList”
open=”(” close=”)” conjunction=”OR”>
username=#userNameList[]# -- []不要丢掉了
</iterate>
8.3.3、动态SQL元素
帮助实现动态的order by子句,动态的查询字段或SQL语句的其他动态部分。
它从根本上改变了SQL语句本身,比仅仅简单地改变参数值严重得多。
它使用$而不是#包括动态变量。
<statement id=”getProduct” resultMap=”get-product-result”>
select * from PRODUCT order by $preferredOrder$
</statement>
9、批处理SQL
sqlMap.startBatch();
// execute statements in between
sqlMap.executeBatch();
10、事务相关
10.1、默认每执行一个SQL就会自动提交并管理事务
10.2、如果使用了以下的代码,就要自己管理事务了
try {
sqlMap.startTransaction ();
// insert,update,delete statements
sqlMap.commitTransaction ();
} finally {
sqlMap.endTransaction ();
}
11、配置log4j显示执行的SQL
11.1、拷贝 log4j.jar 到项目类路径中
11.2、配置 log4j.properties 文件全部内容如下(放在源代码文件夹根目录下)
#--------------------------------
# LEVEL = FATAL ERROR WARN INFO DEBUG
log4j.rootLogger=DEBUG, stdout, fileout # BEBUG 改为其他级别则不再显示SQL
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=/home/guo/ibatis.log
log4j.appender.fileout.MaxFileSize=10000KB
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} :%m%n
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH:mm:ss} :%m%n
相关推荐
4.iBatis2学习笔记:SqlMap的配置总结(18条).doc 5.iBatis2学习笔记:入参和返回值的问题.doc 6.iBatis2学习笔记:一对多映射(双向).doc 7.iBatis2学习笔记:多对多映射(双向) .doc 8.iBatis2学习笔记:总结与...
iBATIS2.0是一个基于Java的持久层框架,它主要负责将SQL查询与应用程序的业务逻辑解耦,使得开发者可以更加专注于SQL的编写和优化,而无需关心数据访问的底层细节。iBATIS并不像Hibernate那样是完全的对象关系映射...
在IT行业中,Ibatis、Oracle...希望这篇总结能为你的学习之路提供有价值的指导,进一步深化你对Ibatis、Oracle和敏捷开发的理解。在IT世界中,持续学习和实践是提升自身能力的关键,祝你在技术探索的道路上越走越远。
【ibatis学习总结】 在Java应用中,ORM(对象关系映射)框架是连接数据库与业务逻辑的关键。相比像Hibernate和Apache OJB这样的"一站式"ORM解决方案,iBATIS提供了一种更为灵活的"半自动化"策略。iBATIS允许开发者...
本文档旨在对iBATIS的学习进行深入的总结,帮助初学者快速上手。 一、iBATIS概述 iBATIS的核心理念是“SQL Map”,它将SQL与Java代码分离,通过XML配置文件或注解来定义SQL语句,实现了数据访问层的灵活定制。这...
《iBatis学习资料汇总》 iBatis,作为一个轻量级的持久层框架,它在Java开发领域中扮演着重要的角色。这个框架允许开发者将SQL语句与Java代码分离,提高了开发效率并降低了维护成本。本文将深入探讨iBatis的核心...
#### 第Ⅲ部分:SqlMap API使用方法学习总结 **SqlMap API使用方法:** ibatis提供了丰富的API用于执行SQL语句和处理结果集。 - **SqlSessionFactory:** - SqlSessionFactory是ibatis的核心工厂类,负责创建...
"iBATIS学习总结 - 郭睿的专栏 - CSDN.NET_files"和"iBATIS与Spring集成及环境搭建 - 振华 - ITeye技术网站_files"可能是相关文章的图片或辅助资源。 通过这些资料,开发者可以系统地学习和掌握iBATIS 2.x版本的...
本文将深入探讨其中一个流行的选择——iBATIS,以及其在传智播客教程中的优点总结。 iBATIS,全称为“互联网应用程序基础工具包”(Internet Basics for Architecture with Transactions and SQL),是由Apache ...
《Ibatis开发与学习总结借鉴》 Ibatis,作为一个轻量级的持久层框架,以其简单易用、灵活高效的特点,被广泛应用于Java Web开发中。本文将对Ibatis的基本原理、开发工具Abator以及在Eclipse环境下的应用进行深入...
标题 "ibatis2小例子(转)" 指向的是一个关于iBatis2的实战教程或示例,这是...通过对上述知识点的学习和实践,开发者可以高效地利用iBatis2进行数据库操作,降低数据访问层的复杂性,并提高代码的可读性和可维护性。
【Ibatis2.x学习实战】 Ibatis,全称MyBatis,是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在2.x版本中,Ibatis主要帮助开发者将SQL语句与Java代码分离,提供了一种灵活的数据库访问方式,...
"freemarker+struts2+ibatis入门学习摘要" 这个标题揭示了本文档将围绕三个核心Java技术框架进行讲解:FreeMarker、Struts2和iBatis。这些是Java Web开发中常用的技术,它们分别负责视图层、控制层和数据访问层的...
### J2EE学习:Ibatis开发资料概要 #### 一、Ibatis简介与特点 Ibatis是一款半自动化的ORM(Object Relational Mapping)框架,它不像Hibernate等其他ORM工具那样提供完全自动化的数据库操作,而是更侧重于SQL语句...
《iBatis学习总结——深入理解SQLServer驱动与工具应用》 在软件开发领域,数据库操作是不可或缺的一部分,而iBatis作为一个优秀的持久层框架,为开发者提供了灵活的SQL映射功能,使得Java应用程序能够更好地与...
总结,iBatis 2.3.5以其简洁的设计和强大的功能,在Java世界中占据了一席之地。通过深入学习其源码,不仅可以提升对数据库操作的理解,还能为后续使用MyBatis或其他ORM框架打下坚实基础。在实际项目中,结合iBatis的...
总结来说,这个项目展示了如何使用Struts2作为MVC框架处理HTTP请求,iBatis作为数据访问层执行SQL操作,MySQL作为数据库存储数据,而Ext JS则用于构建现代、交互式的用户界面。通过这样的组合,开发者可以构建出高效...