把日记存入数据库就是把日记数据插入数据库的diary数据表中,将数据插入数据表需要SQL的INSERT语句。INSERT语句的基本语法格式如下:
INSERT语句的作用是向指定的数据表中增加一条新的记录,其中:
■{数据表名}指定了要插入数据的目标数据表。
■ 字段名称列表{字段 1 名,字段 2 名,…,字段 n 名}指定了插入目标数据表中的是哪些字段。
■ 字段值列表{字段 1 值,字段 2 值,…,字段 n 值}指定了插入目标数据表中字段的值。
使用该语句时,读者需要注意以下几点:
■ 字段名称列表{字段 1 名,字段 2 名,…,字段 n 名}必须与字段值列表{字段 1 值,字段 2 值,…,字段 n 值}数目相同且一一对应。如字段 1 值对应字段 1 名,字段 2 值对应字段 2 名……
■ 字段值与字段的数据类型必须相符。例如,不能向user表中的age字段中插入字符串数值。
■ 字段值的长度不能大于字段长度,例如,不能向user表的name字段(长度 30)中插入长为 31 的字符串。
■ insert语句中的字段名称列表实际上是可以省略的。如果省略字段名称列表,字段值列表中的字段值将会依顺序依次插入数据表的字段中。
■ 在插入一行数据时,可以只向某几个字段中插入数值。这种情况下,没有插入数值的字段将会设为数据表创建时指定的默认值(记得上一节中CREATE TABLE语句中的default 吧),如果没有默认值,那么字段值将会设为NULL。如果该字段没有默认值,而且被设置为NOTNULL,这种情况下,数据库将不允许INSERT语句执行。
请读者看下面的例子。
例 1: INSERT INTO diary(title, content, authorName, time) VALUES (‘一篇日记’, ‘寥寥数字’ ,‘匿名’, ‘2008-08-01 12:00:00’);
这个语句向diary数据表中插入了一条数据,注意:
■ id字段没有插入值,因为在创建表时将它设为自动增长,MySQL将帮助管理它的值,具体的做法是,第一条记录为 1,第二条记录为 2……第 n 条记录为 n 。
■ 字符串类型的字段值要使用单引号包围。
■ 在MySQL数据类型介绍中已经说过,时间类型其实就是一种特殊的字符串类型而已。所以,在向datetime类型的字段time中插入数据时,时间的书写也和字符串一样。但是请读者注意,时间的格式必须正确。
例 2: INSERT INTO diary(title, content) VALUES (‘一篇日记’, ‘寥寥数字’);
在diary表中,content和author字段为not null,且没有默认值,插入数据时必须为这两个字段赋值。该语句只指定了title字段和content字段的值,time字段没有被赋值,将会被设为默认的“0000-00-00 00:00:00”。author字段为not null,但它没有默认值。执行该语句时,数据库将会提示错误。
例 3: INSERT INTO diary(title, content, authorName, time) VALUES(‘一篇日记’, ‘寥寥数字’,‘匿名’, NOW());
观察以上这个语句,与例 1 不同之处在于时间字段的插入值变成了“NOW()”——这是读者第一次接触到MySQL的内置函数:NOW()表示“当前时间”,使用它作为time字段的插入值,MySQL会使用该语句执行时的时间值来填充time字段。
“讲了这么多SQL,快点告诉我,到底通过JDBC怎样执行它们啊?”
JDBC Connection终于要发挥作用了,请读者看看例 3 中的SQL语句是怎样通过JDBC执行的。
在先前工程“jdbc”的包“chatper2.jdbc.test”下,建立一个新的类:JdbcSQLTest(参见清单2-3),本节的每一个示例对应这个类下的一个方法。
在清单 2-3 中,JDBC驱动的加载和得到Connection的部分,读者已经学过。要执行SQL语句,必须得到一个Statement类型的对象。Statement是“语句”之意,以它作为执行SQL语句的类的名字非常贴切。如果说Connection是用户与数据库之间通信的渠道,而SQL语句是要发送给数据库的信息的话,Statement就是用来包装信息的信封。
首先从Connection这个通信渠道上得到一个信封:
然后就可以通过Statement执行SQL语句了。要执行INSERT语句,需要使用Statement的executeUpdate方法:
executeUpdate方法接收一个字符串sql作为参数,sql为一条单独的以分号“;”结尾(可省略)的SQL语句。方法返回一个int类型的数值,代表执行该操作所影响的数据表的记录行数。可以通过该值判断操作的执行情况,如清单 2-3 中注释的代码 2:
代码 2 定义了将要执行的SQL INSERT语句,注意其中的标点符号必须用英文输入法输入。插入了一条数据,正常情况下返回值count应该为 1。
与Connection相似,使用完Statement对象之后,也需要将其关闭以释放资源:
动动手
这是第一个小任务,请读者写一段Java代码,将表 2-5 中的 3 条日记数据插入到diary数据表中。
表 2-5 添加日记数据