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