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的所有缓存modelenhancementEnabled="true" # 全局性地启用或禁用运行时字节码增强,以优化访问Java Bean属性的性能lazyLoadingEnabled="true" # 全局性地启用或禁用SqlMapClient的所有延迟加载maxRequests="32" # 同时执行SQL语句的最大线程数maxSessions="10" # 同一时间内活动的最大session数maxTransactions="5" # 同时进入SqlMapClient.startTransaction()的最大线程数useStatementNamespaces="false" # 使用全限定名来引用mapped statement2.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 PERSONWHERE 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 PRODUCTwhere PRD_CAT_ID = #catId#and PRD_CODE = #code#</statement>6、SQL 返回值 (是对单一返回值的描述)6.1、定义Java Bean作为返回值简化版:<statement id="getProduct" resultClass="com.ibatis.example.Product">selectPRD_ID as id, # id 字段属性PRD_DESCRIPTION as description # description 字段属性from PRODUCTwhere 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">selectPRD_ID as id, # id 字段属性PRD_DESCRIPTION as description # description 字段属性from PRODUCTwhere PRD_ID = #value#</statement>6.2、基本类型返回值<statement id=”getProductCount” resultClass=”java.lang.Integer”>select count(*) as valuefrom 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 Statement8.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、批处理SQLsqlMap.startBatch();// execute statements in betweensqlMap.executeBatch();10、事务相关10.1、默认每执行一个SQL就会自动提交并管理事务10.2、如果使用了以下的代码,就要自己管理事务了try {sqlMap.startTransaction ();// insert,update,delete statementssqlMap.commitTransaction ();} finally {sqlMap.endTransaction ();}11、配置log4j显示执行的SQL11.1、拷贝 log4j.jar 到项目类路径中11.2、配置 log4j.properties 文件全部内容如下(放在源代码文件夹根目录下)#--------------------------------# LEVEL = FATAL ERROR WARN INFO DEBUGlog4j.rootLogger=DEBUG, stdout, fileout # BEBUG 改为其他级别则不再显示SQLlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.fileout=org.apache.log4j.RollingFileAppenderlog4j.appender.fileout.File=/home/guo/ibatis.loglog4j.appender.fileout.MaxFileSize=10000KBlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} :%m%nlog4j.appender.fileout.layout=org.apache.log4j.PatternLayoutlog4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH:mm:ss} :%m%n
转载至:http://blog.sina.com.cn/s/blog_3c62c21f01012l1f.html
转载于:https://www.cnblogs.com/lidaofei1991/articles/5586413.html