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中的接口即可,利用了多态的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj3919-志愿者【换根法,线段树,树形dp】

正题 题目链接:https://jzoj.net/senior/#main/show/3919 题目大意 nnn个点kkk个需要到达的点&#xff0c;然后求每个点出发经过这些点的最短路径。 解题思路 因为不用回去&#xff0c;答案就是以这点为根链接所有点的树减去离这个点最远点的距离。 我们用线段树维护最远点距…

2017西安交大ACM小学期数论 [水题]

水题 发布时间: 2017年6月25日 14:06 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 平均因数个数的统计对于估算数论题目复杂度具有非常重要的意义。小A同学听了今天的课后&#xff0c;于是想要自己写一个程序&#xff0c;求出1到n的平均因数个数…

26、jdbc操作数据库(3)

1、结果集的元数据操作 ResultSetMetaData 是描述ResultSet的元数据对象&#xff0c;可以通过元数据对象获取结果集的列信息&#xff0c;使用方式如下&#xff1a; public void query() {Connection connection DBUtil.getConnection();String sql "SELECT ID,UNAME u,…

jzoj3920-噪音【贪心,dp】

正题 题目链接:https://jzoj.net/senior/#main/show/3920 题目链接 nnn头牛&#xff0c;mmm个牛棚&#xff0c;可以清空kkk次。 每头牛会指定进入一个牛棚&#xff0c;进入后产生牛棚中牛数量的噪音值&#xff0c;然后清空可以清空一个牛棚的牛&#xff0c;求最少噪音值。 解…

2017西安交大ACM小学期数论 [完全平方数]

完全平方数 发布时间: 2017年6月24日 17:01 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 给定正整数b&#xff0c;求最大的整数a&#xff0c;使a(ab)是完全平方数。 输入 多组测试数据&#xff08;不超过10000组&#xff09;。 每组数据一个正整…

27、jdbc操作数据库(4)

数据库连接池是什么&#xff1f;为什么使用连接池&#xff1f; 当使用jdbc去操作数据库时&#xff0c;需要先获取连接&#xff0c;然后进行具体的数据库操作&#xff0c;最后释放连接。这一系列操作在演示一个demo时还可以使用&#xff0c;但是当访问数据库次数多了的时候&…

28、jdbc操作数据库(5)

介绍一个稍微封装了jdbc的工具类org.apache.commons.dbutils&#xff0c;使用dbutils可以简化对数据库操作程序的开发。 API介绍 接下来通过实例的方式说一下dbutils的具体使用 添加jar包&#xff1a;commons-dbutils-1.7.jar 增、删、改 进行增、删、改操作&#xff0c;在…

jzoj3910-Idiot的间谍网络【倍增,dfs】

正题 题目链接:https://jzoj.net/senior/#main/show/3910 题目大意 nnn个点的森林mmm个操作&#xff0c; 合并两棵树让xxx节点到根节点的路径标记上cntcntcnt。并让cntcntcnt查询一个节点xxx是否有标记yyy。 解题思路 这里考虑离线的算法。我们可以先将这个森林的最终状态构…

2017西安交大ACM小学期数论 [更新学号]

发布时间: 2017年6月24日 20:27 最后更新: 2017年7月3日 09:27 时间限制: 3000ms 内存限制: 128M 描述 某知名高校有n个学生&#xff0c;每个学生有一个唯一ID。但这些ID有7位数字&#xff0c;学生总是记不住&#xff0c;于是学校想了一个办法。它们将所有ID对m取模作为学…

jzoj4815-ksum【堆】

正题 题目链接:https://jzoj.net/senior/#main/show/4815 题目大意 nnn个数的序列&#xff0c;求前kkk大的子段。 解题思路 一个区间的答案肯定比他的所有子区间要大&#xff0c;所以我们先把(1,i)(1,i)(1,i)都丢进堆里&#xff0c;然后每次取出最大的再将(l1,r)(l1,r)(l1,r)…

2017西安交大ACM小学期数论 [等差数列]

等差数列 发布时间: 2017年6月25日 13:42 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 给定正整数n&#xff0c;试问存在多少个和为n的等差数列&#xff1f; 当然&#xff0c;等差数列中每一项要为非负整数&#xff0c;且不考虑降序的等差数列。…

29、jdbc操作数据库(6)

通常真正实际开发时&#xff0c;dao层虽然会涉及很多实体&#xff0c;但是可以借助泛型、反射、一些简单工具类来封装一些通用的查询、更新等操作的方法&#xff0c;下面介绍两种方法 第一种&#xff1a;借助元数据类ResultSetMetaData来实现方法的封装&#xff0c;使用Map或者…

30、JAVA_WEB开发基础之servlet(1)

servlet是什么 Servlet 是一种独立的 web 开发标准&#xff0c;用来接受、处理、返回浏览器的访问请求&#xff0c;它不应和服务器耦合在一起&#xff0c;servlet和servlet容器之间相互独立又相互依存&#xff0c;自我感觉&#xff0c;servlet有了容器才得以实现自己的价值&am…

jzoj4817-square【区间RMQ,二分答案】

正题 题目链接:https://jzoj.net/senior/#contest/show/2956/2 题目大意 n∗mn*mn∗m的010101矩阵&#xff0c;每次询问(x1,y1,x2,y2)(x1,y1,x2,y2)(x1,y1,x2,y2)里的最大全111正方形。 解题思路 我们用fi,jf_{i,j}fi,j​表示以(i,j)(i,j)(i,j)为右下角的全1正方形大小&#…

2017上海金马五校赛 丢史蒂芬妮 博弈问题

丢史蒂芬妮 发布时间: 2017年7月9日 18:17 最后更新: 2017年7月9日 21:05 时间限制: 1000ms 内存限制: 128M 描述 有一天&#xff0c;空和白很无聊&#xff0c;决定玩盛大游戏&#xff0c;考虑到两个人玩&#xff0c;他们随便掏了一个游戏出来&#xff1a;在一个n*m的棋盘…

2017上海金马五校 购买装备 贪心+二分Check

购买装备 发布时间: 2017年7月9日 18:17 最后更新: 2017年7月9日 21:05 时间限制: 1000ms 内存限制: 128M 描述 最近盛大的一款游戏传奇世界极其火爆。游戏玩家John&#xff0c;想购买游戏中的装备。已知游戏的商店里有n件装备&#xff0c;第i件装备具有属性值ai&#xf…

31、JAVA_WEB开发基础之servlet(2)

使用servlet需要依赖jar包&#xff1a;servlet-api.jar&#xff0c;下边介绍一下关于servlet的一些api Servlet接口 package javax.servlet;import java.io.IOException;public interface Servlet {//在servlet被载入后和实施服务前由servlet引擎调用。如果init()//产生溢出U…

力扣(leetcode)第1题两数之和(Python)

1.两数之和 题目链接&#xff1a;1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素…

jzoj3809-设备塔【并查集】

正题 题目链接:https://jzoj.net/senior/#contest/show/2955/2 题目大意 n∗mn*mn∗m的矩阵&#xff0c;最左边和最右边是联通的&#xff0c;然后每次加入一个墙求能否有一条路径从最上方到最下方。如果有就加入否则不加入。 求最后有多少个墙。 解题思路 我们对于每个墙往八…

32、JAVA_WEB开发基础之jsp

是什么 是简化servlet的一种技术&#xff0c;将html语句和java代码混合在一个文件中进行编写&#xff0c;只对网页中动态产生的内容用java代码编写&#xff0c;静 态内容仍用html语句编写 运行原理 jsp本质上是一个servlet &#xff0c;每个jsp页面第一次被访问时&#xff…