JDBC与PostgreSQL(二)

目录

 

一、执行DDL语句

二、执行DML语句

三、执行DQL语句

四、使用预编译的方式执行SQL语句(推荐)


一、执行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);
		}
	}
}

    控制台输出结果:

    查询结果正确!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值