JDBC简介
JDBC就是使用Java语言操作关系型数据库的一套API
JDBC快速入门
1.注册驱动
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取连接
//2.获取连接
String url = "jdbc:mysql://localhost:3306/scraping";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
3.定义sql语句
//3.定义sql
String sql = "update user set money = 2000 where id = 1";
4.获取执行sql的对象 Statement
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
5.执行sql
//5.执行sql
int count = stmt.executeUpdate(sql);//受影响的行数
6.处理结果
//6.处理结果
System.out.println(count);
7.释放资源
//7.释放资源
stmt.close();
conn.close();
API详解
DriverManager
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
-
查看 Driver 类源代码
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
-
MySQL 5之后的驱动包,可以省略注册驱动的步骤
2.获取连接
static Connection getConnection(String url, String user, String password)
-
参数
1.url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
示例:jdbc:mysql://127.0.0.1:3306/db1
细节:
- 如果连接的是本机mysql服务器,并默认端口是3306,则url可以简写成:jdbc:mysql:///数据库名称?参数键值对
- 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
2.user:用户名
3.password:密码
Connection
1.获取执行 SQL 的对象
-
普通执行SQL对象
Statement createStatement()
-
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
-
执行存储过程的对象(不常用)
CallableStatement prepareCall(sql)
2.事务管理
-
MySQL 事务管理
开启事务:BEGIN;/START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MySQL默认自动提交事务
-
JDBC 事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交;false为手动提交,即开启事务
提交事务:commit()
回滚事务:rollback()
可以结合trycatch使用。
Statement
1.执行SQL语句
int executeUpdate(sql):执行DML、DDL语句(修改语句)
返回值:
(1) DML语句影响的行数
(2) DDL语句执行后,执行成功也可能返回0
ResultSet executeQuery(sql): 执行DQL语句
返回值:ResultSet 结果集对象
ResultSet-结果集对象
1.封装了DQL查询语句的结果
ResultSet executeQuery(sql): 执行DQL语句,返回ResultSet结果集对象
获取查询结果
boolean next():
(1)将光标向下移动一行
(2)判断当前行是否为有效行
返回值:
- true:有效行,当前行有数据
- false:无效行,当前行没有数据
xxx getXxx(参数):获取数据
- xxx:数据类型;如:int getInt(参数);String gerString(参数)
- 参数:
- int:列的编号,从1开始
- String:列的名称
2.使用步骤
1.游标向下移动一行,并判断该行是否有数据:next()
2.获取数据:getXxx(参数)
//循环判断游标是否是最后一行末尾
while(rs.next()){
//获取数据
rs.getXxx(参数);
}
PreparedStatement
-
作用:预编译SQL语句并执行:预防SQL注入问题
-
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
SQL注入演示
需求:完成用户登录
select * from tb_user where username = 'zhangsan' and password = '123';
定义sql语句时,使用了拼接字符串
所以传入的密码是以下时:
String pwd = "' or '1' = '1";
会修改sql语句的意思
String sql = "select * from tb_user where username = '" + name + "' and password = '" + pwd + "'";
预编译SQL语句并执行SQL语句
1.获取PreparedStatement 对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
//通过Connection对象获取,并传入对应的sql语句,这里传入了sql语句,所以下面不需要在传递sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
2.设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
- Xxx:数据类型;如setInt(参数1,参数2)
- 参数:
参数1:?的位置编号,从1开始
参数2:?的值
//设置?的值
pstmt.setString(1, name);
pstmt.setString(2, pwd);
3.执行SQL
executeUpdate();/executeQuery();:不需要再传递sql
PreparedStatement 原理
好处:1.预编译SQL,性能更高;2.防止SQL注入:将敏感字符进行转义
-
PreparedStatement 预编译功能开启:useServerPrepStmts=true
String url = "jdbc:mysql:///scraping?useSSL=false&userServerPrepStmts=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
-
原理:
-
在获取PreparedStatement对象时,将sql语句发送到mysql服务器进行检查,编译(这步耗时)
-
执行时就不用再进行这些步骤了,速度很快
-
如果sql模板一样,则只需要进行一次检查、编译
-
数据库连接池
数据库连接池简介
-
数据库连接池是一个容器,负责分配、管理数据库连接(Connection)
-
允许应用程序重复使用一个现有的数据库连接,而不是重新创建一个
-
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库数据遗漏
意思是:一个用户占用连接而不进行操作时间过长,将会将连接进行释放
-
好处
-
资源重用
-
提升系统响应速度
-
避免数据库连接遗漏
-
数据库连接池实现
-
标准接口:DataSource
-
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
-
功能:获取连接
Connection getConnection()
-
-
常见的数据库连接池
-
DBCP
-
C3P0
-
Druid
-
-
Driud(德鲁伊)
-
Driud连接池是阿里巴巴开源的数据库连接池项目
-
功能强大,性能优秀,是Java语言最好的数据库连接池之一
-
Driud使用步骤
-
导入jar包 druid-1.1.12jar
-
定义配置文件
-
加载配置文件
-
获取数据库连接池对象
-
获取连接