JDBC
1.快速入门
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H9O175cm-1658551938752)(/Users/liurunxuan/Library/Application%20Support/marktext/images/2022-07-22-22-13-08-image.png)]
package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/*
* jdbc的快速入门
* */
public class Main {
public static void main(String[] args) throws Exception {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
String url="jdbc:mysql://127.0.0.1:3306/soutipai";
String username="root";
String password="Lrx030405";
Connection conn = DriverManager.getConnection(url,username,password);
//定义sql
String sql ="update question_table set question_answer = '你猜' where id ='27c828679d2b4e25bf7c7cf7e91e7bdb'";
//获取执行sql的对象
Statement stmt =conn.createStatement();
//执行sql
int count=stmt.executeUpdate(sql);//返回值是受影响的行数
//处理结果
System.out.println(count);
//释放资源
stmt.close();
conn.close();
}
}
2.API详解
-
DriverManager
-
作用
-
注册驱动
-
获取数据库连接
-
-
获取连接的url
-
语法: jdbc:mysql://ip地址:端口号/数据库名称?参数键值对1&参数键值对2
-
useSSL=false
-
-
为什么要在类上抛出异常
-
-
Connection
-
作用
-
获取执行sql的对象
-
管理事务
-
-
事务管理(事务管理是对于一系列数据库操作进行管理,一个事务包含一个或多个SQL语句,是逻辑管理的工作单元(原子单元)。)
-
事务
-
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
-
特性
-
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
-
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
-
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
-
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
-
-
-
开启事务:setAutoCommit(boolean autoCommit)
-
提交事务:commit()
-
回滚事务:回到事务开始之前的状态rollback()
-
-
try {
//开启事务
conn.setAutoCommit(false);
//执行sql
int count1=stmt.executeUpdate(sql1);//返回值是受影响的行数
//处理结果
System.out.println(count1);
int i=3/0;
//执行sql
int count2=stmt.executeUpdate(sql2);//返回值是受影响的行数
//处理结果
System.out.println(count2);
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
throw new RuntimeException(e);
}
-
Statement
-
作用:执行sql语句
-
方法
-
int executeUpdate(sql)
-
执行DML语句,返回值是受影响的行数
-
执行DDL语句,修改成功也有可能返回0
-
DDL DML 忘了😭
-
-
-
ResultSet
-
作用:封装了DQL查询结果
-
获取查询结果
-
游标:用来指示当前在表的哪一行,查询结束获得结果后,一开始在第一行数据的上一行。
-
boolean next()方法
- 将光标下移一行,并判断是否为有效行
-
xxx getXxx(参数)
-
xxx指数据类型
-
参数
-
如果是int类型的参数,则这个数字参数是指第几列,而且从1开始
-
如果是string类型的参数,那这应该是列的名称
-
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8cVJQfIf-1658551938754)(/Users/liurunxuan/Library/Application%20Support/marktext/images/2022-07-23-00-03-46-image.png)]
-
-
(这个序号应该是4,这软件不怎么好用)一个案例,list没学但还能理解[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CW5d15vz-1658551938754)(/Users/liurunxuan/Library/Application%20Support/marktext/images/2022-07-23-00-24-51-image.png)]
-
PreparedStatement
-
作用:预编译SQL语句并执行,防止sql注入
-
jar包:JAR文件(Java归档,英语:Java Archive)是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便开发Java平台应用软件或库。
-
使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TKMbjYOe-1658551938755)(/Users/liurunxuan/Library/Application%20Support/marktext/images/2022-07-23-10-24-03-image.png)]
-
原理
-
预编译节省时间
-
在单引号前加反斜杠,转译,防止sql注入
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZRlhbQtU-1658551938755)(/Users/liurunxuan/Library/Application%20Support/marktext/images/2022-07-23-11-05-36-image.png)]
-
需要开启预编译功能,将来多次执行sql前,只需要一次检查和编译sql
-
-
-
3.数据库连接池
(还是一个池连着一个数据库,池里可以有好多连接)
-
简介
-
实现
-
Driud
-
导入jar包
-
定义配置文件
-
加载配置文件
-
获取数据库连接池对象
-
获取连接
-
4.案例
通过Druid连接池,连接到test数据库,怎么连接的?不是写在java的程序里的url,而是配置文件。
获取连接池对象,获取数据库连接,再创建执行sql的对象,用的是PreparedStatement对象(你看这有statement,是不是和flutter里很像,就是状态是可以改变的),这个对象设置参数、执行sql、获得返回值(ResultSet类型的对象).
下面就要处理返回值,next()、getXxx()方法都在ResultSet对象里。
一行一行地获取了这些数据,存哪呢?以后还得传给前端嘞。在实体类的pojo里创建了一个类专门用来转存数据,再把这些实例化的对象存到ArrayList里。
(下面只演示了查询功能)
- java程序
package example;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.testng.annotations.Test;
import pojo.Brand;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
//品牌数据的增删改查操作
//1.连接都一样,就是配置文件里需要改动
//不一样的是
/*
* 1.sql
* 2.参数
* 3.结果怎么处理
* */
public class BrandTest {
//查询所有
@Test
public void TestSelectAll() throws Exception {
//获取连接
//加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("/Users/liurunxuan/Downloads/哈工大学习/JDBC/JDBC/jdbc-demo/src/main/druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接
Connection connection = dataSource.getConnection();//连接的哪个数据库,用户名,密码啥的都在配置文件里了
//定义sql
String sql = "select * from tb_brand";
//获取执行sql的对象 PreparedStatement对象
PreparedStatement ps = connection.prepareStatement(sql);
//设置参数
//执行sql
ResultSet rs = ps.executeQuery();
//处理结果 将每一行封装为brand对象,再将这些对象装到list里
Brand brand;
List<Brand> brands =new ArrayList<>();
while(rs.next())
{
//获取数据
int id = rs.getInt("id");
String brandName= rs.getString("brand_name");
String companyName = rs.getString("company_name");
int ordered = rs.getInt("ordered");
String description = rs.getString("description");
int status = rs.getInt("status");
//封装对象
brand =new Brand();
brand.setId(id);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setOrdered(ordered);
brand.setDescription(description);
brand.setStatus(status);
//装在集合里
brands.add(brand);
}
System.out.println(brands);
//释放资源
rs.close();
ps.close();
connection.close();
}
}
- 存数据的类声明
package pojo;
public class Brand {
// id 主键
private Integer id ;
// 品牌名称
private String brandName ;
private String companyName ;
// 排序字段
private Integer ordered ;
// 描述信息
private String description ;
// 状态:0:禁用 1:启用
private Integer status ;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBrandName() {
return brandName;
}
public void setBrandName(String brandName) {
this.brandName = brandName;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public Integer getOrdered() {
return ordered;
}
public void setOrdered(Integer ordered) {
this.ordered = ordered;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "brand{" +
"id=" + id +
", brandName='" + brandName + '\'' +
", companyName='" + companyName + '\'' +
", ordered=" + ordered +
", description='" + description + '\'' +
", status=" + status +
'}';
}
}
- 数据库连接池配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test?useSSL=false&useServerPrepStmts=true
username=root
password=Lrx030405
# ³õʼ»¯Á¬½ÓÊýÁ¿
initialSize=5
# ×î´óÁ¬½ÓÊý
maxActive=10
# ×î´óµÈ´ýʱ¼ä
maxWait=3000