前面介绍了如何通过JDBC获取数据库连接,可是Connection对象不能直接执行SQL语句,需要引入Statement报告对象才能操作SQL。Statement对象由Connection的createStatement方法获得,它主要提供了下列两个方法:
executeUpdate:执行数据库的管理语句,主要包含建表、改表结构、删表、增加记录、修改记录、删除记录等等。它的返回值是整型,存放着当前语句的操作记录数量,例如删除了多少条记录、更新了多少条记录等。
executeQuery:执行数据库的查询语句,专用于select命令。它的返回值是ResultSet类型,查询的结果集可经由ResultSet对象得到。
对于管理类型的SQL指令来说,完整的操作过程分成以下三个步骤:
1、获取数据库连接:该步骤调用DriverManager类的getConnection方法获得连接对象。
2、创建该连接的执行报告:该步骤调用Connection对象的createStatement方法获得执行报告。
3、命令报告执行SQL语句:该步骤调用报告对象的executeUpdate方法来执行SQL语句。
把以上的三步骤串联起来,便得到了下面的数据库操作模板:

		// 先获取数据库连接,再创建该连接的执行报告
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);
Statement stmt = conn.createStatement()) {
String sql = "这里是待执行SQL语句";
stmt.executeUpdate(sql); // 执行处理语句
// createTable(stmt); // 创建表格
// insertRecord(stmt); // 插入记录
// updateRecord(stmt); // 更新记录
} catch (SQLException e) {
e.printStackTrace();
}

接下来看几个具体的SQL执行例子,首先创建一张名叫teacher的新表,则编写如下所示的建表代码:

	// 创建表格
private static void createTable(Statement stmt) throws SQLException {
String sql = "create table teacher (" // 建表语句
+ " gonghao INT NOT NULL,"
+ " name VARCHAR(32) NOT NULL,"
+ " birthday DATE NULL,"
+ " sex INT NOT NULL,"
+ " course VARCHAR(32) NOT NULL,"
+ " PRIMARY KEY (gonghao))"
+ "comment = '教师信息表';";
int count = stmt.executeUpdate(sql); // 执行处理语句
System.out.println("建表语句的返回结果为"+count);
}

在之前的try代码内部调用createTable方法,运行测试程序后观察到以下的输出日志。

建表语句的返回结果为0

由于建表语句本身没有影响任何记录,因此executeUpdate方法在建表之时返回了0。接着打开MySQL的工作台,就能在工作台左侧看到如图所示的teacher表了。


建好了表,还要往里面添加几条记录,于是编写下面的插表代码:

	// 插入记录
private static void insertRecord(Statement stmt) throws SQLException {
List<String> sqlList = Arrays.asList( // 以下每个语句插入一条记录
"insert into teacher (gonghao, name, birthday, sex, course) VALUES ('1', '张老师', '1983-03-03', 1, '语文')",
"insert into teacher (gonghao, name, birthday, sex, course) VALUES ('2', '李老师', '1984-04-04', 0, '数学')",
"insert into teacher (gonghao, name, birthday, sex, course) VALUES ('3', '王老师', '1985-05-05', 1, '英语')",
"insert into teacher (gonghao, name, birthday, sex, course) VALUES ('4', '赵老师', '1986-06-06', 0, '物理')",
"insert into teacher (gonghao, name, birthday, sex, course) VALUES ('5', '刘老师', '1987-07-07', 1, '化学')");
for (String sql : sqlList) {
int count = stmt.executeUpdate(sql); // 执行处理语句
System.out.println("添加记录语句的返回结果为"+count);
}
}

同样在try代码中调用insertRecord方法,运行测试程序观察到下列的日志文本。

添加记录语句的返回结果为1
添加记录语句的返回结果为1
添加记录语句的返回结果为1
添加记录语句的返回结果为1
添加记录语句的返回结果为1

因为每个insert语句插入一条记录,所以executeUpdate在插表时返回的数量是1。回到工作台查询teacher表的所有记录,便能看到如图所示的五条记录。


然后准备修改记录字段,让所有女老师去教英语,则包含update语句的方法代码如下所示:

	// 更新记录
private static void updateRecord(Statement stmt) throws SQLException {
String sql = "update teacher set course='英语' where sex='1'"; // 记录更新语句
int count = stmt.executeUpdate(sql); // 执行处理语句。返回被更新的记录数量
System.out.println("更新记录语句的返回结果为"+count);
}

在try代码中调用updateRecord方法,运行测试程序后观察到以下的日志信息。

更新记录语句的返回结果为3

由日志可见,这个update语句更新了三条数据库记录,因而executeUpdate方法此时的返回值为3。回到MySQL工作台,重新查询teacher表,此时的记录结果如图所示,果然三个女老师的任教课程都变为英语了。


