freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

java-JDBC基础
2022-12-16 22:46:28
所属地 浙江省

javaJDBC

一、概述

JDBC:java 数据库 连接。。。

因为不同的数据库内部处理数据的方式不同,各个厂商提供的访问接口也不一样,为了提高程序的可移植性就有了这套API。JDBC要求数据库厂商按照统一规范来提供数据库驱动(就是java给出接口,实现类由数据库厂商给)。应用程序就可以通过这套API连接到关系型数据库并执行SQL语句。在程序中由JDBC和具体的数据库驱动联系,就不需要直接和底层的数据库进行交互,可以做到替换底层数据库的时候代码 基本上 不变。

程序 <---> JDBC <---> 数据库

二、常用接口、类

前面简单介绍一下JDBC的来处,接下去来看一下JDBC本身。

JDBCAPI主要位于 java.sql 包,主要内容有五个接口和一个类。

1、Driver 接口

Driver接口是所有JDBC驱动程序都必须实现的接口,是提供给数据库厂商使用的。就没了...

这里补充一下驱动程序:

在概述里说了驱动程序其实就是由数据库厂商写好的实现类,我们在使用JDBC写程序的时候要根据不同的数据库使用不同的驱动,数据库厂商会把实现类打包成jar包给我们使用。

用mysql驱动说明一下,下载连接:MySQL :: Download Connector/J下载解压缩出来就可以看见mysql-connector-j-8.0.31.jar这个玩意。Driver.class就在这里面。

image

2、DriverManager 类

用于注册JDBC驱动、创建与数据库的连接。

这个类里面由俩比较重要的静态方法:

static void registerDriver(Driver driver)  //注册驱动程序。
static Connection getConnection(String url, String user, String password) //连接数据库

通常情况下一般不会使用registerDriver来注册驱动,因为驱动程序本身就有向DriverManager注册Driver实例的静态代码块,用它就相当于实例化了俩Driver对象。所以推荐使用Class类的静态方法forName来实现。

3、Connection接口

代表java程序和数据库的连接对象,只有获得这个对象才能操作数据库,使用前面说的DriverManager 类里边的getConnection方法,连接成功就会返回Connection对象。

Connection对象也有一个重要的方法:

Statement createStatement() //创建一个Statement对象,用于将 SQL 语句发送到数据库执行并返回结果。

4、Statement接口

这个接口用于执行sql语句并返回结果。使用Connection对象的createStatement获得这个对象

常用的执行sql语句的方法如下:

boolean execute(String sql) //执行给定的 SQL 语句,该语句可能返回多个结果。
int executeUpdate(String sql) //执行INSERT 、 UPDATE或DELETE语句或不返回任何内容的 SQL 语句,返回内容是语句影响的记录数量
ResultSet executeQuery(String sql) //执行select语句,该语句返回单个表述查询结果的ResultSet对象。

5、PreparedStatement

Statement可以执行SQL语句,但是再实际的开发中要执行的语句大多数都不是写死的,所以就需要使用变量来拼接SQL语句,就容易造成你懂我懂大家懂的SQL注入,且使用Statement操作这些语句太繁琐了就有了PreparedStatement接口。

PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。应用接口中的SQL语句可以使用占位符来代替参数,然后通过一些方法给参数赋值。

使用Statement的prepareStatement方法就可以获得一个PreparedStatement对象用于执行参数化SQL语句。

PreparedStatement prepareStatement(String sql)

6、ResultSet接口

ResultSet接口用于保存JDBC执行查询语句返回的结果集。这些结果集都封装再一个逻辑表格中。再ResultSet接口内部有一个指向表格数据行的指针,也叫游标。ResultSet对象初始化的时候指针再逻辑表格第一行之前,调用ResultSet对象的next方法指针就移动到下一行,知道下一行没有数据时就返回false。

这东西真的是一环套一环。。。。。。

三、JDBC的使用

使用JDBC有个通用的固定模式。

1、注册驱动

Class.forName("com.mysql.jdbc.Driver");

