一 JDBC简介
1.1 jdbc概念:
- 通过java语言来操作数据库的一套API
- 全称(Java DataBase Connectivity)
2.2 jdbc本质:
-
官方(sun公司)定义的一套操作数据库的规则,即接口
-
各个数据库厂商去实现这个接口,提供数据库驱动jar包(包含了对这个接口的实现类)
-
我们就使用这套接口(JDBC)编程,真正执行的代码是驱动包里的实现类
二 JDBC使用步骤
-
注册驱动
Class.forName("com.mysql.jdbc.Driver")
-
获取连接
Connection conn = DriverManager.getConnection(url,username,password)
-
定义sql语句
String sql = "update...."
-
获取执行sql对象
Statement stmt = conn.createStatement()
-
执行sql语句
stmt.executeUpdate(sql)
-
处理返回结果
-
释放资源
示例代码
// 在lib中添加数据库驱动 右键as library
// 1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2 获取连接
String url = "jdbc:mysql://localhost:3306/db1";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,username,password);
// 3 定义sql语句
String sql = "update account set money=money+1000 where id = 1";
// 4 获取执行sql对象
Statement stmt = conn.createStatement();
// 5 执行sql语句
int count = stmt.executeUpdate(sql);
// 6 处理返回结果
System.out.println(count);
// 7 释放资源
stmt.close();
conn.close();
三 JDBC API详解
3.1 DriverManager
-
DriverManager 驱动管理类作用:
-
注册驱动
Class.forName() 实际调用了DriverManager里的registerDriver()方法
-
获取数据库连接
参数:
- url: 连接路径(jdbc:mysql://localhost:3306/数据库名称)后可加其它参数
- 数据库用户名
- 数据库密码
-
3.2 Connection
-
Connection(数据库连接对象)作用:
-
获取执行sql的对象
-
普通执行sql对象
Statement createStatement()
-
预编译sql的执行sql对象:防止sql注入
PreparedStatement prepareStatement(sql)
-
执行存储过程的对象
CallableStatement prepareCall(sql)
-
-
管理事务
-
JDBC事务管理
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
-
-
3.3 Statement
-
Statement作用:
执行sql语句:
-
执行DML(数据操作语言)、DDL(数据定义语言)语句
int executeUpdate(sql)
返回值:受影响的行数
-
执行DQL(数据查询语言)语言
ResultSet executeQuery(sql)
返回值:ResultSet结果集对象
-
3.4 ResultSet
-
ResultSet(结果集)作用:
-
封装了DQL查询语句的结果:
ResultSet stmt.executeQuery(sql):执行查询sql语句,返回ResultSet对象
获取查询结果方法:
boolean next(): (1)将光标从当前位置向前移动一位 (2)判断当前行是否为有效行 返回值: true: 有效行,当前行有数据 False: 无效行,当前行没有数据
xxx getXXX(参数):获取数据 xxx:数据类型 如:int 对应 getInt(参数) String 对应 getString(参数) 参数: int :列的编号,从1开始 String :列的名称
-
使用步骤:
-
游标向下移动一行,并判断该行是否有数据:next()
-
获取数据:getXXX(参数)
//循环判断游标是否是最行一行末尾 while(rs.next()){ //获取数据 rs.getXXX(); }
-
-
3.5 PreparedStatement
-
PreparedStatement作用:
- 预编译sql语句并执行:预防sql注入问题
-
sql注入:
- sql注入是通过操作输入来修改事先定义好的sql语句,用以达到执行代码对服务器进行攻击的方法
- (可以理解为sql注入就相当于比如有个登录页面的输入密码框 通过一些特殊的sql脚本将你原本的验证密码的sql语句select * from where password=’"+pwd+"'拼成一个恒等式)
-
PreparedStatement使用方法:
-
获取PreparedStatement对象
//sql语句中的参数值 使用?占位符替代 String sql = "select * from user where name = ? and password = ?"; //通过Connection对象获取 并传入对应的sql语句 PreparedStatement pstmt = conn.prepareStatement(sql);
-
设置参数值
PreparedStatement对象:setXXX(参数1,参数2):给?赋值 XXX:数据类型 如 setInt(参数1,参数2) 参数: 参数1:?的位置编号,从1开始 参数2:?的值
-
执行sql
executeUpdate();/executeQuery() //无需再传入sql
-
-
PreparedStatement优点:
-
预编译sql:性能更高(创建PreparedStatement对象时已经将sql发到数据库服务器检查编译了 用?占位符,每set一次执行一次,不用像Statement检查、编译、再执行sql)
开启预编译功能需要添加:useServerPrepStmts=true到url后面
-
防止sql注入:将敏感字符加上’'进行转义
-
四 数据库连接池
4.1 数据库连接池简介
-
数据库连接池是一个负责分配、管理数据库连接的容器
(不使用连接池时 每来一个用户就要getConnection一次 及其耗时 每使用完还要再释放)
-
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
(初始定义了连接数量、最大连接数等 用户需要则提供连接 用完则还回)
-
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
-
好处:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
4.2 数据库连接池实现
-
标准接口:DataSource
-
sun公司提供的数据库连接池标准接口,由第三方组织实现此接口
-
功能:获取连接
Connection getConnection()
-
-
常见的数据库连接池:
- DBCP
- C3P0
- Druid
-
Druid(德鲁伊)
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 是Java语言最好的数据库连接池之一
4.3 Druid使用步骤
-
导入jar包
-
定义配置文件
(.properties)
-
加载配置文件
-
获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
-
获取连接
Connection coon = dataSource.getConnection();