JDBC对数据库进行操作

一.使用JDBC查询数据库表t_user的所有数据

1.User表
名称 数据类型 主键 是否为空 说明
ID number 是 用户编号
NAME Varchar2(50) 用户名
AGE varchar2(5) 用户年龄
BIRTH date 用户生日
PWD varchar2(20) 否 用户密码


import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcMysqlTest {
public static void main(String[] args) throws 
ClassNotFoundException,SQLException {
//1.加载jdbc驱动
Class.forName("com.mysql.jdbc.Driver");
//2.定义连接url
String url = "jdbc:mysql://127.0.0.1:3306/neuedu";
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection(url,"root","root");
//4.获得statement对象(用来执行sql语句,并返回结果)
Statement st = conn.createStatement();
//5.执行查询或更新
String sql = "select id,name,age,birth from t_user";
ResultSet rs = st.executeQuery(sql);
//6.处理结果(遍历获取查询出来的所有数据)
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String age = rs.getString("age");
Date birth = rs.getDate("birth");
System.out.println(id+":"+name+":"+age+":"+birth);
}
//7.关闭连接(释放资源)
rs.close();
st.close();
conn.close();}
}

程序运行结果如下:
7:zhangsan:age:2015-09-01
8:lisi:24:2015-09-01
9:wangwu:25:2015-09-01
10:wang:23:2015-09-01
以上给大家粗略的介绍了一下JDBC中涉及到的常用相关类和接口,每个类和接口包含的方法介绍的不是十分全面,希望大家在后续的学习过程中,能充分的利用Java API这个工具,不断提升自己的学习能力。

二.DBUtil类

【例7-2】封装打开连接和关闭资源的DBUtil类。
通常,无论是对数据进行查询操作,还是进行增删改操作,都需要打开连接,关闭资源等操作,因此,可以把对把打开连接和关闭连接封装到一个工具类里。本章后面所有例子对数据访问所用连接都是一样的。下面的DBUtil类封装了打开连接和关闭连接方法。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
//该段代码完成加载数据库驱动,整个程序只需要加载一次,所以放在静态块中。static{try {Class.forName("com.mysql.jdbc.Driver");//oracle数据库驱动程序} catch (ClassNotFoundException e) {e.printStackTrace();}}
//获取数据库连接方法public static Connection getConnection() throws SQLException{String url = "jdbc:mysql://127.0.0.1:3306/neuedu";Connection conn = DriverManager.getConnection(url,"root","root");return conn;}
//释放资源public static void close(Statement st,Connection conn){try{if(st != null){try {st.close();} catch (SQLException e) {                        e.printStackTrace();}}}finally{if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}public static void close(ResultSet rs, Statement st, Connection conn) {try {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}} finally {try {if (st != null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}}} finally {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}
}

使用DBUtil类操作数据库

【例7-3】使用DBUtil类操作数据库
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
public class UserDao {
//查询t_user表中所有数据public static void query() throws ClassNotFoundException, SQLException{Connection conn = null;Statement st = null;ResultSet rs = null;try{conn = DBUtil.getConnection();//直接调用DBUtil类的获取数据库连接方法String sql = "select id,name,age,birth from t_user";st = conn.createStatement();rs = st.executeQuery(sql);while(rs.next()){String id = rs.getString(1);String name = rs.getString(2);int age = rs.getInt(3);Timestamp ts= rs.getTimestamp("birth");//对ts进行格式化SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String birth = sdf.format(ts);System.out.println(id + " $ " + name + " $ " + age + " $ " + birth);}}finally{DBUtil.close(rs, st, conn); //调用DBUtil方法释放资源。}}
//在main()方法中调用查询操作。public static void main(String[] args) throws ClassNotFoundException, SQLException {query();}
}

运行结果分析:
调用query()方法输出结果:
7  z h a n g s a n zhangsan   zhangsan  23  2015 年 09 月 01 日  15 : 15 : 068 2015年09月01日 15:15:06 8   20150901日 15:15:068  lisi  24 24   24  2015年09月01日 15:15:23
9  w a n g w u wangwu   wangwu  25  2015 年 09 月 01 日  15 : 15 : 5210 2015年09月01日 15:15:52 10   20150901日 15:15:5210  hello1  500 500   500  2015年09月01日 15:16:03

三.PreparedStatement