这里补充一个CLASSPATH的内容:

CLASSPATH就是一个JAVA虚拟机用来搜索class文件的一个环境变量。我们可以在环境变量里添加一个名为CLASSPATH的变量,值为以下形式:

必须包含当前目录,也就是 . !!!因为jvm会根据这个变量里的路径去搜你要使用的class文件,假如没有点就不包含当前目录,你运行当前目录下的文件时,jvm就找不到了。多个目录时,Windows下用分号分隔,Linux用冒号。

.;D:\path\java\就是你要用到的class文件的路径\;D:\path\也可以是zip或者jar文件的路径.jar

!但是不建议使用设置环境变量的形式来设置CLASSPATH,从JDK5开始,如果环境变量里没有CLASSPATH,java虚拟机就会自动搜索当前目录下的类文件,并且自动加载dt.jar和tools.jar里的类文件。

!!而且,Java运行文件的时候可以设置classpath,java --hep。

-cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
    --class-path <目录和 zip/jar 文件的类搜索路径>
                  使用 ; 分隔的, 用于搜索类文件的目录, JAR 档案
                  和 ZIP 档案列表。

!!!最后,再写代码时使用的编辑器都可以设置库文件目录。拿IDEA举例,在新建一个项目之后我们可以新建一个文件夹,然后再左上角的文件>项目结构>模块,把新建的目录标记为资源。然后把jar啥的丢进这个目录就好了。

再补充一点,向IDEA这种编辑器,再运行的时候都会设置使用-classpath这种选项设置当前项目的classpath。所以如果环境变量里面的CLASSPATH和它用的不一样还是会报错的。总结就是一句话,CLASSPATH,不设也罢。

2、DriverManager获取连接

Connection con = DriverManager.getConnection(String url,String dbuser,String dbpassword);
/*连接数据库的URL遵循特定的语法:
	jdbc:数据库类型://数据库主机:端口/数据库库名
*/
//示例:
Connection con2 = DriverManager.getConnection("jdbc:mysql://192.168.86.130:3306/testdb","test","yyyy");

3、获取Statement对象

Statement stt = con.createStatement();

4、使用Statement执行SQL语句

stt.execute("show databases;")

5、使用ResuleSet处理结果

ResultSet rs = stt.executeQuery("select host,user from mysql.user;"); //上面的execute只是返回一个布尔型的值告诉你有没有执行成功,如果要拿到数据还得是ResultSet

这里说一下这个ResultSet对象的使用,我们前面介绍过它返回的是一张表,有一个指针最开始再表格的第一行之前,如果我们在mysql中执行上面的语句:

MariaDB [(none)]> select host,user from mysql.user;
+-----------+------+
| host      | user |
+-----------+------+
| %         | root |
| %         | test |
| 127.0.0.1 | root |
| ::1       | root |
| localhost | root |
+-----------+------+
5 rows in set (0.00 sec)

中间这个就是查询出来的内容,所以我们就可以用一个循环,让指针向后走的同时取出它停留位置那行的数据。

while (rs.next()){
            String host = rs.getString("host");
            String user = rs.getString("user");
            System.out.println(user+"@"+host);
        }
/*结果
root@%
test@%
root@127.0.0.1
root@::1
root@localhost
*/

6、释放资源

到了这一步就是查询完毕调用对象的close()方法就好了。一般来说都是按照我们打开的顺序相反的关闭掉。也可以用一个异常处理在finnally里面统一关掉,这样能保证在出现异常的时候也能关闭资源。

四、总结

JDBC其实是很简单的一个内容,同时JDBC也是一个很牛逼的接口,在这篇文章里面只讲了最基础的内容,因为不想把一篇基础的文章写的太长所以有很多方法没写。剩下的可以等到要用的时候可以去java官方的api文档去查询,这东西没必要全部死记,我个人认为写代码,掌握思维更重要,至于其他的,多敲多看自然就会熟练,但是面试的话还是要多练练基本功的。

# web安全 # 代码审计 # Java代码审计 # JAVA安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录