JDBC与PostgreSQL(二)

2023-11-05

目录

 

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

    控制台输出结果:

    查询结果正确!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC与PostgreSQL(二) 的相关文章

  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • Java 继承 (超详细)

    目录 1 什么是继承 2 在何处使用继承 3 如何使用继承 4 理解继承 4 1 子类可以继承父类的所有资源吗 4 2访问修饰符protected 5 方法重写 5 1方法的重写或方法的覆盖 Overriding 5 2必须遵守的规则 1
  • canvas小练习之渐变粒子特效

  • 【Python生存分析库scikit-survival的安装及使用教程】

    Python生存分析库scikit survival的安装及使用教程 生存分析是指在人口统计学领域中 对于以某种特定因素为背景下出现某类事件的时间进行统计分析的一种方法 在Python中 scikit survival就是一个十分实用的生存
  • 一文详解 ChatGPT:背后的技术,数据,未来发展

    文章目录 一文详解 ChatGPT ChatGPT背后的技术 基于 Transformer 的预训练语言模型 提示学习与指令精调 思维链 Chain of Thought COT 基于人类反馈的强化学习 Reinforcement Lear
  • Doris系列15- 索引

    文章目录 一 索引概述 二 案例 参考 一 索引概述 目前Doris只支持bitmap 索引 BITMAP 索引仅在单列上创建 bitmap index 位图索引 是一种快速数据结构 能够加快查询速度 语法 index 创建和修改相关语法有
  • RT-Thread分析-日志系统-rt_kprintf分析

    目录 1 前言 2 rt kprintf 3 配置选项 4 console设备 4 1 设备声明 4 2 设备创建 4 3 获取 console device 5 分析rt kprintf 函数 6 rt kprintf重定向 1 前言 内
  • sqli-labs(38-41)

    0x01 原理 堆叠注入 顾名思义就是很多语句结合在一起进行注入 在sql语句中 以 标志着一条语句的结束 要实现堆叠注入就是用 连接多条语句进行注入 即我们可以结束一个语句后 构造下一个语句 而union select也是将两条语句结合在
  • install4j与exe4简介——Java应用程序打包工具

    对于已经完成的Java应用程序开 发项目 从商业化角度看 应该制作成安全稳定的安装程序包来保证产品的安全和企业的利益 现在市面上比较高效的商业化工具有 installshield installanywhere install4j等 ins
  • 2019~2020数字货币领域发展趋势报告

    一 数字货币的概述 1 什么是数字货币 对于数字货币 目前并没有准确的统一定义 根据百度百科资料显示 数字货币是电子货币形式的替代货币 数字金币和密码货币都属于数字货币 是一种不受管制的 数字化的货币 通常由开发者发行和管理 被特定虚拟社区
  • pytorch使用profiler对模型性能分析时报错

    源码 参考自 PyTorch模型性能分析 优化及部署 aliyun com def analysis from torch profiler import profile tensorboard trace handler import t
  • Java Instrument 功能使用及原理

    0 介绍 利用 java lang instrument 做动态 Instrumentation 是 Java SE 5 的新特性 它把 Java 的 instrument 功能从本地代码中解放出来 使之可以用 Java 代码的方式解决问题
  • 弹弹弹,弹走鱼尾纹的弹出菜单(vue)

    前言 上一篇面试的总结 大家看的还行 因为量很大 错误在所难免 希望大家发现错误了可以告诉我一声 我的邮箱是236490794 qq com 一个小前端的希望 言归正传 我们老样子直接先上效果图再开始今天的分享这个项目的github可以看一
  • mpvue,uni-app开发微信小程序遇到的坑,直接在组件上写样式失效

    1 问题 在组件上直接写样式在小程序中不生效 解决办法
  • 互联网摸鱼日报(2023-06-25)

    互联网摸鱼日报 2023 06 25 InfoQ 热门话题 PayPal开源JunoDB 支持3500亿次日请求的键值存储 博客园新闻 马斯克小扎公开约架 亿万富翁八角笼决斗 Meta发言人 不是玩笑 亚马逊云斥资1亿美元建AIGC中心 微
  • 分布式训练——集合通信及其通信原语

    分布式训练 集合通信及其通信原语 转自 分布式训练 第3篇 集合通信及其通信原语 作者 常平 1 概述 集合通信 Collective Communications 是一个进程组的所有进程都参与的全局通信操作 其最为基础的操作有 发送sen
  • EHCI控制器(3)——host模式数据传输模型

    3 host模式数据传输模型 3 1控制传输 3 1 1配置通道特性 3 1 2配置通道0 包数量 3 1 3配置通道0 PID 3 1 4配置DMA描述符 3 1 5更新DMA描述符地址 3 1 6清通道0中断状态 3 1 7使能通道0
  • java代码_阿里Java团队的的代码规范,学到很多

    一 迭代entrySet 获取Map 的key 和value 当循环中只需要获取Map 的主键key时 迭代keySet 是正确的 但是 当需要主键key 和取值value 时 迭代entrySet 才是更高效的做法 其比先迭代keySet
  • mysql 本周函数_MySQL的YEARWEEK函数以及查询本周数据(转)

    MySQL的YEARWEEK函数以及查询本周数据 MySQL 的 YEARWEEK 是获取年份和周数的一个函数 函数形式为 YEARWEEK date mode 例如 2010 3 14 礼拜天 SELECT YEARWEEK 2010 3
  • Oracle+jdbc+rac+url,jdbc连接oracle rac数据库的写法

    RAC是real application clusters的缩写 译为 实时应用集群 是Oracle新版数据库中采用的一项新技术 是高可用性的一种 也是Oracle数据库支持网格计算环境的核心技术 jdbc连接oracle rac数据库的写
  • JDBC与PostgreSQL(二)

    目录 一 执行DDL语句 二 执行DML语句 三 执行DQL语句 四 使用预编译的方式执行SQL语句 推荐 一 执行DDL语句 SQL的DDL语句也就是数据定义语言 Data Definition Language 在JDBC中需要获取St