JDBC基础知识复习

  • 1、JDBC连接数据库
    • 1.1、导入JDBC驱动
    • 1.2、注册JDBC驱动程序
    • 1.3、创建连接对象
    • 1.4、关闭JDBC连接
    • 1.5、每种数据库对应的驱动名和URL
  • 2、JDBC接口
    • 2.2、Statement
    • 2.3、PreparedStatement
    • 2.4、两者区别
  • 3、ResultSet集合
    • 3.1、导航
    • 3.2、获取
    • 3.3、更新
  • 4、事务
    • 4.1、事务提交
    • 4.2、事务回滚
  • 5、实现自己的数据库连接池
  • 5.1、自己实现的连接池
  • 5.2、测试
    • 5.3、测试结果

1、JDBC连接数据库

分3步:导入、注册、创建连接对象

1.1、导入JDBC驱动

导入对应数据库的驱动包(Jar文件),或者使用mvn导入对应数据库的依赖。

1.2、注册JDBC驱动程序

2个方法注册驱动,以Mysql为例子

  1. Class.forName("com.mysql.jdbc.Driver"),抛一个ClassNotFoundException的异常
  2. DriverManager.registerDriver(new com.mysql.jdbc.Driver())

1.3、创建连接对象

一般使用DriverManager.getConnection(String url, String user, String pass)方法获取

还有另外两种:

  1. getConnection(String url)方法
  2. getConnection(String url, Properties prop)方法

1.4、关闭JDBC连接

代码:Connection对象的close()方法

1.5、每种数据库对应的驱动名和URL

如下表:

JDBC驱动程序的名称 URL
Mysql com.mysql.jdbc.Driver jdbc:mysql://hostname:port/ databaseName
Oracle oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@hostname:port Number:databaseName

2、JDBC接口

通过使用 JDBC Statement, CallableStatement 和 PreparedStatement 接口定义的方法和属性,使可以使用 SQL 或 PL/SQL 命令和从数据库接收数据。

接口 应用场景
Statement 当在运行时使用静态 SQL 语句时(Statement接口不能接收参数)
PreparedStatement 当计划多次使用 SQL 语句时(PreparedStatement 接口接收在运行时输入参数)

2.2、Statement

我们需要使用 Connection 对象的 createStatement() 方法进行创建

Statement的方法:

方法 说明
boolean execute(String SQL) 如果 ResultSet 对象可以被检索返回布尔值 true,否则返回 false。使用这个方法来执行 SQL DDL 语句,或当需要使用真正的动态 SQL
int executeUpdate(String SQL) 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句。返回值是一个整数,指示受影响的行数(即更新计数)
ResultSet executeQuery(String SQL) 返回 ResultSet 对象。用于产生单个结果集的语句,例如 SELECT 语句

释放Statement对象的方法是close()

2.3、PreparedStatement

占位符的概念而已,序号从1开始(不是从0开始哦)

2.4、两者区别

Statement适合静态SQL,PreparedStatement适合动态SQL。

因为PreparedStatement可以防止SQL注入!

3、ResultSet集合

结果集通常是通过执行查询数据库的语句生成,表示数据库查询结果的数据表。ResultSet 对象具有指向其当前数据行的光标。

ResultSet接口的方法可分为3类:

  1. 导航方法:用于移动光标
  2. 获取方法:用于查看当前行的光标所指向的列中的数据
  3. 更新方法:用于更新当前行的列中的数据

3.1、导航

迭代集合

3.2、获取

使用get方法

3.3、更新

使用update方法

4、事务

与数据库理论的事务概念一样,必须具有原子性、一致性、隔离性、持久性

需要先关闭提交的代码:使用Connection的setAutoCommit(false)方法

4.1、事务提交

使用Connection对象的commit()方法

4.2、事务回滚

使用Conncetion对象的rollback()方法

5、实现自己的数据库连接池

使用之前项目的图像算法中的均值hash的数据表

5.1、自己实现的连接池

package util;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;/*** 数据库连接池* 循环链表实现* @author zzw*/
public class DBPool {/*** 池大小*/private static final int size = 20;/*** 数据库驱动名*/private static final String driverName = "com.mysql.jdbc.Driver";/*** 数据库名*/private static final String url = "jdbc:mysql://localhost:3306/imghashdb";/*** 数据库用户名*/private static final String user = "root";/*** 数据库密码*/private static final String password = "3306";/*** 连接池*/private static final LinkedList<Connection> pool = new LinkedList<>();// 工具类不配实例化private DBPool() {}/*** 创建size个连接对象放入连接池*/private static void createConnection() {for(int i=0;i<size;i++) {try {pool.add(DriverManager.getConnection(url, user, password));} catch (SQLException e) {e.printStackTrace();}}}// 静态代码块用于加载数据库驱动static {try {Class.forName(driverName);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 获取一个数据库连接* @return Connection*/public static synchronized Connection getConn() {if(pool.isEmpty()) {createConnection();}return pool.removeFirst();}/*** 归还一个数据库连接* @param conn 数据库连接*/public static synchronized void callback(Connection conn) {// 如果当前连接池大小超过规定连接池大小,则不再归还if(pool.size() > size) {try {conn.close();System.out.println("此连接不必归还");} catch (SQLException e) {e.printStackTrace();}}else {pool.add(conn);}}
}

5.2、测试

测试代码如下:

package app;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import util.DBPool;public class App {public static void main(String[] args) throws SQLException {// 1. 增Connection conn = DBPool.getConn();conn.setAutoCommit(false);PreparedStatement prepareStatement = conn.prepareStatement("insert ahash values(?, ?, ?)");prepareStatement.setInt(1, 1);prepareStatement.setString(2, "00101101");prepareStatement.setString(3, "hello.jpg");int insert = prepareStatement.executeUpdate();System.out.println(insert);conn.commit();DBPool.callback(conn);// 2. 改//# 类似..略// 3. 查conn = DBPool.getConn();prepareStatement = conn.prepareStatement("select * from ahash");ResultSet resultSet = prepareStatement.executeQuery();resultSet.first();while(resultSet.next()) {System.out.println("id: "+resultSet.getInt(1)+", hash: "+resultSet.getString(2).substring(0, 8)+"..., path: "+resultSet.getString(3));}DBPool.callback(conn);// 4. 删//# 类似..略}
}

5.3、测试结果


控制台输出:

JDBC基础知识复习相关推荐

  1. 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

  2. linux基础知识复习

    @(tigerfive)[linux,基础知识,复习笔记] linux基础复习(一) 今天只整理框架,具体内容之后详细整理吧 文件管理 文件基本操作 创建文件和目录 拷贝文件和目录 剪切文件和目录 删 ...

  3. Java基础知识复习(一)

    Java基础知识复习(一) 目录 Java简介 命名规则 八种基本的数据类型 字面量 类型转换 变量的形态 逻辑运算符 位运算 移位运算 习题知识点 目录 Java简介 Java是由Sun公司在199 ...

  4. 2011计算机等级考试二级c语言公共基础教程.doc,2011年全国计算机等级考试二级c语言公共基础知识复习100题及答案.doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp资格/认证考试&nbsp>&nbsp计算机等级考试 2011年全国计算机等级考试二级c语言公 ...

  5. 计算机二级的公共基础课水平测试,计算机二级公共基础知识复习试题含答案

    计算机公共基础课程,是针对高校非计算机专业学生设立的一门必修计算机基础课程.以下是由学习啦小编整理关于计算机二级公共基础知识复习试题含答案的内容,希望大家喜欢! 计算机二级公共基础知识复习试题含答案( ...

  6. java基础知识复习(上半)

    java基础知识复习 java为什么被发明? Green项目的确立,应用于像电视盒一样的消费类电子产品,语言本身本身中立. java的三大版本? javaSE的定位在于客户端,只要用于桌面应用软件的编 ...

  7. 考试备战系列--软考--02基础知识复习

    这部分主要是计算机基础知识的概念介绍,相关系列文章如下所示. 考试备战系列--软考--01基础架构概念 考试备战系列--软考--02基础知识复习 考试备战系列--软考--03综合知识复习 考试备战系列 ...

  8. 基础知识复习,html、css、js

    基础知识复习 HTML 一些标签的复习 一些符号的复习 CSS JS 许久没有写代码了,今年的上半年大部分时间在与模拟电路.数字电路.单片机这些东西打交道,本以此发展为主业,后发现十分痛苦.前两天写了 ...

  9. 什么是人们常用的计算机设备之一,计算机:复习二基础知识复习

    <计算机:复习二基础知识复习>由会员分享,可在线阅读,更多相关<计算机:复习二基础知识复习(15页珍藏版)>请在人人文库网上搜索. 1.基础知识复习2,计算机系统,一.知识框图 ...

最新文章

  1. 自己的mongodb的CRUD封装
  2. crt mysql中文乱码_CRT 和mysql 中文乱码解决方式
  3. Win7下运行VC程序UAC权限问题
  4. 不可摸数http://acm.hdu.edu.cn/showproblem.php?pid=1999
  5. Landsat中国西北地区行列号Shapefile图层对照(附行列号Shapefile下载)
  6. java se/ee_嗨,您好 。 。 ! 您如何评价Java / Java EE技能?
  7. JMeter中使用“用户自定义变量”实现参数化
  8. 深度ip转换器手机版app_手机防爆卫士app下载-手机防爆卫士去广告版1.2.0旧版
  9. 微信h5棋牌以及下载类推广如何在微信中做好防封防屏蔽技术
  10. INA266电压电流模块驱动
  11. 转:诺贝尔经济学奖得主与数学
  12. ubuntu GStreamer + QT多媒体播放器开发(三)
  13. 尤雨溪:Vue 3 将成为新的默认版本
  14. VMM物理内存、虚拟内存管理,偷页算法
  15. classes是什么意思怎么读_class是什么意思_class怎么读_class翻译_用法_发音_词组_同反义词_班-新东方在线英语词典...
  16. CRC-16/CCITT算法实现
  17. mt管理器主题修改教程_华为微信气泡怎么设置皮肤 微信怎么改猫和老鼠的主题和气泡?...
  18. marquee实现文字无缝滚动+css无缝滚动
  19. kubernetes1.22安装使用ingress-nginx
  20. 程序员必备的编程集成开发工具

热门文章

  1. NYOJ 371 机器人II
  2. 数据存储方案-闭包表
  3. nginx upstream 常用的几种调度方式
  4. linux下tomcat的安装和配置
  5. PHP -----上传文件
  6. .net框架、CLR和C#的版本之间的对应关系
  7. linux学习笔记(5)
  8. 统计日志中ip访问次数并排序的三种方法
  9. Go报错:more than one character in rune literal
  10. 机器学习导论(张志华):条件期望