Ibatis insert语句插入null引发的错误
公司使用的orm框架为ibatis,其中默认的insert语句一直都是这样写的:
<insert id="insert" parameterClass="activityDO" >
insert into activity_expert (
......
activity_id ,
......
)
values(
......
#activityId# ,
......
)
</insert>
很常规的写法对吧!
假设其中activity_id是不可为null的,在写表结构时默认如果为null,则activity_id=99。
总体来看,insert语句是没有问题的,如果activity_id不为null,则正常入库,如果为null,还有默认值default=99,但是实际上却并不是这样的,如果对象中的activityId为null,程序会报错。
经查阅,上述的规则其实是不正确的,正确的规则如下:
在insert语句中,如果显式地插入NULL值(如:insert into test values (null))到被声明了NOT NULL的列,则将会报错,不允许插入;而如果是隐式地插入NULL值(如:insert into test values ())到被声明了NOT NULL的列,列应该被设置为它的缺省值,如果它有缺省值的话,否则报错,无法插入。
因此在ibatis中写insert语句的最佳方式如下:
<sql id="common_condition">
......
<isNotEmpty prepend="," property="activityId" removeFirstPrepend="true">activity_id = #activityId# </isNotEmpty>
......
</sql> <insert id="insert" parameterClass="activityExpertDO" >
insert into activity set
<include refid="common_condition" />
</insert>
这样做一方面可以解决上述表中某些字段不能为null,但传递参数却又有可能为null的情况,另外一方面可以复用sql语句,在insert和update的sql语句中都可以使用。
Ibatis insert语句插入null引发的错误的更多相关文章
- mysql数据库使用insert语句插入中文数据报错
在mysql的命令行模式中,通过insert语句插入中文数据的时候报错,类似于下面这样: Incorrect string value: '\xE7\x8F' for column 'name' at ...
- 如何通过sql的insert语句插入大量字符串到oracle的clob字段?
当通过insert语句直接插入大量字符串(主要是html的内容),超过4000字符时候,就会报: ORA-01489: 字符串连接的结果过长 虽然字段是clob,足以存储,但是通过这种直接插入的时候, ...
- 值班问题:insert语句插入了两条数据?
上周值班,碰到这样的一个客户问题,表结构简化如下: CREATE TABLE `aa` (`c1` int(10) unsigned NOT NULL AUTO_INCREMENT,`c2` int( ...
- 一条insert语句插入数据库
CREATE TABLE test_main ( id INT NOT NULL, value VARCHAR(10), PRIMARY KEY(id) ); oracle插入方式:INSERT IN ...
- 一个null引发的错误
写程序时,发生一个unrecognized selector的错误,很显然,这是一个经典错误,运行时找不到可调用的方法. 系统提示的reason是 -[NSNull length] 错误 经过查找,原 ...
- 将excle表中得数据生成insert语句插入到数据库中
第一步:输入公式 第二步:拽住右下角得+往下拖拽
- 关于加快INSERT语句执行速度和HINT /*+ append */及/*+ append nologging */的使用
(非归档模式下)创建表T01: SQL> create table t01 as select * from dba_objects where 1=2; Table created. (非归档 ...
- 第四章 数据更新 4-1 数据的插入(INSERT 语句的使用方法)
一.什么是INSERT 用来插入数据的SQL就是INSERT语句. 二.INSERT 语句的基本语法. 列清单 值清单 列清单和值清单的列数必须保持一致,如果不一致会出错. 原则上,执行一次I ...
- ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法
ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法 有些情况下,SQL SERVER 2008r2中需要保存float,int类型的数据,当C 中的变量为double ...
随机推荐
- java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
今天使用hql语句的时候,遇到了一个这样的bug,修改的方法是
- opnet安装及安装中出现问题的解决办法 分类: opnet 2014-04-06 21:50 397人阅读 评论(0) 收藏
我使用的opnet14.5 win7 64位系统的http://pan.baidu.com/s/1qWyfxnu,电脑先刷了win7 64位原版系统. 选择了VS2013+opnet14.5的安装方 ...
- C#中的ToString格式大全
// C# 日期格式 DateTime dt = DateTime.Now; dt.ToString();//2005-11-5 13:21:25 dt.ToFileTime().ToString() ...
- RabbitMQ入门-Topic模式
上篇<RabbitMQ入门-Routing直连模式>我们介绍了可以定向发送消息,并可以根据自定义规则派发消息.看起来,这个Routing模式已经算灵活的了,但是,这还不够,我们还有更加多样 ...
- 用 Node.js 把玩一番 Alfred Workflow
插件地址(集成Github.掘金.知乎.淘宝等搜索) 作为 Mac 上常年位居神器榜第一位的软件来说,Alfred 给我们带来的便利是不言而喻的,其中 workflow(工作流) 功不可没,在它上面可 ...
- 【模板】51Nod--1085 01背包
在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数 ...
- <经验杂谈>C#生成条形码
虽然二维码满天飞,但也不能忘了条形码,本篇介绍可以在C#中使用的1D/2D编码解码器.条形码的应用已经非常普遍,几乎所有超市里面的商品上面都印有条形码: 条形码的标准: 条形码的标准有ENA条形码.U ...
- ansible批量分发免密钥登陆python脚本
最近看了看强大的号称自动化运维的三大利器之一的--ansible,ok,亲测之后,确实感觉,对于我们这种DBA工作者来说,确实很受益. 值得注意的是ansible要求被管理服务器python版本不低于 ...
- C#设计模式(2)-简单工厂模式
引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...
- MySQL for Mac 安装和基本操作
一.安装mysql 1.mysql下载地址http://dev.mysql.com/downloads/mysql/我的机器是mac 10.8的;所以使用mysql-5.6.10-osx10.7-x8 ...