PreparedStatement对象表示预编译的 SQL 语句的对象,为解决Statement静态拼接所产生的SQL 注入问题,引入了PreparedStatement接口。PreparedStatement接口是Statement接口的子接口,允许使用不同的参数多次执行同样的SQL语句。Connection接口提供创建PreparedStatement对象的方法,可指定SQL语句:
PreparedStatement prepareStatement(String sql) throws SQLException
PreparedStatement对象继承了Statement,但PreparedStatement语句中包含了警告预编译的SQL语句,因此可以获得更高的执行效率。虽然使用Statement可以对数据库进行操作,但它只适用于简单的SQL语句。如果需要执行带参数的SQL语句时,我们必须利用PreparedStatement类对象。PreparedStatement对象用于执行带或不带输入参数的预编译的SQL语句,语句中可以包含多个用问号”?”代表的字段,在程序中可以利用setXxx()方法设置该字段的内容,从而增强了程序设计的动态性。
PreparedStatement同Statement对象一样提供了很多基本的数据库操作方法,下面列出了执行SQL命令的3种方法。
(1)ResultSet executeQuery():可以执行SQL查询并获取ResultSet对象
(2)int executeUpdate():可以执行Update /Insert/Delete操作,返回值是执行该操作所影响的行数。
(3)boolean execute():这是一个最为一般的执行方法,可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet。

