freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

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

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安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录