更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(一百四十七)通过JDBC管理数据库的更多相关文章

  1. Java开发笔记(八十七)随机访问文件的读写

    前面介绍了字符流读写文件的两种方式,包括文件字符流和缓存字符流,但是它们的写操作都存在一个问题:不管是write方法还是append方法,都只能从文件开头写入,而不能追加到文件末尾或者在文件中间某个位 ...

  2. Java开发笔记(二十七)数值包装类型

    方法的出现缘起优化代码结构,但它的意义并不局限于此,正因为有了方法定义,编程语言才更像一门能解决实际问题的工具,而不仅仅是只能用于加减乘除的计算器.在数学的发展过程中,为了表示四则运算,人们创造了加减 ...

  3. Java开发笔记(三十七)利用正则串分割字符串

    前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串.分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号.空格等等都可 ...

  4. Java开发笔记(四十七)关键字this的用法

    前面介绍了类的基本定义,包括成员属性.成员方法.构造方法几个组成要素,可谓是具备了类的完整封装形态.不过在进行下一阶段的学习之前,有必要梳理一下前述的类定义代码,看看是否存在哪些需要优化的地方.首先观 ...

  5. Java开发笔记(五十七)因抽象方法而产生的抽象类

    前面介绍了类的常见用法,令人感叹面向对象的强大,几乎日常生活中的所有事物,都可以抽象成Java的基类及其子类.然而抽象操作也有副作用,就是某个抽象而来的行为可能是不确定的,比如半夜鸡叫,如果是公鸡则必 ...

  6. Java开发笔记(六十七)清单:ArrayList和LinkedList

    前面介绍了集合与映射两类容器,它们的共同特点是每个元素都是唯一的,并且采用二叉树方式的类型还自带有序性.然而这两个特点也存在弊端:其一,为啥内部元素必须是唯一的呢?像手机店卖出了两部Mate20,虽然 ...

  7. Java开发笔记(七十七)使用Optional规避空指针异常

    前面在介绍清单用法的时候,讲到了既能使用for循环遍历清单,也能通过stream流式加工清单.譬如从一个苹果清单中挑选出红苹果清单,采取for循环和流式处理都可以实现.下面是通过for循环挑出红苹果清 ...

  8. Java开发笔记(九十七)利用Runnable启动线程

    前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...

  9. Java开发笔记(序)章节目录

    现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...

随机推荐

  1. Java实现PV操作 | 生产者与消费者

    导语 在学习操作系统的过程中,PV操作是很重要的一个环节.然而面对书本上枯燥的代码,每一个爱好技术的人总是想能亲自去实现.现在我要推出一个专题,专门讲述如何用Java实现PV操作,让操作系统背后的逻辑 ...

  2. [linux][c++]linux c++ 通过xcb库获取屏幕大小

    linux c++ 通过xcb库获取屏幕大小 #include <stdio.h> #include <xcb/xcb.h> /** clang++ main.cpp -o m ...

  3. LCA的多种求法(超详细!!!)

    倍增求LCA (1)树上倍增法 预处理 设f[x,k]表示x的2^k辈祖先,即从x向根节点走2^k步到达的节点.特别地,若该节点不存在,则令f[x,k]=0.f[x,0]就是x的父节点.可以得出f[x ...

  4. 20190815网络与信息安全领域专项赛线上赛misc WriteUp

    目录 签到题 题目内容 使用工具 解题步骤 七代目 题目下载地址 使用工具 解题步骤 亚萨西 题目下载链接 使用工具 解题步骤 24word 题目下载链接 使用工具 解题步骤 感想 几星期前报了名却完 ...

  5. tomcat中文乱码

    1. https://blog.csdn.net/qq_35038153/article/details/78430359 2. 1.修改apache-tomcat-9.0.14-windows-x6 ...

  6. git修改提交作者和邮箱

    作用一名程序员,我们会经常混迹与不同的代码仓库,时常不同仓库会有作者信息验证.比如公司内建的gitlab一般会要求统一使用公司内部的域账号签名:github要求使用github账号签名等.因此,很容易 ...

  7. win10 安装mysql 8.0.18 解决Navicat初次连接报错

    win10 安装mysql 8.0.18 解决Navicat初次连接报错 win10 安装mysql 8.0.18-winx64 一,先去官网下载mysql 安装包 https://dev.mysql ...

  8. Guava 库

    https://www.yiibai.com/guava https://wizardforcel.gitbooks.io/guava-tutorial/content/1.html com.goog ...

  9. zookeeper核心原理全面解析

    下述各zookeeper机制的java客户端实践参考zookeeper java客户端之curator详解. 官方文档http://zookeeper.apache.org/doc/current/z ...

  10. 大数据常见端口汇总-hadoop、hbase、hive、spark、kafka、zookeeper等(持续更新)

    常见端口汇总:Hadoop:        50070:HDFS WEB UI端口    8020 : 高可用的HDFS RPC端口    9000 : 非高可用的HDFS RPC端口    8088 ...