JDBC 知识点总结篇
JDBC 接口
Java DataBase Connectivity Java数据库连接,由官方定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商实现该套接口
代码
// 本代码只提供一个样例,请根据自己实际情况修改代码
// 1.注册驱动 mySQL
Class.forname("com.mysql.jdbc.Driver");
// 2. 获取连接对象
String url = "jdbc:mysql://127.0.0.1:3306/school?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
// 3.定义SQL
String sql = "update stu set math = 2000 where id = 1";
// 4. 获取执行sql的对象
Statement stmt = conn.createStatement();
// 5.执行sql
int count = stmt.executeUpdate(sql);
// 6.处理结果
// 7.释放资源
// 如果开启了ResultSet,需要优先释放ResultSet资源
stmt.close();
conn.close();
实现步骤
-
创建工程,导入驱动jar包,例如:
-
注册驱动
Class.forname("com.mysql.jdbc.Driver");
-
获取连接
// url:地址 username:用户名 password:密码 Connection conn = DriverManager.getConnection(url, username, password);
-
定义SQL语句
String sql = "update ...";
-
获取执行SQL对象
Statement stmt = conn.createStatement();
-
执行SQL
stmt.executeUpdate(sql);
-
处理返回结果
-
释放资源:先释放执行资源stmt,再释放conn
DriverManager(驱动管理类)
该类中都是静态方法,forname方法传参时会直接调用里面静态代码块,直接拉起MySQL数据库驱动。
小细节:在MySQL 5以后的jar包,不需要写注册驱动的方法,因为在导入的jar包中的META-INF文件夹下的services中的java.sql.Driver中加入了驱动类的名称。
作用
- 注册驱动
- 获取数据库连接
获取连接补充说明
// url:连接路径
// 语法:jdbc:mysql://ip地址(域名):端口/数据库名称?参数键值对1&参数键值对2...
// 示例:jdbc:mysql://127.0.0.1:3306/school
// 细节:如果连接的是本机mysql服务器,并且mysql服务端口默认是3306,则url可以简写为jdbc:mysql:///数据库名称?参数键值对
// 配置useSSL=false参数,禁用安全连接方式,解决警告提示
Connection 类
与特定数据库连接(会话)。执行SQL语句并在连接的上下文中返回结果。
作用
-
获取执行SQL的对象
普通执行SQL对象
Statement createStatement();
预编译SQL执行SQL对象:防止SQL注入:后面进行补充
PreparedStatement prepareStatement(sql);
执行存储过程的对象
CallableStatement prepareCall(sql);
-
管理事务
JDBC事务管理:Connection接口中定义了3个对应的方法
// 开启事务:true为自动提交事务;false为手动提交事务,即为开启事务 setAutoCommit(boolean autoCommit) // 提交事务 commit() // 回滚事务 rollback()
Statement 类
作用
- 执行SQL语句
int executeUpdate(sql): //执行DML、DDL语句 // 返回值:(1)DML语句影响的行数、(2)DDL语句执行后,执行成功也可能返回0 ResultSet executeQuery(sql): //执行SQL语句 // 返回值:ResultSet结果集对象,ResultSet类在后详细介绍
ResultSet 类
ResultSet(结果集对象)作用:
封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql): //执行DQL语句,返回ResultSet对象
获取查询结果
boolean next():
//(1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行
// 返回值当中存在一个光标,会进行拨动,最上面是表头,往下面走,有数据则有效
// 返回值:
// true:有效行,当前行有数据
// false:无效行,当前行没有数据
xxx getXxx(参数): // 获取数据
// xxx:数据类型;如:int getInt(参数);String getString(参数)
// 参数
// int:列的编号,从1开始
// String:列的名称
使用方法
/**
使用步骤:
1.游标向下移动一行,并判断该行是否有数据:next()
2.获取数据:getXxx(参数)
*/
// 循环判断游标游标是否是最后一行末尾
while(rs.next()){
//获取数据
rs.getXxx(参数);
}
PreparedStatement 类补充
在之前讲述Connection类中,我们引入了PreparedStatement 类,该类可以预防SQL注入的问题。其作用是预编译SQL并执行SQL。
SQl注入
通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法,例子如下:
select * from user where username = '"name+"' and password = '"+pwd+"';
# 假设存在了一个登录情况,我在密码中填入 'or '1' = '1 ,这个时候无论用户名是什么,我都将登录系统
预防SQL注入
-
获取PrearedStatement对象
// SQL语句中的参数值,使用?占位符替代 String sql = "select * from user where username=? and password =?"; // 通过Connection对象获取,并传入对应的sql语句 PreparedStatement pstmt = conn.prepareStatement(sql);
-
设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值 Xxx:数据类型; 如setInt(参数1,参数2) 参数: 参数1:?的位置编号,从1开始 参数2:?的值
-
执行SQL
executeUpdate();/executeQuery(); //不需要再传递sql
优势
-
预编译SQL,性能更高
-
PreparedStatement预编译功能开启:useServerPrepStmts=True 默认关闭状态
-
配置MySQL执行日志(重启mysql服务后生效)
log-output=FILE general-log=1 general_log_fil e="D:\mysql.log" slow-query-log=1 slow_query_log_file="D:\mysql_slow.log" long_query_time=2
-
在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译
-
执行时就不用再进行这些步骤,速度得以加快
-
如果sql模板一样,则只需要进行一次检查、编译
-
-
放置SQL注入:将敏感字符进行转义
// 通过'\'的方式转义字符 or 1 = 1 <=> '\' or \'1\' = \'1'
数据库连接池
与大名鼎鼎的线程池相类似,数据库连接池是一个放置计算资源的池子(容器),负责分配、管理数据库连接(Connection)
优势
-
资源重用:不需要反复创建和关闭数据库连接,允许应用程序重复使用现有的数据库连接
-
提升系统的响应速度
-
避免数据连接遗漏:释放超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
数据库连接池实现
标准接口: DataSource
-
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。
-
功能:获取连接
Connection getConnection()
-
常见的数据库连接池
- DBCP
- C3P0
- Druid(德鲁伊)
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,最好的数据库连接池之一
Druid使用步骤
-
导入jar包 druid-1.1.12.jar
-
定义配置文件
# ../src/druid.properties driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///school?useSSL=false&useServerPrepStmts=true username=root password=1234 #初始化连接数量 initialSize=5 #最大连接数 maxActive=10 #最大等待时间 maxWait=3000
-
加载配置文件
//根据下一个步骤所使用的资源来决定方法 Properties prop new Properties(); prop.Load(new FileInputstream("src/druid.properties"));
-
获取数据库连接池对象
DataSource dataSource DruidDataSourceFactory.createDataSource(prop);
-
获取连接
Connection connection dataSource.getConnection();
写代码小技巧(IDEA)
Alt + 鼠标左键: 整列编辑
写数据库代码时,尽量使用Integer: int会带上初始值为0,因此建议使用数据包装类型
如果觉得有帮助,请帮我点个赞或者收藏,感谢~