`
cs_css
  • 浏览: 82734 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql字段默认值不生效的问题解决(下)

阅读更多

    上一篇简单介绍了一个mysql的问题:字段默认值在使用全字段insert的时候,可能并不会生效。在使用mybatis时,虽然需要自己写sql,但相比原始jdbc的方式来说,有一个很好的优势——动态sql。针对前一篇文章提出的问题,mybatis的动态sql可以很好地解决这个问题。

1.问题分析

    上一篇文章中描述的问题,是由于我们误将一个包含所有字段的insert语句做为通用的insert。那么显而易见,解决此问题的方法是,我们需要针对不同的业务需求,严格按照需要插入的字段来写不同的sql,不需要插入的字段,在insert语句中不能够出现。举例上一篇的blog表例子说明,假如我们有一个插入操作,只需要在插入时给author赋值,那么sql可以这么写:

 

<insert id="addOneBlog" parameterType="main.Blog">
	insert into blog(author)
	values (#{author})
</insert>

 


    这个方法虽然奏效,但在实际项目开发中,为了开发效率的需要,我们仍然希望能够有一个通用的insert语句,供所有涉及单表插入操作的业务调用。刚才说过,mybatis有一个非常强大的特色功能:动态sql,使用动态sql即可解决此问题。

2.<sql>、<include>、<trim>标签简介

    mybatis的动态sql功能包含了很多实用的标签:<sql>标签表示一个sql片段,使用此标签不仅可以重用很多sql代码,而且使sql语句更清晰;定义好<sql>标签后,在调用它的地方使用<include>标签,即可将定义好的sql片段拼接进来;<trim>标签可以在标签体内的sql片段首尾任意添加或覆盖字符。

3.问题解决

先上代码:

 

 <sql id="blogColumns">
		<trim suffixOverrides=",">
			<if test="title != null">title,</if>
			<if test="author != null">author,</if>
			<if test="content != null">content</if>
		</trim>
	</sql>
	
	<sql id="blogValues">
		<trim suffixOverrides=",">
			<if test="title != null">#{title},</if>
			<if test="author != null">#{author},</if>
			<if test="content != null">#{content}</if>
		</trim>
	</sql>
	
	<insert id="addOneBlog" parameterType="Blog">
		insert into blog(<include refid="blogColumns"/>)
		values (<include refid="blogValues"/>)
	</insert>

     对于blog表,上面这段代码即可实现我们想要的insert重用,不管插入的字段有多少,我们都可以使用它来实现所有单表insert操作。上面代码中,先定义两个sql片段,分别代表insert语句中的字段列表和参数列表,并使用<trim>标签去除片段首尾可能出现的多余的“,”字符。最后写一个简单的insert,并将上面的sql片段拼接进来。

4.结尾

    关于mybatis的动态sql,它有很多强大的,可高度重用sql的功能。大家如果对一些标签的作用不太清楚,请期待我后续的博文。作为一个半自动的持久层框架,我们虽然需要自己写sql语句,但mybatis的动态sql能够最大限度地减少我们的代码量,这也是在ORM横行的JavaEE世界里,mybatis能够独树一帜的原因。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics