JDBC简介
JDBC概念:
- JDBC就是使用Java语言操作关系型数据库的一套API
- 全称:(Java DataBase Connectivity)Java数据库连接
JDBC
- 官方(sun 公司)定义了一套操作所有数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据驱动jar包
JDBC的好处
- 各个数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变
JDBC 的快速入门
步骤:
-
注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");//5.0版本以后可以省略不写
-
获取连接
Connecting conn = DriverManager.getConnection(url,username,password);
-
定义SQL语句
String sql = "updata...";
-
获取执行SQL对象
Statement stmt = conn.createStatement();
-
执行SQL
stmt.executeUpdate(sql);
-
处理返回结果
-
释放资源
案例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
//JDBC 快速入门
public class Jdbc {
public static void main(String[] args) throws Exception {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");//5.0版本以后可以省略不写
//2、获取连接
String url = "jdbc:mysql:///d_students?useSSL=false&characterEncoding=utf8&serverTimezone=GMT";
String username = "root";
String password = "rootpassword";
Connection conn = DriverManager.getConnection(url, username, password);
//3、定义sql
String sql = "update s_student set age = 2000 where no = 1";
//4、获取执行SQL的对象 对象就是Statement
Statement stmt = conn.createStatement();
//5、执行sql
int count = stmt.executeUpdate(sql);//受影响的行数
//6、处理结果
System.out.println(count);
//释放资源
stmt.close();
conn.close();
}
}
JDBC API详解
API:
- DriverManager
- Connection
- Statement
- ResultSet
- PreparedStatement
DriverManager:
- DriverManager(驱动管理类) 作用:
-
注册驱动
-
获取数据库连接
static Connection getConnection(String url,String user,String password);
-
参数
-
url :连接路径
语法: jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2.... 注: 1.如果连接的是本机mysql服务器,并且MySQL服务器默认端口是3306,url可以简写为:jdbc:mysql:///数据库名称?参数键值对1&参数键值对2.... 2.配置use = false 参数,禁用安全连接方式,解决警告提示
- user: 用户名
- password: 密码
-
-
Connection:
-
Connection(数据库连接对象)作用:
-
获取执行SQL对象
-
普通执行SQL对象
Statement createStatement();
-
预编译SQL的执行SQL对象 : 防止SQL注入
PreparedStatement prepareStatement(sql);
-
执行存储过程的对象
CallableStatement prepareCall(sql);
-
-
事务管理
-
MySQL事务管理
开启事务:BEGIN;/START TRANSACTION 提交事务: COMMIT; 回滚事务:ROOLLBACK MySQL默认自动提交事务
-
JDBC事务管理:Connection接口定义了三个构造方法
开启事务:setAutoCommit(boolean autoCommit) : true为自动提交事务;false为手动提交事务,即为开启事务 提交事务:commit() 回滚事务:rollback()
-
-
Statement:
-
Statement作用:
- 执行SQL语句
-
执行SQL语句
int executeUpdate(sql):执行DML、DDL语句 -->返回值:(1)DML语句影响的行数 (2)DDL语句执行后,执行成功也可能返回 0 ResultSet executeQuery(sql): 执行DQL语句 -->返回值:ResultSet结果集合对象
ResultSet:
-
ResultSet(结果集对象)作用:
-
封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql) //执行DQL语句,返回ResultSet对象
-
获取查询结果:
boolean next() // 1.将光标从当前位置向前移动一行 // 2.判断当前行是否为有效行 -->返回值 true : 有效行;当前行有数据 false :无效行;当前行没有数据 xxx.getXxx(参数) : 获取数据 -->xxx:数据类型;如:int getInt(参数);.... -->参数: int : 列的编号,从1开始 String : 列的名称
-
ResultSet使用步骤:
-
游标向下移动一行,并判断该行否有数据
-
获取数据 getXxx(参数) //循环判断游标是否是最后一行末尾
while(rs.next()){
//获取数据
rs.getXxx(参数);
}
-
-
PreparedStatement:
- PreparedStatement
- 预编译SQL语句并执行:预防SQL注入问题
- SQL注入
- SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
SQL注入:‘or’1’='1 注入原因在于拼字符串
解决SQL注入问题:
-
PreparedStatement作用:
- 预编译SQL并执行SQL语句
-
获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代 String sql = “select * from user where username = ? and password = ?”; //通过Connection pstmt = conn。preparedStatement(sql);
-
设置参数值
PreparedStatement对象:setxxx(参数1,参数2):给?赋值 -->Xxx:数据类型;如setInt(参数1,参数2) --> 1、参数1:?的位置编码,从1开始 2、参数2:?的值
-
执行SQL
executeUpdate;/executeQuery();:不需要在传递sql
-
PreparedStatement 好处:
- 预编译SQL,性能更高
- 防止SQL注入:将敏感字符进行转义
-
PreparedStatement 预编译功能开启: useServerPrepStmts=true
-
配置MySQL执行日志(重启MySQL服务后生效)
log-output=FILE general-log=1 general_log_file="D:\mysql.log" slow-query-log=1 slow_query_log_file="D:\mysql_slow.log" long_query_time=2
数据库连接池:
-
数据库连接池简介:
- 数据库连接池是一个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重读使用一个现有数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
- 好处
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
-
数据库连接池实现:
-
标准接口: DataSource
-
官方(SUN)提供的数据库连接池标准接口,有第三方组织实现此接口
-
功能:获取连接
Connection getConnection()
-
-
常见的数据库连接池:
- DBCP
- C3P0
- Druid
-
Druid(德鲁伊)
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一
-
-
Druid使用步骤
- 导入jar包druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接