25、jdbc操作数据库(2)
说一下使用jdbc时涉及到的一些基本的接口和类
java.sql.Driver
是数据库驱动接口,com.mysql.jdbc.Driver是mysql对应的驱动,由数据库供应商实现,用于提供驱动,实现了java.sql.Driver接口。
java.sql.DriverManager
管理驱动的类,可以使用DriverManager通过驱动来获取数据库连接。
java.sql.Connection
对数据库连接进行管理的接口,一个Connection就相当于一个通往对应数据库的通道。
对以上几个做一个详细介绍,直接看源码:
//com.mysql.jdbc.Driver 实现了 java.sql.Driver接口
public class Driver extends NonRegisteringDriver implements java.sql.Driver {//向驱动管理器注册自己static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}//构造一个 com.mysql.jdbc.Driver 用于注册public Driver() throws SQLException {// Required for Class.forName().newInstance()}
}// 驱动管理器类中,看一下如何注册驱动、获取数据库连接的
public class DriverManager {//注册驱动最终调用的方法public static synchronized void registerDriver(java.sql.Driver driver, DriverAction da) throws SQLException {//如果驱动程序还没有添加到列表 registeredDrivers 中,请注册它if(driver != null) {registeredDrivers.addIfAbsent(new DriverInfo(driver, da));} else {throw new NullPointerException();}}//获取连接最终调用的方法private static Connection getConnection( String url, java.util.Properties info, Class<?> caller) throws SQLException {//当callerCl为null时,我们应该检查应用程序(它间接调用这个类)的类加载器,//这样就可以从这里加载rt.jar外部的JDBC驱动程序类。ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;synchronized(DriverManager.class) {if (callerCL == null) {callerCL = Thread.currentThread().getContextClassLoader();}}// 遍历试图建立连接的已加载的 registeredDrivers。 for(DriverInfo aDriver : registeredDrivers) {// 如果调用方没有加载驱动程序的权限,那么跳过它。if(isDriverAllowed(aDriver.driver, callerCL)) {Connection con = aDriver.driver.connect(url, info);if (con != null) { return (con);}}} }
}
java.sql.Statement
对数据库操作的一个接口,可以发送sql、执行sql,它是先组装sql,然后发送sql查询结果,因此存在缺陷,其缺陷在于它发送的sql是将参数拼接完之后再进行编译的,所以容易发生sql注入攻击的危险,一般不用,这里不做详细介绍。
何为sql注入攻击,例如:发送的如下SQL
"SELECT * FROM USER WHERE USER_NAME = "+ USER_NAME +"AND PWD = "+PWD;
这时我这样设置:USER_NAME = user | PWD = 111 or 1=1,则SQL就会变成
SELECT * FROM USER WHERE USER_NAME = user AND PWD = 111 or 1=1
这样就直接规避掉了用户名和密码的校验。
java.sql.PreparedStatement
对数据库操作的一个接口,可以发送sql、执行sql,在获取PreparedStatement对象时,就已经将sql发送出去编译成了可执行的sql语句,也就是常说的预编译,SQL中使用占位符的方式来表示参数,占位符的地方只是参数,不能所作sql中固定的语法
例如:发送的sql="SELECT * FROM USER WHERE USER_NAME = ? AND PWD = ?";
然后再另外使用方法的方式去设置 ? 占位符处的参数,防止了sql注入的风险,通过Connection接口的connection.prepareStatement(sql)方法获取PreparedStatement,具体实现调用的是 com.mysql.jdbc.ConnectionImpl 中的方法。
java.sql.CallableStatement
和 PreparedStatement 功能大致相同,只是CallableStatement对象可以用于执行存储过程,而PreparedStatement只可以执行基本的SQL语句。
java.sql.ResultSet
用于存储查询返回的结果集,对于mysql来说,最终是通过com.mysql.jdbc.PreparedStatement中的方法获取的ResultSet对象。
java.sql.DatabaseMetaData
此对象用于获取数据库的整体综合信息,可以使用Connection对象的connection.getMetaData()方法直接获取。
java.sql.ResultSetMetaData
用于获取关于ResultSet对象中列的类型和属性信息,通过ResultSet对象的resultSet.getMetaData()方法直接获取。
java.sql.Types
这个类中定义了用于标识SQL类型的常量,称为JDBC类型。
这里总结一下:开发者使用jdbc操作数据库时,添加驱动时需要添加对应数据库厂商提供的驱动包中的Driver,而后具体操作时,直接调用 java.sql.* 包中接口的方法即可,最终底层调用的是对应数据库厂商提供的com.*.jdbc.*包中的实现类中的方法,数据库厂商提供的驱动包实现了java.sql.*包中接口的方法,这就是代码层面上的jdbc。java提供一组接口,数据库厂商实现这些接口,根据自身的特点编写不同的实现,而程序员只需使用java中的接口即可,利用了多态的方式。
25、jdbc操作数据库(2)相关推荐
- Java系列技术之JDBC操作数据库-钟洪发-专题视频课程
Java系列技术之JDBC操作数据库-22人已学习 课程介绍 JDBC连接数据库是Java系列技术中数据库知识的核心技术,是学习后续课程JavaWeb入门前需要掌握的基础! 这门课的前 ...
- JavaWeb:用JDBC操作数据库
JDBC系列阅读 JavaWeb:用JDBC操作数据库 JavaWeb:JDBC之事务 JavaWeb:JDBC之数据库连接池 使用JDBC实现水果超市管理系统 1. 什么是JDBC JDBC的全称是 ...
- 24、jdbc操作数据库(1)
什么是jdbc? 看一下官方怎么说,JDBC 英文名Java DataBase Connectivity,使用java连接数据库的工具,就是一组使用java代码来执行SQL语句的API. Jdbc有什 ...
- java监听数据库操作_第十六篇——JDBC操作数据库之监听器
JavaWeb应用中,很多的地方都和session有关.因此session相关的事件监听器,在日常工作中非常有用. 有时候我们需要统计当前在线的人数和访问人数总数,此时就可以使用监听器技术来很简单的实 ...
- Mybatis介绍、jdbc操作数据库原始写法以及Mybatis架构
文章目录 Mybatis介绍 jdbc操作数据库原生写法 使用jdbc编程问题总结 Mybatis架构 Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个 ...
- jdba访问mysql_Java中JDBC操作数据库的步骤
Java中JDBC操作数据库的步骤,今天给喜欢Java开发或者是想要参加Java培训学习的小伙伴们分享一些Java技能干货,那就是Java阐述jdba操作数据库的步骤,废话不多说了,随小编一起来看一下 ...
- java完整JDBC操作数据库
java使用JDBC操作数据库的包含以下7个主要步骤: 1.加载JDBC驱动程序 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的 ...
- 说说JDBC 操作数据库的步骤?
分析&回答 1)加载(注册)数据库驱动(到JVM). 2)建立(获取)数据库连接. 3)创建(获取)数据库操作对象. 4)定义操作的SQL语句. 5)执行数据库操作. 6)获取并操作结果集. ...
- 【JDBC】JDBC 简介 ( JDBC 概念 | JDBC 本质 | 使用 JDBC 操作数据库的好处 | JDBC 提供的 API 组件 )
文章目录 一.JDBC 概念 二.JDBC 本质 三.使用 JDBC 操作数据库的好处 四.JDBC 提供的 API 组件 一.JDBC 概念 JDBC 全称 Java DataBase Connec ...
最新文章
- [转]VC无负担实现XP风格界面
- 对比es1.x和es2.0纹理加载方法
- CascadePSP 测试笔记
- 为什么说 Java 中只有值传递?
- sql server 判断是否存在数据库,表,列,视图
- php根据循环条件切换图片,根据条件循环复框,麻烦各位朋友帮小弟我看一下应该怎样改...
- 计算机金融专业课程方案,《计算机在金融业中的应用》教学实施方案
- pytorch使用说明2
- 情人节到了,Postman 都脱单了,那你咧?
- 重复在学习中的重要性
- 苹果cms模板_苹果cmsv10高端模板有哪些?
- 【问题解决】安装Oracle数据库,中途提示未找不到文件的解决办法(附带图文)
- 发动机连杆产品配置管理PDM解决方案
- 纯翻译 GMSL2-CSI2 MAX9295和MAX9296配对通用过程 编程指南
- 奇虎360前端面试题
- CTF-攻防世界web新手入门篇
- 致远V8.1 协同 最新版致信安装部署教程linux
- “含沙射影”?【空心杯微电机】映射冷行业
- Linux查看log日志命令总结
- F - Anti-Rhyme Pairs(rmq算法模板)(后缀数组算法模板)
热门文章
- linux内核分为子系统,Linux内核内存管理子系统分析【转】
- office连接oracle,Access(VBA)连接Oracle数据库的代码
- mysql 8 配置参数优化_mysql8 参考手册--配置非持久性优化器统计参数
- java分桃子_猴子分桃子.java
- java class类型参数_使用Class对象实例化Java类型参数/ generic
- c++向mysql通信_C++连接MySQL
- leetcode139. 单词拆分
- [SpringBoot2]HelloWorld
- javax.servlet.ServletException: 实例化Servlet类[com.wk.web.RegisterServlet]异常
- 常用Arthas命令