2-执行SQL语句的方式
1.使用Statement执行SQL语句
(1)executeQuery(String sql):
该方法只能执行查询语句,返回一个ResultSet对象;
(2)executeUpdate(String sql)
该方法可以执行DML语句,并返回受影响的行数;
(3)execute(String sql)
如果执行后的第一个结果为ResultSet对象,则返回true;如果执行后的第一个结果为受影响的行数或没有结果,则返回false;使用execute(String sql)方法执行SQL语句的返回值只是boolean类型,当需要使用获得执行SQL语句得到的ResultSet时,需要使用Statement提供的如下两个方法:
getResultSet():获取该Statement执行SQL语句后得到的ResultSet;
getUpdateCount():获取该Statement执行DML语句所影响的记录行数;
使用execute()执行各种SQL语句:
1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.ResultSet;
4 import java.sql.Statement;
5
6 public class ExecuteTest {
7 public static void main(String[] args) throws Exception {
8 //加载数据库驱动
9 Class.forName("com.mysql.jdbc.Driver");
10 //使用DriverManager获取Connection
11 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test",
12 "root",
13 "stx12345");
14 //通过Connection获取Statement对象
15 Statement stat = conn.createStatement();
16 //使用Statement的execute()方法执行DDL语句:
17 stat.execute("create table test2("
18 + "id int primary key auto_increment,"
19 + "name varchar(255) not null,"
20 + "age int not null"
21 + ")");
22 //使用Statement的execute()方法执行DML语句:
23 stat.execute("insert into test2 (name,age) values('testName1',18)");
24 stat.execute("insert into test2 (name,age) values('testName2',19)");
25 stat.execute("insert into test2 (name,age) values('testName3',20)");
26 //使用Statement的execute()方法执行查询语句
27 stat.execute("select * from test2");
28 //获取结果集
29 ResultSet rs = stat.getResultSet();
30 while(rs.next()){
31 System.out.println(rs.getInt(1)+"|"+rs.getString(2)+"|"+rs.getInt(3));
32 }
33 }
34 }
2.使用PreparedStatement执行SQL语句
(1)PreparedStatement是Statement的子接口,除了可以实现与Statement相同的作用以外,还可以实现预编译SQL语句,预编译后的SQL语句被存储在PreparedStatement对象中,然后可以使用该对象多次执行预编译的SQL语句;使用PreparedStatement的效率要比Statement的效率高;
(2)使用PreparedStatement的示例:
1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.PreparedStatement;
4
5 public class PreparedStatementTest {
6 public static void main(String[] args) throws Exception {
7 //加载数据库驱动
8 Class.forName("com.mysql.jdbc.Driver");
9 //通过DriverManager获取Connection
10 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test",
11 "root",
12 "stx12345");
13 //通过Connection获取PreparedStatement对象
14 //预编译一条SQL语句
15 //所有的SQL都可以在PreparedStatement中预编译
16 PreparedStatement prep = conn.prepareStatement("insert into test2 (name,age) values (?,?)");
17 //使用PreparedStatement插入记录
18 prep.setString(1, "test3");
19 prep.setInt(2, 21);
20 prep.execute();
21 //再插入一条记录
22 prep.setString(1, "test4");
23 prep.setInt(2, 25);
24 prep.execute();
25
26 }
27 }
3.使用CallableStatement调用存储过程
(1)在mysql中创建一个存储过程:
delimiter //
create procedure add_pro(a int,b int,out sum int)
begin
set sum = a + b;
end;
//
(2)调用存储过程示例:
1 import java.sql.CallableStatement;
2 import java.sql.Connection;
3 import java.sql.DriverManager;
4 import java.sql.Types;
5
6
7 public class CallableStatementTest {
8 public static void main(String[] args)throws Exception{
9 //加载数据库驱动
10 Class.forName("com.mysql.jdbc.Driver");
11 //通过DriverManager获取Connection
12 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test",
13 "root",
14 "stx12345");
15
16 //使用Connection创建一个CallableStatement对象
17 CallableStatement call = conn.prepareCall("{call add_pro(?,?,?)}");
18
19 //传入参数
20 call.setInt(1, 5);
21 call.setInt(2, 8);
22
23 //注册CallableStatement的第三个参数是Int类型
24 call.registerOutParameter(3, Types.INTEGER);
25 //执行存储过程
26 call.execute();
27 //获取并输出存储过程传出参数的值
28 System.out.println("执行结果是:"+call.getInt(3));
29 }
30 }