第12章 - Java JDBC
作者:vwFisher
时间:2019-09-04
GitHub代码:https://github.com/vwFisher/JavaBasicGuide
目录
- 1 JDBC操作数据库
- 1.1 JDBC概述
- 1.1.1 JDBC概述
- 1.1.2 JDBC技术
- 1.2 JDBC的常用类和接口
- 1.2.1 DriverManager类
- 1.2.2 Connection接口
- 1.2.3 Statement接口
- 1.2.4 PreaparedStatement接口
- 1.2.5 ResultSet接口
- 2.3 通过JDBC操作数据库
- 2.3.1 加载数据库驱动
- 2.3.2 建立连接
- 2.3.3 向数据库添加数据
- 2.3.4 获取查询结果集
- 2.3.5 更改数据库中的数据
- 2.3.6 删除数据库中的数据
- 2.3.7 模糊查询
- 1.1 JDBC概述
1 JDBC操作数据库
JDBC是连接数据库和Java程序的桥梁, 通过JDBC API可以方便地实现各种主流数据库的操作.
1.1 JDBC概述
1.1.1 JDBC概述
数据库是一种存储结构, 它允许使用各种格式输入、处理和检索数据, 不必每次需要数据的时候重新输入它们.
一、数据库特点
- 实现数据共享:数据共享包含所有用户可同时存取数据库中的数据, 也包括用户可以用各种方式通过接口使用数据库, 并提供数据共享
- 减少数据的冗余度:同文件系统相比, 由于数据库实现了数据共享, 从而避免了用户各自建立应用文件. 减少了大量重复数据, 减少了数据冗余, 维护了数据的一致性
- 数据的独立性:数据的独立性包括数据库中数据库的逻辑结构和应用程序相互独立, 也包括数据物理结构的变化不影响数据的逻辑解雇
- 数据实现集中控制:文件管理方式中, 数据处于分散的状态, 不同的用户或同一用户在不同处理中其文件之间毫无关系. 利用数据库可对数据进行集中控制和管理, 并通过数据模型表示各种数据的组织以及数据间的联系
- 数据一致性和可维护性:以确保数据的安全性和可靠性. 主要包括: 安全性控制, 以防止数据丢失、错误更新和越权使用. 完整性控制, 保证数据的正确性、有效性和相容性. 并发控制, 使在同一时间周期内, 允许对数据实现多路存取, 又能防止用户之间的不正常交互作用. 故障的发现和恢复
二、数据库的种类及功能
数据库系统一般基于某种数据模型, 可以分为层次型, 网状型, 面向对象型, 关系型等
- 层次型数据库: 类似于树结构, 是一组通过链接而相互联系在一起的记录. 层次模型的特点是记录之间的联系是通过指针完成的. 由于层次模型层次顺序严格而且复杂. 导致对数据的各项操作都很困难
- 网状型数据库: 网络模型是使用网络结构表示实体类型、实体间联系的数据模型. 网络模型容易实现多对多的联系. 但需要编写应用程序时, 必须熟悉数据库的逻辑结构
- 面向对象型数据库: 建立在面前对象模型基础上
- 关系型数据库: 是目前最流行的数据库, 是基于关系模型家里你的数据库, 关系模型由一系列表格组成
1.1.2 JDBC技术
JDBC制订统一的访问各类关系数据库的标准接口, 为各个数据库厂商提供了标准接口的实现.
JDBC技术具有以下优点:
- JDBC与ODBC十分相似, 便于软件开发人员理解
- JDBC使软件开发人员从复杂的驱动程序编写工作中解脱, 可以完全专注于业务逻辑的开发
- JDBC支持多种关系型数据库, 大大增加了软件的可移植性
- JDBC API是面向对象的, 软件开发人员可以将常用的方法进行二次封装, 从而提高代码的重用性
1.2 JDBC的常用类和接口
JDBC是一种可用于执行SQL语句的Java API(Application Programming Interface, 应用程序设计接口), 是连接数据库和Java应用程序的一个纽带
1.2.1 DriverManager类
DriverManager类用来管理数据库中的所有驱动, 是JDBC的管理层, 作用于用户和驱动程序之间, 跟踪可用的驱动程序, 并在数据库的驱动程序之间建立连接. 此外, DriverManager类也处理诸多驱动程序登录时间限制及登录和跟踪信息的显示等事务. DriverManager类的方法都是静态方法(无序实例化, 就可以通过类名直接调用)
DriverManager常用方法:
Connection getConnection(String url, String user, String password)
指定3个入口参数, 依次是连接数据库的URL、用户名、密码, 来获取与数据库的连接
void setLoginTimeout()
获取驱动程序试图登录到某一数据库时可以等待的最长时间, 以秒为单位
void println(String message)
将一条消息打印到当前JDBC日志流中
1.2.2 Connection接口
Connection接口代表与特定的数据库的连接. 要对数据表中的数据进行操作, 首先要获取数据库连接. Connection实例就像在 应用程序 与 数据库 之间开通了一条渠道
可通过DriverManager类的getConnection()方法获取Connection实例
Connection接口常用方法:
createStatement() // 创建Statement对象
createStatement(int resultSetType, int resultSetConcurrency) // 同上,给定类型、并发性和可保存性的ResultSet对象
prepareStatement():创建预处理对象PreparedStatement
isReadOnly():查看当前Connection对象的读取模式是否是只读形式
setReadOnly():设置当前Connection对象的读写模式, 默认是非只读模式
commit():提交当前事务中的所有更改,并释放此Connection对象当前持有的所有数据库锁
roolback():取消在当前事务中进行的所有更改, 并释放此Connection对象当前持有的所有数据库锁
close():立即释放此Connection对象的数据库和JDBC资源, 而不是等待他们被自动释放
1.2.3 Statement接口
Statement接口用于创建用数据库中传递SQL语句的对象
Statement接口用的方法:
execute(String sql):执行静态的SELECT语句, 该语句可能返回多个结果集
executeQuery(String sql):执行给定的SQL语句, 该语句返回单个ResultSet对象
clearBatch():清空此Statement对象的当前SQL命令列表
executeBatch(String sql):将一批命令提交给数据库来执行, 如果全部命令执行成功, 则返回更新计数组成的数组. 数组元素的排序与SQL语句的添加顺序对应
executeUpdate(String sql):执行给定的SQL语句, 该语句可以为INSERT, UPDATE或DELETE语句
addBatch(String sql):将给定的SQL命令添加到此Statement对象的当前命令列表中. 如果驱动程序不支持批量处理将抛出异常
close():释放Statement实例占用的数据库和JDBC资源
1.2.4 PreaparedStatement接口
PreparedStatement接口继承Statement, 用于执行动态的SQL语句, 通过PreparedStatement实例执行的SQL语句, 将被预编译并保存到PreparedStatement实例中, 从而可以反复地执行该SQL语句
PreparedStatement接口方法:
execute():执行SQL语句, 该语句可以是任何类型的SQL语句
executeQuery():执行SQL查询语句, 返回结果集ResultSet对象
executeUpdate():执行SQL语句, 该SQL语句必须是一个INSER, UPDATE, DELETE语句(没有返回值得DDL语句)
setByte(int pIndex, byte bt):将参数pIndex位置上设置为给定的byte型参数值
setDouble(int pIndex, double dou):将参数pIndex位置上设置为给定的double型参数值
setInt(int pIndex, int x):将参数pIndex位置上设置为给定的int型参数值
setObject(int pIndex, Object o):将参数pIndex位置上设置为给定的Object型参数值
setString(int pIndex, String str):将参数pIndex位置上设置为给定的String型参数值
1.2.5 ResultSet接口
ResultSet接口类似于一个临时表, 用来暂时存放数据库查询操作所获得的结果集.
下表方法的参数均有 int columnIndex 或 String columnLabel
ResultSet接口用的方法
getInt():以int形式获取ResultSet对象的当前行指定列值, 如列值是null, 返回0
getFloat():以float形式获取ResultSet对象的当前行指定列值, 如列值是null, 返回0
getDate():以Date形式获取ResultSet对象的当前行指定列值, 如列值是null, 返回null
getBoolean():以boolean形式获取ResultSet对象的当前行指定列值, 如列值是null, 返回null
getString():以String形式获取ResultSet对象的当前行指定列值, 如列值是null, 返回null
getObject():以Object形式获取ResultSet对象的当前行指定列值, 如列值是null, 返回null
next():将指针向下移一行
updateInt():用指定的int值更新指定列
updateFloat():用指定的float值更新指定列
updateLong():用指定的long值更新指定列
updateString():用指定的String值更新指定列
updateObject():用Object值更新指定列
updateNull():将指定的列值修改为null
updateDate():用指定的Date值更新指定列
updateDouble():用指定的double值更新指定列
2.3 通过JDBC操作数据库
如果需要访问数据库, 首先要加载数据库驱动, 数据库驱动只需在第一次访问数据时加载一次. 然后再每次访问数据库时创建一个Connection实例, 获取数据库连接, 这样就可以执行操作数据库的SQL语句. 最后在完成数据库操作时, 释放与数据库的连接
2.3.1 加载数据库驱动
将下载的数据库驱动文件添加到项目中后, 首先需要加载数据库驱动程序, 才能进行数据库操作.
Java加载数据库驱动的方法时调用Class类的静态方法forName()
public static Class> forName(String className)throws ClassNotFoundException
给定class的完全限定名,返回指定的Class对象。如果加载失败, 则会抛出ClassNotFoundException异常。如:
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动(在对应的Jar包里的包名可以找到)
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
2.3.2 建立连接
加载完数据库驱动即可建立数据库的连接, 可以使用DriverManager类的静态方法getConnection()来实现, 并分别将数据库的URL、数据库用户名和密码作为该方法的参数, 即可建立到指定数据库的连接
示例1: 建立与MySQL数据库的连接
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动
String url = "jdbc:mysql://localhost:3306/db_database"; // 声明数据库db_database的URL
String user = "root"; // 数据库用户名
String password = "111"; // 数据库密码
Connection conn = DriverManager.getConnection(url, user, password); // 建立数据库连接,获得连接对象conn
conn.close(); // 关闭数据库连接对象
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
示例2: 建立与SQL Server2005数据库的连接
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // 加载数据库驱动
String url = "jdbc:sqlserver://localhost:3306/db_database"; // 声明数据库db_database的URL
String user = "root"; // 数据库用户名
String password = "111"; // 数据库密码
Connection conn = DriverManager.getConnection(url, user, password); // 建立数据库连接,获得连接对象conn
conn.close(); // 关闭数据库连接对象
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
2.3.3 向数据库添加数据
建立了数据库连接, 就可以使用Connection接口的createStatement()方法来获得prepareStatement()方法获得PreparedStatement对象, 通过executeUpdate()方法来执行SQL语句, 就可以向数据库添加数据了
2.3.4 获取查询结果集
Statement接口的executeUpdate()或executeQuery()方法可执行SQL语句, executeUpdate()方法用于执行数据的插入、修改与删除操作, 返回影响数据库记录的条数. executeQuery()用于执行SELECT查询语句, 将返回一个ResultSet型的结果集. 跳过遍历查询结果集的内容, 才可获取SQL语句执行的查询结果
ResultSet对象具有指向当前数据行的光标. 最初, 光标被置于第一行之前, 可以通过该对象的next()方法将光标移动到下一行: 如果ResultSet对象没有下一行, next()方法返回false, 所以可以在while循环使用next()方法迭代结果集
2.3.5 更改数据库中的数据
修改数据时数据库操作中必不可少的一部分, 使用Statement接口中的executeUpdate()方法可以修改数据库表中的数据, 也可以使用PreparedStatement接口中的executeUpdate()方法对数据库中的表进行修改操作
2.3.6 删除数据库中的数据
删除数据表中的数据同样是一个很常用的技术, 使用executeUpdate()方法执行用来做删除的SQL语句可以删除数据库表中的数据
2.3.7 模糊查询
模糊查询是比较常见的一种查询方式.
例如在订单表中, 包含有订单的具体日期, 如果要查询某年某月的订单信息, 最好的方式就是使用模糊查询.
关键字LIKE, 在使用LIKE关键字进行模糊查询时, 可以使用配配符"%"来代替0个或多个字符, 使用"_"下划线来代替一个字符