简介
- JDBC是用Java语言操作关系型数据库的一套API。(Java DataBse Connectivity)
- Java代码→JDBC【接口】→MySQL驱动(实现类jar包)/Oracle驱动/..
- 理解:通过学习使用Java语言操作JDBC接口(规则),调用不同数据库所需的jar包,即实现类。
操作
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动(引入jdbc对于MySQL的实现类)
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接(将实现类/驱动和数据库相连接)
//UTC表示恒定24小时制,serverTimezone时区配置
String url="jdbc:mysql://127.0.0.1:3306/db01?serverTimezone=UTC";
String username="root";
String password="1234";
Connection conn= DriverManager.getConnection(url,username,password);
//3.定义sql
String sql="update account set money=2000 where id=1 ";
//4.获取执行sql的对象
Statement st=conn.createStatement();
//5.执行sql
int count=st.executeUpdate(sql);
//6.返回处理结果
System.out.println(count);
//7.释放资源
st.close();
conn.close();
}
API详解
DriverManager
- 注册驱动【即可不写】
- 获取连接【本机代码简写:用"/"省略IP地址和端口号】
//1.注册驱动(引入jdbc对于MySQL的实现类)
// Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接(将实现类/驱动和数据库相连接)
String url="jdbc:mysql:///db01?useSSL=false&serverTimezone=UTC";
String username="root";
String password="1234";
Connection conn= DriverManager.getConnection(url,username,password);
Connection
- 获取执行SQL的对象
- 普通执行SQL对象
- 预编译SQL的执行SQL对象:防止SQL注入
//普通执行SQL对象
Statement createStatement()
//预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
- 事物管理
//开启事物
setAutoCommit(boolean autoCommit) //true为自动提交
//提交事务
commit();
//回滚事务
rollback();
Statement
- 执行SQL语句
- 执行DML、DDL语句
int executeUpdate(sql):执行DML、DDL语句
返回值:(1)DML语句影响的MySQL表中的行数
(2)DDL语句执行后,执行成功也可能返回0
- 执行DQL语句
ResultSet executeQuery(sql):执行DQL语句
返回值:ResultSet结果集对象
ResultSet
- 封装了DQL查询语句的结果
- 获取查询结果
public class JDBCDemo5_ResultSet {
public static void main(String[] args) throws SQLException {
//1.注册驱动
//2.获取连接
Connection c= DriverManager.getConnection("jdbc:mysql:///db01?serverTimezone=UTC","root","1234");
//3.定义sql语句
String sql="select * from account";
//4.创建sql对象
Statement s=c.createStatement();
//5.执行sql
ResultSet rs=s.executeQuery(sql);
//6.创建集合存储Account的对象:即存储account表中的内容
ArrayList<Account> list=new ArrayList<>();
//7.处理结果,遍历rs中所有内容
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString(2);
double money=rs.getDouble(3);
Account account=new Account(id,name,money);
list.add(account);
}
System.out.println(list);
}
}
PreparedStatement
- 作用:预编译SQL语句并执行:预防SQL注入问题
- SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的目的。【了解】
package com.wen.jdbc;
import java.sql.*;
public class JDBCDemo7_PreparedStatement {
public static void main(String[] args) throws SQLException {
//模拟用户登录时sql注入问题
//1.注册驱动
//2.获取连接
Connection coon = DriverManager.getConnection("jdbc:mysql:///db01?serverTimezone=UTC", "root", "1234");
//接收用户输入用户名和密码
String name = "zhangsan";
String pwd = "1234 ";
//3.获取sql执行语句
String sql = " select * from tb_user where username= ? and password=? ";
//4.创建sql执行对象
PreparedStatement ps = coon.prepareStatement(sql);
//获取ps的值
ps.setString(1,name);
ps.setString(2,pwd);
//5.执行sql
ResultSet r = ps.executeQuery();
//判断登录是否成功
if (r.next()) {
System.out.println("执行成功~");
} else {
System.out.println("执行失败~");
}
//7.释放资源
r.close();
ps.close();
coon.close();
}
}
数据库连接池
简介
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection);
- 它允许应用程序重复使用一个现有的数据库连接,而不是再进行重复创建;
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接遗漏
- 好处:
- 资源重用
- 提升系统相应速度
- 避免数据库连接遗漏
- 常用的数据库连接池:Driud
- 使用步骤:
- 导入jar包
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接
//加载配置文件 Properties prop=new Properties(); prop.load(new FileInputStream("src/druid.properties")); //获取连接池对象 DataSource dataSource=DruidDataSourceFactory.createDataSource(prop); //获取数据库连接 Connection connection=dataSource.getConnection();