Notice:
1) 在Spring配置文件中,一定要为SqlMapClientFactoryBean配置DataSource属性。
另外经过测试,DAO不需要配置dataSoure。
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<!-- 此处应注入ibatis配置文件,而非sqlMap文件,否则会出现“there is no statement.....异常” -->
<property name="configLocation">
<value>classpath:sql_resources/SqlMapConfig.xml</value>
<!-- <value>WEB-INF/classes/sql_resources/SqlMapConfig.xml</value> -->
</property>
<!-- 一定要配置DataSource,否则会出现“NullPointerException” -->
<property name="dataSource" ref="dataSource" />
</bean>
2) <![CDATA[……]]>
通过<![CDATA[……]]>节点,可以避免SQL 中与XML 规范相冲突的字符对XML映射文件的合法性造成影响。
3) $与#获取值的方式是一样的,只是$获取是对应参数的值,#会根据不同类型而生产字符串。
如 String 类型 : aa ---> 'aa', 将获取的值加上引号,变为字符串类型。
所以,一般用$来获取表名,列名,构造sql;而用#获取要插入的值,适合传值。
#方式能够很大程度防止sql注入。$方式无法防止sql注入,一般能用#的就别用$.
<insert id="customPO_insert" parameterClass="customPO">
INSERT INTO $moduleTable$ (parentID
<iterate property="fieldValueList" prepend="," conjunction=","> --fieldValueList是customPO一属性
$fieldValueList[].key$ --循环fieldValueList[]这个数组,因为此数组每个对象是map,可获得map的key.
</iterate>
)
VALUES (#parentID#
<iterate property="fieldValueList" prepend="," conjunction=",">
#fieldValueList[].value#
</iterate>
)
<selectKey resultClass="int" keyProperty="parentID">
SELECT last_insert_id()
</selectKey>
</insert>
4) 很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。 SQL Map 通过 <insert></insert> 的子元素 <selectkey></selectkey> 来支持自动生成的键值。它同时支持预生成(如 Oracle )和后生成两种类型(如 MS-SQL Server )。下面是两个例子:
1) 在Spring配置文件中,一定要为SqlMapClientFactoryBean配置DataSource属性。
另外经过测试,DAO不需要配置dataSoure。
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<!-- 此处应注入ibatis配置文件,而非sqlMap文件,否则会出现“there is no statement.....异常” -->
<property name="configLocation">
<value>classpath:sql_resources/SqlMapConfig.xml</value>
<!-- <value>WEB-INF/classes/sql_resources/SqlMapConfig.xml</value> -->
</property>
<!-- 一定要配置DataSource,否则会出现“NullPointerException” -->
<property name="dataSource" ref="dataSource" />
</bean>
2) <![CDATA[……]]>
通过<![CDATA[……]]>节点,可以避免SQL 中与XML 规范相冲突的字符对XML映射文件的合法性造成影响。
3) $与#获取值的方式是一样的,只是$获取是对应参数的值,#会根据不同类型而生产字符串。
如 String 类型 : aa ---> 'aa', 将获取的值加上引号,变为字符串类型。
所以,一般用$来获取表名,列名,构造sql;而用#获取要插入的值,适合传值。
#方式能够很大程度防止sql注入。$方式无法防止sql注入,一般能用#的就别用$.
<insert id="customPO_insert" parameterClass="customPO">
INSERT INTO $moduleTable$ (parentID
<iterate property="fieldValueList" prepend="," conjunction=","> --fieldValueList是customPO一属性
$fieldValueList[].key$ --循环fieldValueList[]这个数组,因为此数组每个对象是map,可获得map的key.
</iterate>
)
VALUES (#parentID#
<iterate property="fieldValueList" prepend="," conjunction=",">
#fieldValueList[].value#
</iterate>
)
<selectKey resultClass="int" keyProperty="parentID">
SELECT last_insert_id()
</selectKey>
</insert>
4) 很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。 SQL Map 通过 <insert></insert> 的子元素 <selectkey></selectkey> 来支持自动生成的键值。它同时支持预生成(如 Oracle )和后生成两种类型(如 MS-SQL Server )。下面是两个例子:
- < !—Oracle SEQUENCE Example -->
- <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
- <selectKey resultClass="int" keyProperty="id" >