13.4 执行SQL语句的方式

13.4 执行SQL语句的方式

前面介绍了JDBC执行查询等示例程序,实际上,JDBC不仅可以执行查询,也可以执行DDLMLSQL语句,从而允许通过JDBC最大限度地控制数据库。

13.4.1 使用executeUpdate方法执行DDL和DML语句

Statement提供了三个方法来执行SQL语句,前面已经介绍了使用executeQuery来执行查询语句,下面将介绍使用executeLargeUpdate()executeUpdate()来执行DDLDML语句。使用Statement执行DDLDML语句的步骤与执行普通查询语句的步骤基本相似,区别在于:

  • 执行了DDL语句后返回值为0,
  • 执行了DML语句后返回值为受影响的记录条数。

数据库模式定义语言DDL(Data Definition Language),主要由create(创建)、alter(修改)、drop(删除)和truncate(删除)四个关键字完成。
数据操纵语言(Data Manipulation Language, DML),由insert(插入),update(更新),delete(删除)
对于一个表:

  • 当不再需要该表时, 用drop;
  • 当你仍要保留该表,但要删除所有记录时,用truncate;
  • 当你要删除部分记录时,用delete.

executeUpdate()方法执行DDL语句

下面程序示范了使用executeUpdate()方法创建数据表,如果MySQL驱动支持,也可以使用executeLargeUpdate()方法。

下面的实例中没有直接把数据库连接信息写在程序里,而是使用一个mysql.ini文件(就是一个properties文件)来保存数据库连接信息,mysql.ini文件中的那内容如下:

1
2
3
4
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/select_test
user=root
pass=root

当需要把应用程序从开发环境移植到生产环境时,无须修改源代码,只需要修改mysql.ini配置文件即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.*;
import java.io.*;
import java.sql.*;

public class ExecuteDDL
{
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String paramFile) throws Exception
{
// 使用Properties类来加载属性文件
Properties props = new Properties();
props.load(new FileInputStream(paramFile));
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
pass = props.getProperty("pass");
}
public void createTable(String sql) throws Exception
{
// 1.加载驱动
Class.forName(driver);
try (
// 2.获取数据库连接
Connection conn = DriverManager.getConnection(url, user, pass);
// 3.使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement())
{
// 4.执行DDL,创建数据表
stmt.executeUpdate(sql);
}
}
public static void main(String[] args) throws Exception
{
ExecuteDDL ed = new ExecuteDDL();
ed.initParam("mysql.ini");
ed.createTable("create table jdbc_test "
+ "( jdbc_id int auto_increment primary key, "
+ "jdbc_name varchar(255), " + "jdbc_desc text);");
System.out.println("-----建表成功-----");
}
}

运行上面程序,执行成功后会看到select_test数据库中添加了一个jdbc_test数据表,这表明JDBC执行DDL语句成功。

executeUpdate()方法执行DML语句

使用executeUpdate()执行DML语句与执行DDL语句基本相似,区别是executeUpdate()执行DDL语句后返回0,而执行DML语句后返回受影响的记录条数。
下面程序将会执行一条insert语句,这条insert语句会向刚刚建立的jdbc_test数据表中插入几条记录。因为使用了带子查询的insert语句,所以可以一次插入多条语句.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.*;
import java.io.*;
import java.sql.*;

public class ExecuteDML
{
private String driver;
private String url;
private String user;
private String pass;

public void initParam(String paramFile) throws Exception
{
// 使用Properties类来加载属性文件
Properties props = new Properties();
props.load(new FileInputStream(paramFile));
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
pass = props.getProperty("pass");
}
public int insertData(String sql) throws Exception
{
// 1.加载驱动
Class.forName(driver);
try (
// 2.获取数据库连接
Connection conn = DriverManager.getConnection(url, user, pass);
// 3.使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement())
{
// 4.执行DML,返回受影响的记录条数
return stmt.executeUpdate(sql);
}
}
public static void main(String[] args) throws Exception
{
ExecuteDML ed = new ExecuteDML();
ed.initParam("mysql.ini");
int result = ed.insertData("insert into jdbc_test(jdbc_name,jdbc_desc)"
+ "select s.student_name , t.teacher_name "
+ "from student_table s , teacher_table t "
+ "where s.java_teacher = t.teacher_id;");
System.out.println("--系统中共有" + result + "条记录受影响--");
}
}

运行上面程序,执行成功将会看到jdbc_test数据表中多了几条记录,而且在程序控制台会看到输出有几条记录受影响的信息。