Java精选笔记_JDBC

JDBC

概述


什么是JDBC


JDBC全称是Java数据库连接(Java Database Connectivity),应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。是一套用于执行SQL语句的Java API。


Java的数据库连接接口。它是Java API中的一部分,通过它可以将Java程序和关系数据库集成在一起。
应用程序通过调用JDBC来操作数据库的过程,其实是由数据库厂商提供的JDBC驱动程序来负责的。如果要更换数据库,只要更换驱动程序,并在JDBC中载入新的驱动程序来源,即可完成数据库系统的变更。

JDBC允许任何使用Java语言编写的小应用程序或应用程序访问数据库。通过使用SQL语句可以对数据库中的数据进行相应的插入、删除和更新操作。


JDBC由Java语言编写的相关类和接口组成

驱动程序 DriverManager类、Driver 接口
与特定数据库连接 Connection接口
执行SQL语句 Statement接口、PreparedStatement接口
提供数据库信息 DatabaseMetaData接口
结果集 ResultSet接口


DriverManager类,用来管理JDBC驱动程序,主要用于跟踪和加载驱动程序并负责选取数据库驱动程序和建立新的数据库连接
Driver 接口,每个驱动程序类必须实现的接口。该接口可以将API的调用映射到数据库的操作
Connection接口,用来连接应用程序与指定的数据库
Statement接口,用来执行静态SQL语句并得到SQL语句并得到执行后的结果
PreparedStatement接口,用来返回有关数据、数据库和驱动程序等与底层数据库有关的信息
DatabaseMetaData接口,提供对数据库表的访问,执行查询后返回的结果集。通过ResultSet对象是通过执行一个查询数据库的语句生成



连接


在连接数据库时需要指明数据源,以及相关的一些参数。数据源主要包括两部分,其中protocol表示连接到数据库的驱动程序,DatabaseName表示数据库的名字
jdbc:<protocol>:<DatabaseName>
在连接数据库时,需要找到使用JDBC驱动程序类的名称。不同的数据库供应商的数据库产品都有自己的驱动程序,不同数据库的URL和驱动程序也有所不同。

使用Java与数据库连接进行数据存取的过程:加载驱动程序-->Collection建立连接(连接数据库)-->创建Statement对象(执行SQL语句)-->取得ResultSet结果集


具体过程


(1)首先要加载当前数据源的驱动程序。通常使用Class.forName()方法加载

(2)建立数据库的连接。可以通过DriverManager类中的getConnection方法来实现与数据库的连接。
conn = DriverManager.getConnection(url, userNamew, password);

(3)建立连接后就可以使用SQL语句对数据库进行访问。这就需要创建Statement对象。通过该对象可以执行相应的SQL语句并将其操作于数据库

stmt = conn.createStatement();

(4)将SQL语句执行后的结果返回。执行的查询结果可以以ResultSet结果集的形式返回

ResultSet rs = stmt.executeQuery(sqlSelect);

(5)对结果集进进行处理。例如,我们可以通过使用一个while循序获得结果集中的所有记录

while (rs.next()) { String str1 = rs.getString(1);    String str2 = rs.getString(2);  }

(6)关闭数据库的连接。在执行完数据库的操作之后,需要将与数据库连接有关的对象关闭。主要包括Statement对象、Connection对象等。

    stmt.close(); conn.close();


API详解


注册驱动(应用)Class.forName("com.mysql.jdbc.Driver");
获得连接对象(应用)getConnection("jdbc:mysql://localhost:3306/day07",root,root)
获得执行sql的statement对象(应用)
createStatement()返回的是Statement接口
Statement接口执行操作
* executeUpdate(sql)
* executeQuery(sql)


prepareStatement(sql),返回PreparedStatement接口,预编译SQL语句
PreparedStatement 是Statement的子接口
* 使用它可以解决sql注入问题
* 执行SQL方法:
executeQuery()
executeUpdate()
setInt(?的位置,值)


遍历结果集(应用)next()  ,  getInt()   ,  getString()
释放资源   调用close方法


PreparedStatement对象滚动结果集
可以将游标定位到任意位置
PrepareStatement pstmt = conn.prepareStatement(String sql, int resultSetType, int resultSetConcurrency)


ResultSet对象处理结果集


方法

ResultSetMetaData getMetaData() 检索此ResultSet对象的列的编号、类型和属性
boolean getBoolean(int columnIndex) 以Java编程语言中boolean的形式检索此ResultSet对象的当前行中指定列的值
float getFloat(int columnIndex) 以Java编程语言中float的形式检索
int getInt(int columnIndex) 以Java编程语言中int的形式检索此ResultSet对象的当前行中指定列的值
String getString(int columnIndex) 以Java编程语言中String的形式检索此ResultSet对象的当前行中指定列的值
boolean next() 将指针从当前位置下移一行


ResultSet接口中还提供了一些方法用于实现滚动结果集


boolean absolute(int row) 将游标移动到此ResultSet对象的指定参数row所对应的行。若游标位于有效行则返回true
boolean relative(int rows) 按相对行数移动游标到参数rows指定的行。若游标位于有效行上则返回true
boolean first() 将游标移动到第一行。若游标位于有效行则返回true,若结果集中没有数据行则返回false
boolean last() 将游标移动到最后一行。若游标位于有效行则返回true,若结果集中没有数据行则返回false
boolean next() 将游标移动到当前位置的下一行。若新当前行有效,则返回true;若不存在,则返回false
boolean previous() 将游标移动到ResultSet对象的上一行。若该行有效则返回true,若不在结果集中则返回false
boolean isFirst() 判断游标是否在此ResultSet对象的第一行。如果是则返回true
boolean isLast() 判断游标是否在此ResultSet对象的最后一行。如果是则返回true
boolean isBeforeFirst() 判断游标是否在此ResultSet对象的第一行之前,如果是则返回true
boolean isAfterLast() 判断游标是否在此ResultSet对象的最后一行之后,如果是则返回true
void beforeFirst() 将游标移动到此ResultSet对象第一行之前
void afterLast() 将游标移动到此ResultSet对象的最后一行之后


更新结果集


当将创建Statement和PreparedStatement对象中的参数resultSetConcurrency设置为ResultSet.CONCUR_UPDATABLE时,则表明该结果集是可更新的。这时我们就可以直接在结果集中对数据库进行修改了。


方法
void insertRow() 将插入行的内容插入到此 ResultSet 对象和数据库中。当指针位于插入时才可以调用该方法
void updateRow() 用此 ResultSet 对象的当前行的新内容更新底层数据库
void deleteRow() 将当前行从此 ResultSet 对象和底层数据库中删除
void cancelRowUpdates() 取消对 ResultSet对象中的当前行所作的更新。此方法在调用更新方法之后,调用updateRow方法之前调用才可以实现对行所作的更新。如果在updateRow方法之后调用该方法,则不能取消对行所做的更新
void moveToCurrentRow() 将游标移动到当前行。只有游标位于插入行上时,调用此方法才有效
void moveToInsertRow() 将游标移动到ResultSet 对象中插入行


核心API


DriverManager
Driver
Connection
Statement
    PreparedStatement
    CallableStatement
ResultSet
RowSet
DatabaseMetaData
ResultSetMetaData
Types
SQLException


JDBC批处理


在实际开发中,经常需要向数据库发送多条SQL语句,这时,如果逐条执行这些SQL语句,效率会很低。为此,JDBC提供了批处理机制,即同时执行多条SQL语句。Statement和PreparedStatement都实现了批处理。


Statement批处理

PreparedStatement批处理


大数据处理


大数据处理主要指的是对CLOB和BLOB类型数据的操作。在应用程序中,要想操作这两种数据类型,必须使用PreparedStatement 完成,并且所有的操作都要以IO流的形式进行存放和读取。


处理CLOB数据

处理BLOB数据


JDBC处理事务与数据库连接池


JDBC处理事务


在数据库操作中,一项事务是由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元
只有当事务中的所有操作都正常完成,整个事务才能被提交到数据库中,如果有一项操作没有完成,则整个事务会被撤销。


针对JDBC处理事务的操作,在Connection接口中,提供了三个相关的方法
setAutoCommit(boolean autoCommit)
commit()
rollback()


数据库连接池


什么是数据库连接池


在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。
为了避免频繁的创建数据库连接,工程师们提出了数据库连接池技术。


为了避免频繁的创建数据库连接,工程师们提出了数据库连接池技术。


DataSource接口


为了获取数据库连接对象(Connection),JDBC提供了javax.sql.DataSource接口,它负责与数据库建立连接,并定义了返回值为Connection对象的方法:
Connection getConnection() 
Connection getConnection(String username, String password)


我们习惯性的把实现了javax.sql.DataSource接口的类称为数据源,顾名思义,数据源即数据的来源。在数据源中存储了所有建立数据库连接的信息。


DBCP数据源


DBCP是数据库连接池(DataBase Connection Pool)的简称,是Apache组织下的开源连接池实现,也是Tomcat服务器使用的连接池组件。单独使用DBCP数据源时,需要在应用程序中导入两个jar包。
commons-pool.jar包
commons-dbcp.jar包
 commons-dbcp.jar包中包含两个核心类,分别是BasicDataSourceFactory和BasicDataSource,它们都包含获取DBCP数据源对象的方法。


编写配置文件
配置文件 xx.properties中有命名格式要求
driverClassName
url
username
password


BasicDataSource是DataSource接口的实现类,主要包括设置数据源对象的方法。
方法
void?setDriverClassName(String?driverClassName) 设置连接数据库的驱动名称
void?setUrl(String?url) 设置连接数据库的路径
void?setUsername(String?username) 设置数据库的登陆账号
void?setPassword(String?password) 设置数据库的登录密码
void setInitialSize(int?initialSize) 设置数据库连接池初始化的连接数目
void setMaxActive (int?maxIdle) 设置数据库连接池最大活跃的连接数目
void setMinIdle(int?minIdle) 设置数据库连接池最小闲置的连接数目
Connection getConnection() 从连接池中获取一个数据库连接


 当使用DBCP数据源时,首先得创建数据源对象,数据源对象的创建方式有两种
1.通过BasicDataSource类直接创建数据源对象
使用BasicDataSource类创建一个数据源对象,手动给数据源对象设置属性值,然后获取数据库连接对象。


2.通过读取配置文件创建数据源对象
使用BasicDataSourceFactory工厂类读取配置文件,创建数据源对象,然后获取数据库连接对象。



C3P0数据源


C3P0是目前最流行的开源数据库连接池之一,它实现了DataSource数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和 Spring使用的都是该数据源。


我们在使用C3P0数据源开发时,需要了解C3P0中DataSource接口的实现类ComboPooledDataSource,它是C3P0的核心类,提供了数据源对象的相关方法。


方法

void setDriverClass() 设置连接数据库的驱动名称
void setJdbcUrl() 设置连接数据库的路径
void setUser() 设置数据库的登陆账号
void setPassword() 设置数据库的登录密码
void setMaxPoolSize() 设置数据库连接池最大的连接数目
void setMinPoolSize() 设置数据库连接池最小的连接数目
void setInitialPoolSize() 设置数据库连接池初始化的连接数目
Connection getConnection() 从数据库连接池中获取一个连接


当使用C3P0数据源时,首先得创建数据源对象,创建数据源对象可以使用ComboPooledDataSource类,该类有两个构造方法,分别是ComboPooledDataSource()和ComboPooledDataSource(String configName)
1.通过ComboPooledDataSource类直接创建数据源对象
 使用ComboPooledDataSource类直接创建一个数据源对象,手动给数据源对象设置属性值,然后获取数据库连接对象

2.通过读取配置文件创建数据源对象
通过ComboPooledDataSource (String configName)构造方法读取c3p0-config.xml配置文件,创建数据源对象,然后获取数据库连接对象。

转载于:https://www.cnblogs.com/justdoitba/p/7582127.html

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

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

相关文章

mysql关系数据库引擎_MySQL数据库引擎详解

作为Java程序员&#xff0c;MySQL数据库大家平时应该都没少使用吧&#xff0c;对MySQL数据库的引擎应该也有所了解&#xff0c;这篇文章就让我详细的说说MySQL数据库的Innodb和MyIASM两种引擎以及其索引结构。也来巩固一下自己对这块知识的掌握。Innodb引擎Innodb引擎提供了对数…

Java之synchronized的JVM底层实现原理精简理解

1 synchronized的JVM底层原理实现的精简理解 Java 虚拟机中的synchronized基于进入和退出Monitor对象&#xff08;也称为管程或监视器锁&#xff09;实现&#xff0c; 无论是显式同步(synchronized作用在同步代码块&#xff0c;有明确的 monitorenter 和 monitorexit 指令) 还是…

三分钟掌握Actor和CSP模型

点击上方蓝字进行关注前文传送门&#xff1a;《三分钟掌握共享内存模型和 Actor模型》&#xff0c; 一直想比较Actor模型与golang的CSP模型&#xff0c;经过一段时间的实战记录了本文。Actor vs CSP模型• 传统多线程的的共享内存&#xff08;ShareMemory&#xff09;模型使用l…

DateTimeToUnix/UnixToDateTime 对接时间转换

问题&#xff0c;通过毫秒数来解析出时间&#xff1a;&#xff08;很多对接的时候经常需要用到&#xff09; <?php $MyJson {"jingdong_vas_subscribe_get_responce":{"code":"0","item_code":"FW_GOODS-2236-1","…

【学生选课系统经典】VB与SQLSERVER连接:Windows应用工程案例

实验任务描述 1 用VB6访问SQLSERVER数据库(两种安全模式); 2 用VB6完成数据库指定表上的数据显示; 3 用VB6完成数据库指定表上的数据插入、删除和更新; 4 用VB6完成SQLSERVER2008数据库用户验证。 一、数据库系统 该实验中,所要求的数据库名称为SCHOOL,总共涉及以下表:

丢失api-ms-win-crt-runtime-l1-1-0.dll

运行Cmder的时候提示&#xff1a;丢失api-ms-win-crt-runtime-l1-1-0.dll在网上找了一些方法&#xff0c;基本解决方法都是装VC2015的运行时&#xff0c;但是我安装的时候出错&#xff0c;大家可以先试试。接着我就去解决安装出错这问题没&#xff0c;折腾了半天也没成功。后来…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(二)魔法实习生第一步了解魔杖的使用

学习目标 了解什么是开发环境了解python语言的环境安装了解python语言编程的编辑器工具 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的Python入门教程 》——&#xff08;一&#xff09;既然你选择了这系列教程那么我就要让你听得懂 第三篇&#xff1a;《假如编…

Java之synchronized可重入性的理解

1 synchronized可重入性的理解 当一个线程试图操作一个由其他线程持有的对象锁的临界资源时&#xff0c;将会处于阻塞状态&#xff0c;但当一个线程再次请求自己持有对象锁的临界资源时&#xff0c;如果当前锁是重入性&#xff0c;会请求将会成功&#xff0c;如果当前锁不是可…

onmouseover-onmouseout

<input type"checkbox" value"autoLogin" οnmοuseοver"block()" οnmοuseοut"none()">两周内自动登录 <div id"div1">为了您的信息安全请不要在网吧或公共电脑勾选此项</div> <script> functi…

mysql5.7 only_full_group_by_Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错的解决方法

近期在开发过程中&#xff0c;因为项目开发环境连接的mysql数据库是阿里云的数据库&#xff0c;而阿里云的数据库版本是5.6的。而测试环境的mysql是自己安装的5.7。因此在开发过程中有小伙伴不注意写了有关group by的sql语句。在开发环境中运行是正常的&#xff0c;而到了测试环…

一款高速的NET版的离线免费OCR

PaddleOCR.Onnx一款基于Paddle的OCR&#xff0c;项目使用ONNX模型&#xff0c;速度更快。本项目同时支持X64和X86的CPU上使用。本项目是一个基于PaddleOCR的C代码修改并封装的.NET的工具类库。包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能&#xff0c;同…

spring 注解简单使用

一、通用注解 1、项目结构&#xff1a; 2、新建Person类&#xff0c;注解Component未指明id&#xff0c;则后期使用spring获取实例对象时使用默认id"person"方式获取或使用类方式获取 package hjp.spring.annotation.commen;import org.springframework.stereotype.C…

selenium+python笔记3

#!/usr/bin/env python # -*- coding: utf-8 -*- """ desc:学习unittest的用法 注意setUp/setUpClass&#xff0c;tearDown/tearDownClass的区别 ① setUp():每个测试函数运行前运行 ② tearDown():每个测试函数运行完后执行 ③ setUpClass():必须使用classmeth…

【学生选课系统经典】C#与SQLSERVER连接:ASP.NET网站(服务器端,IIS发布)

实验任务描述 1 用C#访问SQLSERVER数据库(两种安全模式); 2 用C#完成数据库指定表上的数据显示; 3 用C#完成数据库指定表上的数据插入、删除和更新; 4 用C#完成数据库用户验证。 此处使用ASP.NET工程来完成这个项目,和Windows应用不同的是:这个项目是在服务器上、依靠IIS服…

TCP包头、UDP包头、IP包头、和MAC帧包头详细字段和包头大小

1 TCP头 TCP是一种可靠的、面向连接的字节流服务,头部定义如下。 /*TCP头定义,共20个字节*/ typedef struct _TCP_HEADER {short m_sSourPort;       // 源端口号16bitshort m_sDestPort;       // 目的端口号16bitunsigned int m_uiSequNum; …

经典面试题:用户反映你开发的网站访问很慢可能会是什么原因

原文链接&#xff1a;http://blog.csdn.net/lv_victor/article/details/53148421 问题场景&#xff1a;某个用户向你反映说你开发的网站访问速度很慢&#xff0c;但是该用户访问其他问题很正常&#xff0c;分析下原因、有哪些工具分析原因、怎么解决问题&#xff1f; 最近面试两…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(三)使用初始魔法跟编程魔法世界打个招呼吧

学习目标 完成显示魔法的使用——输出print完成传入魔法的使用——输入input使魔法生效——运行python文件 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的Python入门教程 》——&#xff08;一&#xff09;既然你选择了这系列教程那么我就要让你听得懂 第二篇&am…

查缺补漏系统学习 EF Core 6 (一)

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事掌握 ORM 开发方式是每一个 .NET 开发者所必备的技能&#xff0c;而且 .NET 平台有很多优秀的 ORM 框架。很多人都会诟病 .NET 官方标配的 Entity Framework&#xff0c;感觉其笨重难用、性能低下。但其实经过多年发展&am…

mysql 5.5 mysqldump_mysql 5.5 mysqldump 原文翻译

根据mysql 5.5第6.4章节理解和自己翻译水平有限如有纰漏请指教,原文如下.6.4 使用mysqldump备份(Using mysqldump for Backups)首先多余的不用说了备份用来干什么大家都清楚。mysqldump备份分两种输出形式&#xff1a;1. 无--tab选项&#xff0c;输出标准的SQL格式。输出包含CR…

【经典回放】JavaScript学习详细干货笔记之(一)

【经典回放】JavaScript学习详细干货笔记之&#xff08;一&#xff09; 【经典回放】JavaScript学习详细干货笔记之&#xff08;二&#xff09; 【经典回放】JavaScript学习详细干货笔记之&#xff08;三&#xff09; 目录 一、为什么要学JavaScript 二、JavaScript经典案例 …