【例7-5】使用PreparedStatement解决例7-4中登录功能的SQL注入问题。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlInject {public static void login(String name, String PWD) throws SQLException{Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try{conn = DBUtil.getConnection();String sql = "SELECT * FROM t_user WHERE NAME=? AND PWD=?";ps = conn.prepareStatement(sql);//设置参数ps.setString(1, id);ps.setString(2, name);rs = ps.executeQuery();if(rs.next()){System.out.println("登录成功..");}else{System.out.println("登录失败..");}}finally{DBUtil.close(rs, ps, conn);}}    public static void main(String[] args) throws SQLException {login("123123", "sadfsdf' or 1=1 or ''='");//解决注入SQL                }
}

利用PreparedStatement实现对用户表的增删改查操作。

【例7-6】利用PreparedStatement实现对用户表的增删改查操作。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
public class UserDaoPreparedStatement {//插入操作public static void insert(String name, int age, Date birth)throws SQLException {Connection conn = null;PreparedStatement ps = null;try {conn = DBUtil.getConnection();String sql = "insert into t_user values(seq_user.nextval,?,?,?)";ps = conn.prepareStatement(sql);// 设置参数,有几个?就需要设置几个参数值ps.setString(1, name);ps.setInt(2, age);ps.setTimestamp(3, new Timestamp(birth.getTime()));int result = ps.executeUpdate();if (result > 0) {System.out.println("insert 成功...");} else {System.out.println("insert 失败...");}} finally {DBUtil.close(ps, conn);}}public static void main(String[] args) throws SQLException {insert("hello", 234, new Date());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/122195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【springboot单元测试,集成测试】

本文介绍一下SpringBoot中的测试方法 集成测试 SpringBootTest 一个普通的web api RequestMapping RestController public class HelloController {AutowiredRestTemplate restTemplate;GetMapping(value "/api/hi")public Map<String,Object> hello() {S…

服务运营 |论文解读: 住院病人“溢出”:一种近似动态规划方法

摘要 在住院床位管理中&#xff0c;医院通常会将住院病人分配到相对应的专科病房&#xff0c;但随着病人的入院和出院&#xff0c;可能会出现病人所需的专科病房满员&#xff0c;而其他病房却有空余床位的情况。于是就有了 "溢出 "策略&#xff0c;即当病人等候时间…

微服务-Feign

文章目录 Feign介绍Feign的基本使用自定义Feign的配置Feign性能优化Feign最佳实践 Feign介绍 RestTemplate远程调用存在的问题&#xff1a;代码可读性差&#xff0c;java代码中夹杂url&#xff1b;参数复杂很难维护 String url "http://userservice/user/" order.g…

Elasticsearch打分机制

一 例子 xx搜索引擎,就搜索结果本身而言,xx返回了正确的结果。因为返回的结果中,都包含了搜索的关键字。而我们从逻辑上来看,这一堆广告算是咋回事!这个吐槽是从用户的角度出发的。很显然,返回的结果中,尤其是前几条,有时甚至是前几页,都跟我们想要的结果相差深远! …

CSP-J 2023 T3 一元二次方程 解题报告

CSP-J 2023 T3 一元二次方程 解题报告 Link 前言 今年 C S P CSP CSP的原题, 回家 1 h 1h 1h内写 A C AC AC, 但是考场上没有写出来 , 原因是脑子太不好了, 竟然调了两个小时没有调出来. 一等奖悬那… 正题 看完题目,第一眼就是大模拟, 并且 C C F CCF CCF绝对不会让你好受…

JKPacket权威指南——学习建议

初学者 1&#xff0c;了解基本的swift语法&#xff0c;如果还没有从OC转swift的开发者建议尽早转swift了。 2&#xff0c;只需要下载源码并运行源码中demo&#xff0c;并阅读下具体使用的demo代码即可简单使用。 资深大佬 1&#xff0c;需要储备一定的rxswift相关知识&#…

ResNet(CVPR2016)

文章目录 AbstractIntroductionRelated WorkResidual RepresentationsShortcut Connections Deep Residual LearningResidual LearningIdentity Mapping by Shortcuts ExperimentConclusion 原文链接 Abstract 深层的神经网络更难训练&#xff0c;我们提出了一个残差学习框架&…

Day2-数组第二部分、双指针|LeetCode27、209、977、59|代码随想录

阅前声明&#xff1a;本人java基础不好&#xff0c;以后写的时候会加上一些java语法需要注意的地方&#xff0c;如果问题还请多多交流指正&#xff01; 数组第二部分主要是针对双指针思想展开的。 双指针思想 设置两个指针&#xff0c;fast指针用来指向新数组的内容&#xff…

怎么突破反爬虫机制

在当今的数字化时代&#xff0c;网络爬虫已经成为了收集信息和数据的重要工具。然而&#xff0c;许多网站和平台都配备了反爬虫机制&#xff0c;以防止恶意攻击和过度访问。对于普通用户来说&#xff0c;如何突破这些反爬虫机制呢&#xff1f;本文将为你提供一些实用的技巧和建…

Nginx的进程结构实例演示

可以参考《Ubuntu 20.04使用源码安装nginx 1.14.0》安装nginx 1.14.0。 nginx.conf文件中worker_processes 2;这条语句表明启动两个worker进程。 sudo /nginx/sbin/nginx -c /nginx/conf/nginx.conf开启nginx。 ps -ef | grep nginx看一下进程情况。 sudo /nginx/sbin/ng…

Git 拉取远程更新报错

报错内容如下&#xff1a; cannot lock ref refs/remotes/origin/bugfix/bug: refs/remotes/origin/bugfix 已存在&#xff0c;无法创建 refs/remotes/origin/bugfix/bug 来自 gitlab.zhangyue-inc.com:dejian_ios/iReaderDejian! [新分支] bugfix/bug -> ori…

Hive 视图和索引

本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1.视图 1.1 简介 Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集。视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0.0 引入的物化视图…

防关联浏览器推荐:MuLogin指纹浏览器安全登录多平台账号

在现今的数字时代&#xff0c;我们的生活离不开互联网。我们使用在线平台进行银行交易、购物、社交媒体互动和其他各种活动。为了保护个人隐私和账号安全&#xff0c;我们需要寻找一种安全且方便的方式来管理我们的在线账号。MuLogin指纹浏览器正是为了满足这些需求而设计的一款…

【Bond随你温故Kubernetes之】壹图复盘service与内部通信

最近跟朋友聊到了k8s 我&#xff1a; “环境给了就只管用呗&#xff0c;副本自动管理地妥妥的&#xff0c;有啥可以复盘的&#xff1f;“ 朋友&#xff1a; “容器的通讯与服务暴露还是有点东西的” 我&#xff1a; “嗯&#xff5e;&#xff5e;&#xff08;抿嘴点…

matlab中字符串转换为数字(str2double函数)

str2double函数 将 str 中的文本转换为双精度值。str 包含表示实数或复数值的文本。str 可以是字符向量、字符向量元胞数组或字符串数组。如果 str 是字符向量或字符串标量&#xff0c;则 X 是数值标量。如果 str 是字符向量元胞数组或字符串数组&#xff0c;则 X 是与 str 具…

C语言每日一题(21)删除排序数组中的重复项

力扣 26.删除排序数组中的重复项 题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考…

设计模式之创建型模式

创建型模式与对象的创建有关。 创建型模式抽象了对象实例化的过程&#xff0c;这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式&#xff0c;而不是使用 new 运算符直接实例化对象。创建型模式有以下 工厂模式&#xff08;Factory Method&#xff09; 意图&#xf…

CompletableFuture常见方法以及使用

常用场景&#xff1a; 1.并行执行多个任务&#xff1a;CompletableFuture 可以用于并行执行多个任务&#xff0c;从而提高性能 2.并行执行多个任务&#xff1a;CompletableFuture 可以用于并行执行多个任务&#xff0c;从而提高性能 3.任务依赖和组合&#xff1a;Completabl…

计算机网络基础二

课程目标 了解 OSI 七层模型分层结构 了解 TCP/IP 协议簇四层模型分层结构 能够说出 TCP/IP 协议簇中 运输层、网络层和数据链路 层常见的 相关协议 能够说出 TCP/IP 的三次握手四次断开过程 了解 Vmware 的三种网络模式 能够使用客户端工具连接虚拟机 掌握主机名、 DNS…

Android S从桌面点击图标启动APP流程 (六)

系列文章 Android S从桌面点击图标启动APP流程 (一)Android S从桌面点击图标启动APP流程 (二) Android S从桌面点击图标启动APP流程 (三) Android S从桌面点击图标启动APP流程 (四) Android S从桌面点击图标启动APP流程 (五) Android 12的源码链接&#xff1a; android 1…