JDBC
概述
什么是JDBC
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对象是通过执行一个查询数据库的语句生成
连接
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 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对象的最后一行之后
更新结果集
方法
void insertRow() 将插入行的内容插入到此 ResultSet 对象和数据库中。当指针位于插入时才可以调用该方法
void updateRow() 用此 ResultSet 对象的当前行的新内容更新底层数据库
void deleteRow() 将当前行从此 ResultSet 对象和底层数据库中删除
void cancelRowUpdates() 取消对 ResultSet对象中的当前行所作的更新。此方法在调用更新方法之后,调用updateRow方法之前调用才可以实现对行所作的更新。如果在updateRow方法之后调用该方法,则不能取消对行所做的更新
void moveToCurrentRow() 将游标移动到当前行。只有游标位于插入行上时,调用此方法才有效
void moveToInsertRow() 将游标移动到ResultSet 对象中插入行
核心API
Driver
Connection
Statement
PreparedStatement
CallableStatement
ResultSet
RowSet
DatabaseMetaData
ResultSetMetaData
Types
SQLException
JDBC批处理
Statement批处理
PreparedStatement批处理
大数据处理
处理CLOB数据
处理BLOB数据
JDBC处理事务与数据库连接池
JDBC处理事务
只有当事务中的所有操作都正常完成,整个事务才能被提交到数据库中,如果有一项操作没有完成,则整个事务会被撤销。
针对JDBC处理事务的操作,在Connection接口中,提供了三个相关的方法
setAutoCommit(boolean autoCommit)
commit()
rollback()
数据库连接池
什么是数据库连接池
为了避免频繁的创建数据库连接,工程师们提出了数据库连接池技术。
为了避免频繁的创建数据库连接,工程师们提出了数据库连接池技术。
DataSource接口
Connection getConnection()
Connection getConnection(String username, String password)
我们习惯性的把实现了javax.sql.DataSource接口的类称为数据源,顾名思义,数据源即数据的来源。在数据源中存储了所有建立数据库连接的信息。
DBCP数据源
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数据源开发时,需要了解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配置文件,创建数据源对象,然后获取数据库连接对象。