JDBC回顾
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
JDBC回顾
- 前言
- 一、JDBC
- 1.JDBC是什么?
- 2.如何使用?
- (1)注册驱动
- (2)获取连接
- (3)操作数据表
- 3、ResultSet与ResultSetMetaData
- (1)ResultSet
- (2)ResultSetMetaData
前言
前段时间看到有关JDBC的一篇文章,颇有感触,闲来无事回顾总结一下有关JDBC的知识点。
提示:以下是本篇文章正文内容,下面案例可供参考
一、JDBC
1.JDBC是什么?
我们在未使用JDBC之前,连接不同的数据库,就像如下图例一样,使用那个数据库就使用对应的连接方法,数据库一多,不同的连接方法就显得杂乱,不整齐,无规矩。
有了 JDBC之后:
总结来说:
- JDBC是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。
- JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
- JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
2.如何使用?
使用JDBC主要从以下入手:
1、注册驱动
2、获取连接
3、创建statement对象
4、发送SQL语句
5、结果集解析
6、关闭资源 【先开后关】
举例:
public static void main(String[] args) throws SQLException {//1.注册驱动/*** TODO: 注意* Driver ->5.8及其以上 com.mysql.cj.jdbc.Driver* 5.8以下 com.mysql.jdbc.Driver*/DriverManager.registerDriver(new Driver());//2.获取连接/*** TODO: 注意* 面向接口编程* java.sql 接口 = 实现类* connection 使用java.sql.Connection接口接收*/Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.31.19:3306/atguigu", "root", "root");//3.创建小车Statement statement = connection.createStatement();//4.发送SQL语句String sql = "select id,account,password,nickname from t_user ;";ResultSet resultSet = statement.executeQuery(sql);//5.结果集解析while (resultSet.next()){int id = resultSet.getInt("id");String account = resultSet.getString("account");String password = resultSet.getString("password");String nickname = resultSet.getString("nickname");System.out.println(id+"::"+account+"::"+password+"::"+nickname);}//6.关闭资源 【先开后关】resultSet.close();statement.close();connection.close();}
(1)注册驱动
①
/**
*加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传
*递要加载的 JDBC 驱动的类名
*/
Class.forName(“com.mysql.jdbc.Driver”);
②
//1.加载配置文件InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties pros = new Properties();pros.load(is);//2.读取配置信息String user = pros.getProperty("user");String password = pros.getProperty("password");String url = pros.getProperty("url");String driverClass = pros.getProperty("driverClass");//3.加载驱动Class.forName(driverClass);
其中,配置文件声明在工程的src目录下:【jdbc.properties】
user=root
password=abc123
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver
说明:使用配置文件的方式保存配置信息,在代码中加载配置文件
使用配置文件的好处:
①实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码
②如果修改了配置信息,省去重新编译的过程。
(2)获取连接
可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
User,password可以用“属性名=属性值”方式告诉数据库;
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的
驱动程序,从而建立到数据库的连接。
(3)操作数据表
①使用Statement操作数据表
- 通过调用 Connection 对象的 createStatement() 方法创建该对象。该对象用于执行静态的 SQL 语句,并且返回执行结果。
- Statement 接口中定义了下列方法用于执行 SQL 语句:
/*** SQL分类:DDL(容器创建、修改、删除) DML(插入、修改、删除) DQL(查询) TPL(事务控制语言)* 方式一:* int i = statement.executeUpdate(sql);* 参数:sql 非DQL* 返回: int* 情况1:DML 返回影响行数,例如删除了三条数据 return 3; 插入了两条 return 2* 情况2: 非DML return 0;* 方式二:* ResultSet resultSet = statement.executeQuery(sql);* 参数:sql DQL* 返回: resultSet 结果封装对象**/
int excuteUpdate(String sql):执行更新操作INSERT、UPDATE、DELETE
ResultSet executeQuery(String sql):执行查询操作SELECT
-
但是使用Statement操作数据表存在弊端:
- 问题一:存在拼串操作,繁琐
- 问题二:存在SQL注入问题
-
SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令(如:SELECT user, password FROM user_table WHERE user=‘a’ OR 1 = ’ AND password = ’ OR ‘1’ = ‘1’) ,从而利用系统的 SQL 引擎完成恶意行为的做法。
-
对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement(从Statement扩展而来) 取代 Statement 就可以了。
②PreparedStatement
可以通过调用 Connection 对象的 preparedStatement() 方法获取
PreparedStatement 对象
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的
SQL 语句
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调
用 PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方
法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开
始),第二个是设置的 SQL 语句中的参数的值
举例:
@Testpublic void test() throws ClassNotFoundException, SQLException {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection = DriverManager.getConnection(URL, USER, PS);String sql = "insert into t_user(account,password,nickname) values (?,?,?);";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1,"test");preparedStatement.setString(2,"1243");preparedStatement.setString(3,"user");int i = preparedStatement.executeUpdate();System.out.println(i);preparedStatement.close();connection.close();
}
3、ResultSet与ResultSetMetaData
(1)ResultSet
-
查询需要调用PreparedStatement 的 executeQuery() 方法,查询结果是一个ResultSet 对象
-
ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商提供实现
-
ResultSet 返回的实际上就是一张数据表。有一个指针指向数据表的第一条记录的前面。
-
ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行。调用 next()方法检测下一行是否有效。若有效,该方法返回 true,且指针下移。相当于Iterator对象的 hasNext() 和 next() 方法的结合体。
-
当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一列的值。
- 例如: getInt(1), getString(“name”)
- 注意:Java与数据库交互涉及到的相关Java API中的索引都从1开始。
-
ResultSet 接口的常用方法:
- boolean next()
- getString()
- …
(2)ResultSetMetaData
-
可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
-
ResultSetMetaData meta = rs.getMetaData();
- getColumnName(int column):获取指定列的名称
- getColumnLabel(int column):获取指定列的别名
- getColumnCount():返回当前 ResultSet 对象中的列数。
- getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
- getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。
- isNullable(int column):指示指定列中的值是否可以为 null。
- isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。
关于ResultSetMetaData**
- 如何获取 ResultSetMetaData: 调用 ResultSet 的 getMetaData() 方法即可
- 获取 ResultSet 中有多少列:调用 ResultSetMetaData 的 getColumnCount() 方法
- 获取 ResultSet 每一列的列的别名是什么:调用 ResultSetMetaData 的getColumnLabel() 方法
相关文章:
JDBC回顾
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 JDBC回顾 前言一、JDBC1.JDBC是什么?2.如何使用?(1)注册驱动(2)获取连接(3)操作…...
mq 消息队列 mqtt emqx ActiveMQ RabbitMQ RocketMQ
省流: 十几年前,淘宝的notify,借鉴ActiveMQ。京东的ActiveMQ集群几百台,后面改成JMQ。 Linkedin的kafka,因为是scala,国内很多人不熟。淘宝的人把kafka用java写了一遍,取名metaq,后…...
沃尔玛卖家必看!解决订单被Kan、Feng号问题的终极方案!
近期有很多沃尔玛卖家和工作室联系到我提到说在沃尔玛平台上下单,买家号出现副款义常订单被k掉,是什么原因、我们该如何去解决呢? 以下是一些可能导至你的测评订单被k单的原因: 1.技术问题:有时,网站或系…...
浅谈日常使用的 Docker 底层原理-三大底座
适合的读者,对Docker有过简单了解的朋友,想要进一步了解Docker容器的朋友。 前言 回想我这两年,一直都是在使用 Docker,看过的视频、拜读过的博客,大都是在介绍 Docker 的由来、使用、优点和发展趋势,但对…...
前端面试:【DOM】编织网页的魔法
嘿,亲爱的代码魔法师!在JavaScript的奇幻世界里,有一项强大的技能,那就是DOM操作。DOM(文档对象模型)操作允许你选择、修改和创建网页元素,就像是在编织一个魔法的网页。 1. 什么是DOMÿ…...
基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 2 Inport和Outports 标签页介绍
上篇我们介绍了Function页的内容,这篇我们介绍Inports和Outports页的内容,这里我们再次强调一个概念,code mapping是以simulink的角度去看的,就是先要在模型中建立simulink模块,在code mapping里映射他要对应的autosar的元素,之后生成代码时的c语言的名字是以Autosar的元…...
第9步---MySQL的索引和存储引擎
第9步---MySQL的索引和存储引擎 1.索引 1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和btree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值,找到对应的空间会出现对应的值 btree树…...
Numpy入门(3)—线性代数
线性代数 线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分,NumPy中实现了线性代数中常用的各种操作,并形成了numpy.linalg线性代数相关的模块。本节主要介绍如下函数: diag&am…...
php的openssl_encrypt是不是自动做了PKCS5Padding?
在PHP中,openssl_encrypt函数默认使用的是PKCS7填充(不是PKCS5填充)。PKCS7填充实际上是PKCS5填充的扩展,用于对不同块大小的数据进行填充。 当你使用openssl_encrypt函数进行加密时,如果你没有显式指定填充模式和填充…...
在本地创建repository及上传至github
文章目录 本地管理设定git的用户名与邮箱初始化添加修改提交修改设定分支问题一:error: insufficient permission for adding an object... 数据同步创建SSH keys创建并关联远程仓库上传改动至github问题二:Failed to connect to github.com port 443: Connection timed out问题…...
情人节特别定制:多种语言编写动态爱心网页(附完整代码)
写在前面案例1:HTML Three.js库案例2:HTML CSS JavaScript案例3:Python环境 Flask框架结语 写在前面 随着七夕节的临近,许多人都在寻找独特而令人难忘的方式来表达爱意。在这个数字时代,结合创意和技术࿰…...
Docker mysql主从同步安装
1. 构建master实例 docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7 2. 构建master配置…...
docker update 命令
docker update 更新一个或多个容器的配置。官方文档 用法 $ docker update [OPTIONS] CONTAINER [CONTAINER...]请参阅选项部分OPTIONS,了解此命令可用的概述。 描述 该docker update命令动态更新容器配置。您可以使用此命令来防止容器消耗 Docker 主机的过多资…...
阻塞和挂起的区别和联系
阻塞和挂起是进程两种不同的状态,其描述如下: 阻塞:正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻…...
水力发电厂测量装置配置选型及厂用电管理系统
《水力发电厂测量装置配置设计规范》对水电厂的测量装置配置做了详细要求和指导。测量装置是水力发电厂运行监测的重要环节,水电厂的测量主要分为电气量测量和非电量测量。电气测量指使用电的方式对电气实时参数进行测量,包括电流、电压、频率、功率因数…...
【RabbitMQ】RabbitMQ整合SpringBoot案例
文章目录 1、前情提要【RabbitMQ】2、RabbitMQ-SpringBoot案例 -fanout模式2.1 实现架构总览2.2 具体实现2.2.1生产者2.2.1消费者 1、前情提要【RabbitMQ】 【RabbitMQ】消息队列-RabbitMQ篇章 RabbitMQ实现流程 2、RabbitMQ-SpringBoot案例 -fanout模式 2.1 实现架构总览…...
如何在window下cmd窗口执行linux指令?
1.Git:https://git-scm.com/downloads(官网地址) 2.根据自己的实际路径,添加两个环境变量 3.重启电脑...
c++基础系列:字符串、向量和数组
字符串、向量和数组 命名空间的using声明 目前用到的库函数基本上都属于命名空间std;通过using声明(using declaration)实现更简单的途径使用到命名空间中的成员。 标准库类型string string表示可变长的字符序列,必须先包含st…...
docker 05(dockerfile)
一、docker镜像原理 镜像可以复用 二、容器转镜像 将容器保存为镜像[参考] docker commit -a -m 现有容器ID 保存后的名称:版本号 -a :提交的镜像作者; -c :使用Dockerfile指令来创建镜像; -m :提交时的说明文字; -p :…...
PostMan 测试项目是否支持跨域
使用PostMan可以方便快速的进行跨域测试。 只需要在请求头中手动添加一个Origin的标头,声明需要跨域跨到的域(IP:端口)就行,其余参数PostMan会自动生成。添加此标头后,请求会被做为一条跨域的请求来进行处…...
jsp 协同过滤 图书管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 JSP 协同过滤 图书管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发,数据库为My…...
商城-学习整理-高级-商城业务-商品上架es(十)
目录 一、商品上架1、sku在ES中存储模型分析2、nested数据类型场景3、构造基本数据(商品上架) 二、首页1、项目介绍2、整合thymeleaf(spring-boot下模板引擎)渲染页面3、页面修改不重启服务器实时更新4、渲染二级三级数据 三、搭建…...
【水文学法总结】河道内生态流量计算方法(含MATLAB实现代码)
生态流量(Ecological Flow, EF) 是指维持河道内生态环境所需要的水流流量。生态流量计算方法众多,主要分为水文学方法、栖息地模拟法、水力学方法、整体法等,各方法多用于计算维持河道生态平衡的最小生态流量(Minimum …...
特斯拉Model 3的七年狂飙
作者 | 张祥威 编辑 | 德新 发布一周拿下32万张订单,之后用时五年,交付量突破100万辆。粗略计算,自2016年发布至今,特斯拉Model 3已交付超150万辆。 放眼新能源赛道,如此战绩 别无二家。 Model 3踩中纯电动车的…...
物流签收异常,财务对账复杂,怎么解决?
电子商务行业的蓬勃发展为人们的购物体验带来了巨大的便利,然而,随之而来的物流签收异常和财务对账复杂问题却给电商企业的财务部门带来了一系列困扰。 每天大量的订单和货物流转,不可避免地导致了物流签收数据与财务记录之间的不一致和差异…...
docker之镜像与数据卷
镜像 简介 1.镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量、配置文件 2.将所有的应用和环境11,直接打包成docker镜像&…...
服务器为什么会被攻击?43.248.186.x
进入信息时代,各种行业对数据的安全和技术要求也越来越高,同时也遇到了各种各样的服务器故障问题,但是网络攻击才是最大的伤害,在这上面造成了企业不必要的损失,那么服务器为什么会被攻击,这里给大家讲解一下服务器被攻击有哪几种情况 一、服…...
文心一言 VS 讯飞星火 VS chatgpt (79)-- 算法导论7.4 4题
四、请用go语言,证明:RANDOMIZED-QUICKSORT 期望运行时间是 Ω(nlgn)。 文心一言: 首先,为了证明RANDOMIZED-QUICKSORT的期望运行时间是Ω(nlg n),我们需要证明在最坏的情况下,该算法的运行时间是O(nlg n)。然后&…...
整理mongodb文档:索引
个人博客 整理mongodb文档:索引 个人博客,求关注,有问题的地方欢迎指出,觉得讲解的繁琐的也请指出 文章概叙 本文主要还是在shell下的操作。让大家了解下mongodb中index的用途,基本的索引的新增、查看、删除等,最后…...
EPICS libCom库(4) -- epicsTimer
epicsTimer.h描述了一个C和C timer功能。 1 C接口 1.1 epicsTimerNotify和epicsTimer /* 使用一个timer的代码必须实现epicsTimerNotify */ class LIBCOM_API epicsTimerNotify { public:enum restart_t { noRestart, restart };class expireStatus {public:LIBCOM_API expir…...
门户wordpress主题/引擎优化seo怎么做
1.安装ntp软件包sudo apt-get install ntp2.同步时间sudo ntpdate -u 210.72.145.443.检查本地时间和时间服务器的时间的误差sudo ntpdate -q 210.72.145.44关键:找对同步的服务器转载于:https://blog.51cto.com/kaiyuan/563607...
wordpress 注册邮件设置/互动营销名词解释
在我们使用电脑的时候,有些情况下可能就会遇到我们的电脑出现没有启动服务器服务的情况。对于这种问题小编觉得可能是因为我们系统本身就没有开启服务器服务,只要我们手动开启即可。可以在运行中打开services.msc服务,然后进行相关的设置即可…...
html+css网站模板/搜索引擎优化学习
补充switch语句的内容和逗号运算符C语言case后没有break的switch语句,会继续执行后面的语句再退出补充逗号运算符C语言case后没有break的switch语句,会继续执行后面的语句再退出 对于switch语句,我们在使用的时候都会注意使用的规范…...
安徽制作网站的公司哪家好/交换友情链接的注意事项
这篇文章只是纯粹分析python pyc文件格式,主要是关于pyc在文件中的存储方式进行了解析。pyc是python字节码在文件中存储的方式,而在虚拟机运行时环境中对应PyCodeObject对象。关于PyFrameObject以及PyFunctionObject等运行时结构,后续希望学习…...
WordPress万级数据优化/天津外贸seo推广
213. 打家劫舍 II - 力扣(LeetCode) 一、题目 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相…...
11号在线 网站开发/网站seo入门基础教程书籍
本文分别介绍桶排序、计数排序和基数排序三种排序算法,这三个算法有着共同的算法思想,下面分别介绍三种排序算法.桶排序桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里。假设待排序的数组a中共有N个整数,并且已…...