前面介绍了 JDBC 执行查询等示例程序,实际上,JDBC 不仅可以执行查询,也可以执行 DDL、DML 等 SQL 语句,从而允许通过 JDBC 最大限度地控制数据库。
1,使用 executeUpdate 方法执行 DDL 和 DML 语句
Statement 提供了 3 个方法来执行 SQL 语句,前面已经介绍了使用 executeQuery() 来执行查询语句,下面将介绍使用 executeUpdate() 来执行 DDL 和 DML 语句。使用 Statement 执行 DDL 和 DML 语句的步骤与执行普通查询语句的步骤基本相似,区别在于执行了 DDL 语句后返回值为 0,执行了 DML 语句后返回值为受影响的记录条数。
下面程序示范了使用 executeUpdate() 方法创建数据表。我们并没有直接把数据库连接信息写在程序里,而是使用一个 mysql.ini 文件(就是一个 properties 文件)来保存数据库连接信息,这是比较成熟的做法——当需要把应用程序从开发环境移植到生产环境时,无须修改源代码,只需要修改 mysql.ini 配置文件即可。
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
{
// 加载驱动
Class.forName(driver);
try(
// 获取数据库连接
Connection conn = DriverManager.getConnection(url , user , pass);
// 使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement())
{
// 执行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("-----建表成功-----");
}
}
mysql.ini 文件内容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/select_test
user=root
pass=32147
运行上面程序,执行成功后会看到 select_test 数据库中添加了一个 jdbc_test 数据表,这表明 JDBC 执行 DDL 语句成功。
使用 executeUpdate() 执行 DML 语句与执行 DDL 语句基本相似,区别是 executeUpdate() 执行 DDL 语句后返回 0,而执行 DML 语句后返回受影响的记录条数。下面程序将会执行一条 insert 语句,这条 insert 语句会向刚刚建立的 jdbc_test 数据表中插入几条记录。因为使用了带子查询的 insert 语句,所以可以一次插入多条语句。
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
{
// 加载驱动
Class.forName(driver);
try(
// 获取数据库连接
Connection conn = DriverManager.getConnection(url
, user , pass);
// 使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement())
{
// 执行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 数据表