上一篇简单介绍了一个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能够独树一帜的原因。
分享到:
相关推荐
Mysql字段设计
在使用mysql的过程中,有个问题就是mysql的优化,mysql中longblob字段在5.5版本中默认的为1M。 想改变这个问题,需要注意几点: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (2054817 > ...
MySQL字段类型说明 MySQL字段类型说明
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是...
解决CodeSmith不能读取MySQL字段备注说明,已经编译过,可以直接使用,解决win10系统中CodeSmith不能读取MySQL中Comment
MySQL数据库字段加密,设置数据库字段类型,设置加密盐为全局变量
MySQL 添加字段的语法格式如下: ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件]; 对语法格式的说明如下: <表名> 为数据表的名字; <新字段名> 为所要添加的字段的名字; <数据类型> 为所要添加的...
环境 MySQL 5.1 + 命令行工具 问题 MySQL表字段设置默认值 解决 代码如下: –SQL: CREATE TABLE test( i_a int NOT NULL DEFAULT 1, ts_b timestamp NOT NULL DEFAULT NOW(), c_c char(2) NOT NULL DEFAULT ‘1’ )...
主要给大家介绍了关于Linux修改MySQL配置不生效问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Linux系统具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
本文主要内容是MySQL升级到5.7版本之后,由于默认的 sql_mode 值带来的坑以及对应的解决方案。 案例一:ONLY_FULL_GROUP_BY 问题描述 MySQL版本从5.6升级至5.7之后,部分SQL执行报错,报错信息如下: ERROR 1055 ...
PostgreSQL与mysql字段对比.docx
MySql所有字段类型及长度范围,可以参考下
本文介绍MySQL数据库使用SQL语句来在现有的表中,添加一个新的字段,包括设置字段的是否为空、默认值等
使用CodeSmith编写MySQL模板的时候,会发现一个问题:MySQL数据表中的列说明获取不到, 网上找了个教程:http://www.cnblogs.com/LonelyShadow/p/4147743.html 然后里面没有dll下载,我就参照他的做法搞了下,需要的...
mysql获取字段中内容
Mysql5中所有的字段类型稍微整理了一下。 仅供参考。
Mysql字段类型说明
MySQL批量对表增加指定字段,会快速实现批量字段的添加。写了2个存储存储过程,执行即可。方便快速!
查询某个字段的时候需要给一个字段同样的值。 这个值你可以写死,也可以从数据库获取 1、写死值 SELECT mfr_id AS mfrId, mfr_name AS mfrName, IFNULL(NULL, 587694978080178176) AS suppId FROM mater_prod ...
MySql字段类型,各个字段得定义,使用。