ibatis中动态SQL_insert

ibatis的动态SQL非常强大,记录一些细节的东西。

1.正常的动态INSERT,即全部遍历一次,这种是通用的,如下:

	<insert id="addUser" parameterClass="com.mmblue.domain.User">
		INSERT INTO USER (
		<dynamic prepend=" ">
					<isNotEmpty property="realName" prepend=",">REALNAME</isNotEmpty>
					<isNotEmpty property="password" prepend=",">PASSWORD</isNotEmpty>
					<isNotEmpty property="projectId" prepend=",">PROJECT_ID</isNotEmpty>
					<isNotEmpty property="isEable" prepend=",">ISENABLE</isNotEmpty>
					<isNotEmpty property="createTime" prepend=",">CREATETIME</isNotEmpty>
					<isNotEmpty property="name" prepend=",">USERNAME</isNotEmpty>
					<isNotEmpty property="id" prepend=",">USERID</isNotEmpty>
					<isNotEmpty property="isFirstLogin" prepend=",">ISFIRSTLOGIN</isNotEmpty>
		</dynamic>
		<![CDATA[
			) VALUES (
		]]>
		<dynamic prepend=" ">
					<isNotEmpty property="realName" prepend=",">#realName#</isNotEmpty>
					<isNotEmpty property="password" prepend=",">#password#</isNotEmpty>
					<isNotEmpty property="projectId" prepend=",">#projectId#</isNotEmpty>
					<isNotEmpty property="isEable" prepend=",">#isEable#</isNotEmpty>
					<isNotEmpty property="createTime" prepend=",">#createTime#</isNotEmpty>
					<isNotEmpty property="name" prepend=",">#name#</isNotEmpty>
					<isNotEmpty property="id" prepend=",">#id#</isNotEmpty>
					<isNotEmpty property="isFirstLogin" prepend=",">#isFirstLogin#</isNotEmpty>
		</dynamic>
		<![CDATA[
	    	)
	    ]]>
	</insert>

 2.有的字段必须插入,不是采用这种全部判断的方式

	<insert id="addUser" parameterClass="com.mmblue.entity.system.User">
		<selectKey keyProperty="id" resultClass="long">
             select S_MYIVR_TUSER.NEXTVAL as id from DUAL
         </selectKey>
         INSERT INTO MYIVR_TUSER (
         	USERID
			<isNotEmpty property="name">,USERNAME</isNotEmpty>
			<isNotEmpty property="realName">,REALNAME</isNotEmpty>
			<isNotEmpty property="password">,PASSWORD</isNotEmpty>
			<isEqual property="enable" compareValue="1">,ISENABLE</isEqual>
			<isNotEmpty property="createTime">,CREATETIME</isNotEmpty>
		<![CDATA[
			) VALUES (
		]]>
			#id#
			<isNotEmpty property="name">,#name#</isNotEmpty>
			<isNotEmpty property="realName">,#realName#</isNotEmpty>
			<isNotEmpty property="password">,#password#</isNotEmpty>
			<isEqual property="enable" compareValue="1">,#enable#</isEqual>
			<isNotEmpty property="createTime">,#createTime#</isNotEmpty>
		<![CDATA[
	    	)
	    ]]>
	</insert>

 注意 ,USERNAME 里面的',',和最后一个是不带' ,'  这样的话就算只有1个字段有值都可以插入进去。

如果和第一种方式一样的话就会出现INSERT INTO MYIVR_TUSER(USERID,,USERNAME) values(id,,name)这样的情况

iBatis动态SQL标签包括以下几种: 1. `<if>`标签:用于判断条件是否成立,如果成立则执行其中的SQL语句。示例代码: ``` <select id="selectPerson" parameterType="int" resultType="Person"> SELECT * FROM person WHERE 1=1 <if test="id != null"> AND id = #{id} </if> <if test="name != null"> AND name = #{name} </if> </select> ``` 2. `<choose>`标签:类似于Java中的switch语句,用于根据不同条件选择不同的SQL语句执行。示例代码: ``` <select id="selectPerson" parameterType="int" resultType="Person"> SELECT * FROM person <choose> <when test="id != null"> WHERE id = #{id} </when> <when test="name != null"> WHERE name = #{name} </when> <otherwise> WHERE 1=1 </otherwise> </choose> </select> ``` 3. `<where>`标签:用于动态拼接WHERE语句,自动去除多余的AND和OR关键字。示例代码: ``` <select id="selectPerson" parameterType="int" resultType="Person"> SELECT * FROM person <where> <if test="id != null"> AND id = #{id} </if> <if test="name != null"> AND name = #{name} </if> </where> </select> ``` 4. `<foreach>`标签:用于循环遍历集合或数组,动态生成SQL语句。示例代码: ``` <insert id="insertPersons" parameterType="List"> INSERT INTO person (id, name) VALUES <foreach collection="list" item="person" separator=","> (#{person.id}, #{person.name}) </foreach> </insert> ``` 5. `<set>`标签:用于动态拼接SET语句,用于更新操作。示例代码: ``` <update id="updatePerson" parameterType="Person"> UPDATE person <set> <if test="name != null"> name = #{name}, </if> <if test="age != null"> age = #{age}, </if> </set> WHERE id = #{id} </update> ``` 以上是iBatis中常用的动态SQL标签,可以根据实际需求选择适当的标签来组合使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值