JDBC
作者:互联网
JDBC
简介
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC API 允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据。
执行流程:
- 连接数据源,如:数据库。
- 为数据库传递查询和更新指令。
- 处理数据库响应并返回的结果。
基本使用
加载驱动 - Driver接口
在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。驱动就是各个数据库厂商实现的Sun公司提出的JDBC接口,即对Connection等接口的实现类的jar文件。
装载MySQL驱动:
-
5.0版本
Class.forName("com.mysql.jdbc.Driver");
-
8.0以上版本有所不同
Class.forName("com.mysql.cj.jdbc.Driver");
建立连接 - Connection接口和DriverManager接口
import java.sql.Connection;
import java.sql.DriverManager;
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC","root","password");
- MySQL 8.0 以上版本不需要建立 SSL 连接的,需要显示关闭。
- allowPublicKeyRetrieval=true 允许客户端从服务器获取公钥。
- 最后还需要设置 CST。
执行查询 - Statement接口
三种Statement类:
-
Statement:
由createStatement创建,用于发送简单的SQL语句。(不带参数)
import java.sql.Statement; Statement stmt = conn.createStatement(); String sql = "INSERT INTO `t_user` (`username`, `pwd`, `regTime`) VALUES ('王五', '456', '2022-03-14 09:13:11')"; stmt.execute(sql);
- 纯靠字符串拼接,不方便。
- 容易SQL注入
- 常用Statement方法:
- execute():运行语句,返回是否有结果集。
- executeQuery():运行select语句,返回ResultSet结果集。
- executeUpdate():运行insert/update/delete操作,返回更新的行数。
-
PreparedStatement:
继承自Statement接口,由prepareStatement创建,用于发送含有一个或多个输入参数的sql语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入。我们一般都用PreparedStatement。
import java.sql.PreparedStatement; String sql = "INSERT INTO `t_user` (`username`, `pwd`, `regTime`) VALUES (?, ?, ?)"; //占位符 PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1,"张三"); //参数索引从1开始而不是从0开始 ps.setString(2,"456"); ps.setDate(3,new java.sql.Date(System.currentTimeMillis())); ps.execute();
-
CallableStatement:
继承自PreparedStatement。由方法prePareCall创建,用于调用存储过程。
展开结果集数据库 - ResultSet接口
String sql = "SELECT * FROM t_user WHERE id>?"; //占位符
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,2); //查询ID大于2的
ResultSet res = ps.executeQuery();
while(res.next()){
System.out.println(res.getInt(1) + "---" + res.getString(2) + "---" + res.getString(3) + "---" + res.getString(4));
}
关闭连接 - close()方法
后开先关,使用close()方法。
遵循:ResultSet-->Statement-->Connection的顺序,三个最好分开写。
finally {
try{
if(res!=null){
res.close();
}
}
catch (SQLException throwables) {
throwables.printStackTrace();
}
try{
if(ps!=null){
ps.close();
}
}
catch (SQLException throwables) {
throwables.printStackTrace();
}
try{
if(conn!=null){
conn.close();
}
}
catch (SQLException throwables) {
throwables.printStackTrace();
}
}
事务
基本概念
一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。
- 事务开始于:
- 连接到数据库上,并执行一条DML语句(INSERT、UPDATE或DELETE)。
- 前一个事务结束后,又输入了另外一条DML语句。
- 事务结束于:
- 执行COMMIT或ROLLBACK语句。
- 执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执行COMMIT语句。
- 执行一条DCL语句,例如GRANT语句;在这种情况下,会自动执行COMMIT语句。
- 断开与数据库的连接。
- 执行了一条DML语句,该语句却失败了;在这种情况中,会为这个无效的DML语句执行ROLLBACK语句。
- 事务的四大特点(ACID)
- atomicity(原子性):表示一个事务内的所有操作是一个整体,要么全部成功,要么全失败;
- consistency(一致性):表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态:
- isolation(隔离性):事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
- durability(持久性):持久性事务完成之后,它对于系统的影响是永久性的。
使用
conn.setAutoCommit(flase); // JDBC默认自动提交
/**
*一系列SQL操作
*/
conn.commit(); // 手动提交
- 这一系列SQL操作,只要有一个失败就会回滚到初始状态。
CLOB & BLOB
简介
-
CLOB ( Character Large Object)
-
BLOB(Binary Large Object)
-
用于存储大量的二进制数据
-
大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。
-
Mysql中相关类型:
-
TINYBLOB最大长度为255(2^[8] - 1)字节的BLOB列。
-
BLOB[(M)]最大长度为65,535(2^[16] - 1)字节的BLOB列。
-
MEDIUMBLOB最大长度为16,777,215(2^[24] - 1)字节的BLOB列。 -LONGBLOB最大长度为4,294,967,295或4GB(2^[32] - 1)字节的BLOB列。
-
-
CLOB使用
可使用流操作直接写入
ps.setClob(2, new FileReader(new File("d:/a.txt"))); // 将文本文件内容直接写入数据库
ps.setClob(2, new BuffereReader(new InputStreamReader(new ByteArrayInputStream("testString".getBytes())))); // 用流输入字符串
读出当然也是流
while(res.next()){
Colb c = res.getClob("myInfo");
Reader r = c.getCharacterStream();
int temp = 0;
while((temp=r.read())!=-1){
System.out.print((char)temp);
}
}
BLOB使用
可用字节流写入图片之类的
ps.setBlob(2, new FileInputStream("d:/a.jpg")); // 将图片内容直接写入数据库
读出
while(res.next()){
Bolb b = res.getBlob("headImg");
InputStream is = b.getBinaryStream();
OutputStream os = new FileOutputStream("d:/a_downlod.jpg");
int temp = 0;
while((temp=is.read())!=-1){
os.write(temp);
}
}
标签:语句,ps,JDBC,res,数据库,Statement,sql 来源: https://www.cnblogs.com/AncilunKiang/p/16674046.html