目录
一、执行DDL语句
SQL的DDL语句也就是数据定义语言(Data Definition Language),在JDBC中需要获取Statement类对象,然后使用Statement类对象发起
现在使用JDBC来执行DDL语句。
在PostgreSQL中的test数据库中创建创建一张Student表:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JdbcDDL {
public static void main(String[] args) throws Exception {
// 参数:
// jdbc协议:postgresql子协议://主机地址:数据库端口号/要连接的数据库名
String url = "jdbc:postgresql://localhost:5432/test";
// 数据库用户名
String user = "postgres";
// 数据库密码
String password = "123456";
// 1. 加载Driver类,Driver类对象将自动被注册到DriverManager类中
Class.forName("org.postgresql.Driver");
// 2. 连接数据库,返回连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 获取Statement对象
Statement state = conn.createStatement();
// 4. 发送SQL语句
String sql = "CREATE TABLE student(" +
"sno character(9) PRIMARY KEY," +
"sname character(20) UNIQUE," +
"ssex character(2)," +
"sage smallint," +
"sdept character(20)" +
");";
int count = state.executeUpdate(sql);
System.out.println(count); // 0
}
}
这里使用了Statement类的executeUpdate()方法来执行DDL语句,这个方法对于 SQL 数据操作语言 (DML) 语句,将返回行计数 , 对于什么都不返回的 SQL 语句,返回 0,由于这个示例是创建一张表,所以executeUpdate()方法返回0。
二、执行DML语句
DML也就是数据操纵语言(Data Manipulation Language),JDBC同样使用Statement类的executeUpdate()方法来执行DML语句。
现在在刚才创建的Student表中插入一条数据:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcDML1 {
public static void main(String[] args) throws Exception {
// 参数:
// jdbc协议:postgresql子协议://主机地址:数据库端口号/要连接的数据库名
String url = "jdbc:postgresql://localhost:5432/test";
// 数据库用户名
String user = "postgres";
// 数据库密码
String password = "123456";
// 1. 加载Driver类,Driver类对象将自动被注册到DriverManager类中
Class.forName("org.postgresql.Driver");
// 2. 连接数据库,返回连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 获取Statement对象
Statement state = conn.createStatement();
// 4. 发送SQL语句
String sql = "INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept) "
+ "VALUES('201215128', '陈东', '男', 18, 'IS');";
int count = state.executeUpdate(sql);
System.out.println(count); // 1
}
}
执行成功,打印count输出1,表示影响了数据表中的一行。
查看数据表果然插入了一条记录:
三、执行DQL语句
DQL就是数据查询语言(Data Query Language),需要通过Statement类的executeQuery()方法来执行SQL查询语句。
下面来使用DQL语句查询Student表的内容:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcDQL {
public static void main(String[] args) throws Exception {
// 参数:
// jdbc协议:postgresql子协议://主机地址:数据库端口号/要连接的数据库名
String url = "jdbc:postgresql://localhost:5432/test";
// 数据库用户名
String user = "postgres";
// 数据库密码
String password = "123456";
// 1. 加载Driver类,Driver类对象将自动被注册到DriverManager类中
Class.forName("org.postgresql.Driver");
// 2. 连接数据库,返回连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 获取Statement对象
Statement state = conn.createStatement();
// 4. 发送SQL语句,返回该查询生成的ResultSet对象
String sql = "SELECT * FROM Student;";
ResultSet rs = state.executeQuery(sql);
// 5. 遍历查询结果
while(rs.next()) {
String sno = rs.getString("sno");
String sname = rs.getString("sname");
String ssex = rs.getString("ssex");
String sage = rs.getString("sage");
String sdept = rs.getString("sdept");
System.out.println("Sno:" + sno + ", Sname:" + sname +
", Ssex:" + ssex + ", Sage:" + sage + ", Sdept:" + sdept);
}
}
}
查询结果:
executeQuery()方法会返回一个ResultSet对象,需要借助ResultSet的next()方法来做类似移动指针的操作,以遍历查询结果的每一行记录。另外ResultSet有诸如getXXX()的方法用于取得每一行记录中的每一个分量。
四、使用预编译的方式执行SQL语句(推荐)
除了使用Statement类来发送SQL语句外,还可以使用PreparedStatement类(Statement类的子类)发送SQL语句,PreparedStatement类使用预编译的方式来构建JAVA应用程序和数据库的交互。
现在使用预编译SQL的方法向Student表中插入一行记录:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcDML2 {
public static void main(String[] args) throws Exception {
// 参数:
// jdbc协议:postgresql子协议://主机地址:数据库端口号/要连接的数据库名
String url = "jdbc:postgresql://localhost:5432/test";
// 数据库用户名
String user = "postgres";
// 数据库密码
String password = "123456";
// 1. 加载Driver类,Driver类对象将自动被注册到DriverManager类中
Class.forName("org.postgresql.Driver");
// 2. 连接数据库,返回连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 预编译SQL, 获取PreparedStatement对象
String sql = "INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept) " +
"VALUES(?, ?, ?, ?, ?);";
PreparedStatement state = conn.prepareStatement(sql);
// 4. 设置参数,并执行SQL语句
state.setString(1, "201215129"); // 注意:索引从1开始
state.setString(2, "李明");
state.setString(3, "男");
state.setInt(4, 19);
state.setString(5, "IS");
int count = state.executeUpdate();
System.out.println(count); // 1
}
}
插入一条记录成功!
PreparedStatement与Statement的区别在于:
- 语法不同:PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql
- 效率不同: PreparedStatement可以使用sql缓存区,效率比Statment高
- 安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。
所以强烈推荐使用预编译SQL的方式来与数据库进行交互。
当然PreparedStatement也能用于执行DDL于DQL,现在使用预编译SQL的方式来查询Student表中Sno字段为"201215129"的学生的姓名:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcDQL2 {
public static void main(String[] args) throws Exception {
// 参数:
// jdbc协议:postgresql子协议://主机地址:数据库端口号/要连接的数据库名
String url = "jdbc:postgresql://localhost:5432/test";
// 数据库用户名
String user = "postgres";
// 数据库密码
String password = "123456";
// 1. 加载Driver类,Driver类对象将自动被注册到DriverManager类中
Class.forName("org.postgresql.Driver");
// 2. 连接数据库,返回连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 预编译SQL, 获取PreparedStatement对象
String sql = "SELECT Sname FROM Student WHERE Sno = ?";
PreparedStatement state = conn.prepareStatement(sql);
// 4. 设置参数,并执行SQL语句
state.setString(1, "201215129");
ResultSet rs = state.executeQuery();
while(rs.next()) {
String sname = rs.getString("Sname");
System.out.println("学号(Sno)为201215129的学生的姓名(Sname)为: " + sname);
}
}
}
控制台输出结果:
查询结果正确!