从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

    • JavaEE概念

    • Ant

    • Maven

    • 日志

    • Junit

    • JDBC

      • 什么是JDBC
      • JDBC连接、查询和更新
      • JDBC连接字符串
      • JDBC常用类介绍
        • DriverManager:驱动管理对象
        • Connection:数据库连接对象
        • Statement:执行sql的对象
        • PreparedStatement对象:防止SQL注入
        • ResultSet:结果集对象,封装查询结果
      • PreparedStatement是如何防止SQL注入的
      • ResultSet结果封装为对象
      • JDBC工具类
      • JDBC更新
      • JDBC事务和批量
      • JDBC连接池
      • JDBCTemplate
      • JDBC
    • XML和JSON

    • Java
  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • Java
  • JavaEE
  • JDBC
2023-03-24
目录

JDBC常用类介绍

# 4.JDBC常用类介绍

上一节我们快速入门了下JDBC,并使用它做了一个小案例,现在对各个常用的类做进一步的说明:

  • DriverManager:驱动管理对象
  • Connection:数据库连接对象
  • Statement、PreparedStatement:执行sql的对象
  • ResultSet:结果集对象,封装查询结果

 ‍

‍ 严格来说,以上这些都是接口,位于java.sql包下;

javax.sql是数据库扩展包,提供数据库额外的功能,如连接池   ‍

‍

# DriverManager:驱动管理对象

DriverManager主要用两个功能:

  1. 注册驱动
  2. 获取数据库连接对象

‍

# 功能1:注册驱动

注册驱动,告诉程序该使用哪一个数据库驱动jar。

DriverManager是一个接口,在API文档中有这样一个方法:static void registerDriver(Driver driver)​,作用是注册与给定的驱动程序 DriverManager。调用这个方法,实际上才算告诉了应用程序我们要使用哪个数据库驱动类。

但我们写代码的时候,直接通过反射加载驱动类:Class.forName("com.mysql.cj.jdbc.Driver")​,好像也没有执行上面的注册方法?

这是因为驱动类有个static静态代码块,其中就会执行registerDriver​方法,注册驱动,因此我们只要一加载这个类,就会自动注册。

说起一加载就执行的代码,读者们想到了什么?static (opens new window)代码块。通过查看MySQL驱动类的源码发现:在com.mysql.cj.jdbc.Driver​类中存在静态代码块,会执行register方法。

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}
1
2
3
4
5
6
7

‍

‍

注意点1:读者可以直接在IDEA里查看jar包中的源码

​​

‍

‍

注意点2:mysql5之后的驱动jar包可以省略注册驱动的步骤 Class.forName(.....)​,因为会自动注册驱动,所以可以如下省略注册的代码:

// MySQL5驱动类注册方法
Class.forName("com.mysql.jdbc.Driver");

// MySQL8驱动类注册方法
Class.forName("com.mysql.cj.jdbc.Driver");
1
2
3
4
5

自动注册的原理:寻找jar包的META-INF/services/java.sql.Driver​文件,并读取里面配置的类然后加载。所以如果读者后续更换其他数据库驱动类后,想要注册但不知道驱动类的全类名,可以通过这个方法找到。

​​

‍

‍

‍

# 功能2: 获取数据库连接对象

DriverManager还有一个重要的方法,获取Connection对象:static Connection getConnection(String url, String user, String password)​

参数说明:

  • url:指定连接的路径。注意,不同数据库的URL语法可能不一样。以MySQL为例:

    • 语法:jdbc:mysql://ip地址(或域名):端口号/数据库名称​
    • 例子:jdbc:mysql://localhost:3306/db3​
    • 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称​
  • user:用户名

  • password:密码

‍

‍

# Connection:数据库连接对象

功能:

  1. 获取执行sql 的对象

    • Statement createStatement()​
    • PreparedStatement prepareStatement(String sql)​
  2. 管理事务:

    • 开启事务:void setAutoCommit(boolean autoCommit)​:调用该方法设置参数为false,即开启事务
    • 提交事务:void commit() ​​
    • 回滚事务:void rollback()​

