文章目录
一、JDBC
1.简介
JDBC(Java Database Connectivity) 是API,JVM使用JDBC驱动程序将通用JDBC调用转换为特定于供应商的数据库调用,数据库访问和所有数据库供应商的访问方式一样。
2.JDBC Architecture
3.四种Java驱动程序
- 类型1:JDBC-ODBC桥驱动程序
将JDBC调用转换为访问DBMS协议的ODBC调用。ODBC驱动程序必须安装在客户端计算机上。 - 类型2:本机协议部分Java驱动程序
将JDBC调用转换为本机DBMS协议中的调用。由于此转换在客户端进行,因此必须在客户端计算机上安装一些二进制代码。 - 类型3:一种网络协议全Java驱动程序
将JDBC调用转换为独立于任何本地DBMS协议的net协议。然后,在服务器上运行的中间件软件将网络协议转换为本机DBMS协议。 - 类型4:本机协议所有Java驱动程序
将JDBC调用转换为本机DBMS协议。此转换在服务器端进行。
二、导入mysql的jar包驱动
1.DBMS
- JDK中包含了Java DB。
- MySQL Community Edition: https://www.mysql.com
– Connector/J into your class path:https://www.mysql.com/products/connector/
2.jar包位置
mysql安装在D盘,但这个jar包在C盘下的MySQL/Connector J 8.0
下
将这个jar包导入项目中:https://blog.csdn.net/be_your1/article/details/88111462
三、JDBC编程
1.步骤
①加载数据库驱动程序
②获得连接
③创建和执行语句(SQL查询)
④从表中获取结果集(表)
⑤浏览结果集
⑥Exception处理和关闭连接
2.加载数据库驱动程序
/**
* String driver:数据库驱动的类名
*/
Class.forName(driver);
比如mysql的:
// MySQL 8.0 以下版本
String JDBC_DRIVER_8DOWN = "com.mysql.jdbc.Driver";
// MySQL 8.0 以上版本
String JDBC_DRIVER_8UP = "com.mysql.cj.jdbc.Driver";
Class.forName(JDBC_DRIVER_8UP);
3.获得连接
/**
* String url:数据库的Url链接
* String user:用户名
* String password:密码
*/
Connection con = DriverManager.getConnection(url, user, password);
比如mysql的:
// MySQL 8.0 以下版本
String DB_URL_8DOWN = "jdbc:mysql://localhost:3306/tablename";
// MySQL 8.0 以上版本
// MySQL 8.0 以上版本不需要建立 SSL 连接的,需要显示关闭。[但true好像也没有报错]
String DB_URL_8UP = "jdbc:mysql://localhost:3306/tablename?useSSL=false&serverTimezone=UTC&&allowPublicKeyRetrieval=true";
String user = "root";
String password = "1234";
Connection con = DriverManager.getConnection(DB_URL_8UP, user, password);
4.创建和执行语句
(1)方法1:Statement
语句类型
- 先创建语句
Statement stmt= con.createStatement();
- 执行语句
- 查询select语句,返回一个结果集
String sql = "SELECT * FROM authors";
ResultSet rs = stmt.executeQuery(sql);
- 返回执行标志(失败
0
,成功1
)的语句(insert,delete,update)
String sql = "DALETE FROM authors";
int flag = stmt.executeUpdata(sql);
(2)方法2:PreparedStatement
语句类型
- 填充
PreparedStatement
语句中的参数
// ?表示待填充的参数
String sql = "select * from customer where account = ? and password = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
// 第几个参数,下标从1开始
pstmt.setInt(1, user.getAcccount());
pstmt.setString(2, user.getPassword());
- 执行语句
- 查询select语句,返回一个结果集
ResultSet rs = pstmt.executeQuery();
- 返回执行标志(失败
0
,成功1
)的语句(insert,delete,update)
int flag = pstmt.executeUpdata();
【易错点】:
- 注意
executeQuery()
和executeUpdata()
内是没有参数的 ?
号不能被单引号包围。
如报错Parameter index out of range (1 > number of parameters, which is 0).
是因为"INSERT INTO `pimtodo` (`id`, `text`) VALUES ('?', '?')"
语句,此时?
会被作为参数传入,而setString
里面的值不会再传入。- sql语句中没有
?
号,此时无需传值。传值就会出错。
如select * from pimtodo;
- 中英文问号:
?
,?
中文问号无法识别。
5.从表中获取结果集(表)
ResultSet rs = statement.executeQuery (sql);
ResultSet rs = pstmt.executeQuery();
6.浏览结果集
/**
* 使用目的:用next()看看有没有找到
* next()作用:将光标从当前位置移动到下一行。
* next()机制:结果集光标最初位于第一行之前;
* 对方法next的第一次调用使第一行成为当前行;
* 第二次调用使第二行成为当前行,依此类推。
*/
while(rs.next()) {
// 方法1:输入列名,大小写不敏感
int id = rs.getInt("id");
// 方法2:输入第几列,下标从1开始
String name = rs.getString(2);
}
rs.next()
查询时,还得保持连接(con
、statement
、pstmt
、rs
只要有用到过,此时就不能关闭),在查询ResultSet完后关闭才不会报错
Java(九)数据库JDBC:2.Operation not allowed after ResultSet closed结果集关闭异常
7.Exception处理和关闭连接
con
、statement
、pstmt
、rs
都需要异常处理和关闭,在有关数据库操作结束后关闭。
try{
}catch(Exception e){
e.printStackTrace();
}finally{
if(con!=null) {
con.close();
}
if(statement!=null) {
statement.close();
}
if(pstmt!=null) {
pstmt.close();
}
if(rs!=null) {
rs.close();
}
}