14.6. 在iBATIS 2.09以后SQLMap支持动态表名
Sample :
<select id ="getRighe"
remapResults ="true"
resultMap ="resultRighe"
parameterClass ="java.util.Map" >
select * from
$tablePrefix$_righe
where IDUser = #IDUser#
</ select >
java code :
param.put("tablePrefix", "NAG");
param.put("IDUser", IDUser);
utente = (Riga)getSqlMapClientTemplate().queryForObject("getRighe", param);
14.7. Parameter Map 和 Inline Parameter
具有 parameterMap 的statement中用?表示变量的占位符;而 Inline Parameter则用#varName#.
当使用基本类型包装类代替
Java Bean
时,切记要使用
#value#
作为参数。
<parameterMap id=”insert-product-param” class=”com.domain.Product”>
<parameter property=”id”
jdbcType=”NUMERIC”
javaType=”int”
nullValue=”-9999999”/>
<parameter property=”description”
jdbcType=”VARCHAR”
nullValue=”NO_ENTRY”/>
</parameterMap>
<statement id=”insertProduct”
parameterMap=”insert-product-param”>
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);
</statement>
<statement id=”insertProduct”
parameterClass=”com.domain.Product”>
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);
</statement>
14.8. 复杂类型属性
<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”
column=”PRD_CAT_ID”
select=”getCategory”/>
</resultMap>
<resultMap id=”get-category-result”
class=”com.ibatis.example.Category”>
<result property=”id” column=”CAT_ID”/>
<result property=”description” column=”CAT_DESCRIPTION”/>
</resultMap>
<statement id=”getProduct”
parameterClass=”int”
resultMap=”get-product-result”>
select * from PRODUCT where PRD_ID = #value#
</statement>
<statement id=”getCategory”
parameterClass=”int”
resultMap=”get-category-result”>
select * from CATEGORY where CAT_ID = #value#
</statement>
上面的例子中,Product对象拥有一个类型为Category的category属性。因为category是复杂类型(用户定义的类型),JDBC不知道如何给它赋值。通过将category属性值和另一个mapped statement联系起来,为SQL Map引擎如何给它赋值提供了足够的信息。通过执行“getProduct”,“get-product-result”Result Map使用PRD_CAT_ID字段的值去调用“getCategory”。“get-category-result”Result Map将初始化一个Category对象并赋值给它。然后整个Category对象将赋值给Product的category属性。
使用一个联合查询和嵌套的属性映射来代替两个查询statement。上面例子的解决方案是:
<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#
</statement>
14.9. 配置Log4J
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# SqlMap logging configuration...
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
#log4j.logger.java.sql.Statement=DEBUG
#log4j.logger.java.sql.PreparedStatement=DEBUG
#log4j.logger.java.sql.ResultSet=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
14.10. 动态SQL语句
<statement id="someName" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan prepend="and" property="id" compareValue="0">
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend=”and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</statement>
对于以上蓝色的单词就是 动态Mapped Statement 元素关系运算符(她包括一元和二元的很多类型,具体参见 注14.1. 点的内容)