后续我们会介绍事务。

‍

‍

‍

# Statement:执行sql的对象

查询文档,相关说明是:用于执行静态SQL语句并返回其生成的结果的对象(参数是给定值的)

PreparedStatement对象则是执行预编译的SQL语句对象(参数是后续设置的)

执行sql相关方法:

  • boolean execute(String sql)​:可以执行任意的sql (了解即可,较少使用),返回值是Boolean类型,有结果集则是true,没有则是false
  • int executeUpdate(String sql)​:执行DML语句(例如insert、update、delete)、DDL语句(例如create,alter、drop)。不能执行查询语句 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 。返回值>0的则执行成功,反之,则失败。执行DDL语句则返回0。
  • ResultSet executeQuery(String sql)​:执行DQL(select)语句,返回ResultSet对象

之前我们仅仅使用了executeQuery​,后续我们介绍executeUpdate​方法。

‍

# PreparedStatement对象:防止SQL注入

PreparedStatement继承了Statement接口。这个类能解决SQL注入问题

执行的是预编译的SQL,SQL中参数使用 ?​ 作为占位符

使用步骤:

  • 定义sql。注意:sql的参数使用?作为占位符。如:

    string sql = select * from user where username = ? and password = ?;
    
    1
  • 获取执行sql语句的对象 PreparedStatement

    pstm = Connection.prepareStatement(String sql) 
    
    1
  • 给占位符 ?赋值,用方法: setXXX(参数1,参数2),例如 setDouble() ,setString()​等一系列方法

    • 参数1:?的位置编号 从1 开始
    • 参数2:?的值
    • 举例:setString(1, "PeterJXL")​
  • 执行sql,接受返回结果,不需要传递sql语句

‍

‍

# ResultSet:结果集对象,封装查询结果

ResultSet:返回结果集对象(可以看作是一个数据库表)后,默认会有个游标(或者叫指针),游标的初始位置位于第一行之前;

第一次调用 next()​ 方法将会把第一行设置为当前行。

第二次调用 next()​ 方法游标移动到第二行,以此类推。

​​

‍

‍

常用方法

  • boolean next()​​ : 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true。

  • getXXX(参数): 获取某一列的数据

    • XXX​代表数据类型 如:int getInt(),String getString(),double getDouble()​等等

    • 参数​:

      1. 如果是int类型:代表列的编号, 从1开始 如:getString(1)
      2. 如果是String类型:代表列名称。 如: getDouble("balance")

‍

‍

使用步骤总结:

  1. 使用next()​方法使游标向下移动一行
  2. 通过next()​方法的返回值判断是否还有数据,如果有则返回true,如果没有则返回false(可以理解为游标到了最后一行了,再往下就没数据了)
  3. 通过getXXX(参数)​方法获取某一列的数据

‍

如果ResultSet的游标已经到了最后一行,再调用一次next()​,会抛出异常:

java.sql.SQLException: After end of result set
	at com.mysql.jdbc.SQLError.createsQLException(SQLError.java: 959)
	at com.mysql.jdbc.SOLError.createSQLException(SOLError.java: 898)
	com.mysql.jdbc.SQLError.createSQLException(SOLError.java: 887)
	com.mysql.jdbc.SoLError.createSQLException(SOLError.java: 862)
	com.mysql.jdbc.ResultsetImpl.checkRowPos(ResultSetImpl.java: 790)
	com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.iava: 2469)
        .....
1
2
3
4
5
6
7
8

‍

所以我们遍历ResultSet时通常是使用循环,每次判断是否到达了最后一行:

while(rs.next()){  //循环判断游标是否是最后一行末尾(判断是否有数据)
    //获取数据并处理
    int id = rs.getInt(1);
    // .....省略其他代码
}
1
2
3
4
5
在GitHub上编辑此页 (opens new window)
上次更新: 2023/4/20 09:11:31
JDBC连接字符串
PreparedStatement是如何防止SQL注入的

← JDBC连接字符串 PreparedStatement是如何防止SQL注入的→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式