JDBC
概念
jdbc就是使用java语言操作关系型数据库的一套API
全程(Java database connectivity)java数据库连接
本质
官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
好处
各个数据库厂商使用相同的接口,Java代码不需要针对不同的数据库分别开发
可随时替代底层数据库,访问数据库的Java代码基本不变
//0.导入jar包
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver"); //这一行可以不写
//会自动加载jar包中的META-INF/services/java.sql.Driver文件夹中的驱动类
//2.获取连接
Connection conn = DriverManager.getConnection(URL, user, pwd);
//3.定义SQL语句
String Sql = "select ....";
//4.获取执行SQL对象
Statement stmt = conn.createStatement();
//5.执行SQL
stmt.executeUpdate(Sql);//返回受影响行数
//6.释放资源
stmt.close();
conn.close();
DriverManager
(驱动管理类)作用:
1.注册驱动
2.获取数据库连接
获取连接
Connection conn = DriverManager.getConnection(URL, user, pwd);
URL:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
实例:jdbc:mysql://127.0.0.1:3306/db1
细节:
如果连接的是本机mysql服务器,并且服务器默认端口号是3306,则url可以简写为:jdbc:mysql://数据库名称?参数键值对
配置useSSL=false 参数,禁用安全连接方式,解决警告提示
user:用户名
pwd:密码
Connection
事务
(数据库连接对象)作用:
1.获取执行SQL的对象
2.管理事务
JDBC事务管理:Connection接口中定义了3个对应的方法
开起事务:setAutoCommit(boolean autoCommit):true为自动提交事务,false为手动提交事务,即为开起事务
提交事务:commit()
回滚事务:rollback()
try{
//开启事务
conn.setAutoCommit(false);
int count1 = stmt.executeUpdate(sql1);
int count2 = stmt.executeUpdata(sql2);
//提交事务
conn.commit();
}catch(Exception throwables){
//回滚事务
conn.rollback();
throwables.printStackTrace();
}
Statement
作用
执行SQL语句
1.int executeUpdate(sql):执行DML、DDL语句
返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
2.ResultSet executeQuery(sql):执行DQL语句
返回值:ResultSet结果集对象
ResultSet
封装了DQL查询语句的结果
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
//ResultSet.TYPE_SCROLL_SENSITIVE,该常量控制记录指针可以自由移动(可滚动结果集),而且底层数据的改变会影响 ResultSet 的内容。
//ResultSet.CONCUR_UPDATABLE,该常量指示 ResultSet 是可更新的并发模式。
// stmt.executeQuery("mysql语句");
ResultSet re = stmt.executeQuery("select * from Information;");
// 结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等.
// re.next();将数据库游标向前移动一位,使得下一行成为当前行,最开始数据库游标位于最前面
// re.previous();将数据库游标向后移动一位,使得上一行成为当前行
// re.updateString(,);第一个参数可以是某一列的索引,第一列为1...,可以是某一列的列名,第二个参数代表新的值
// re.updateRow();执行完上面代码后数据库数据并不会改变,需要运用此方法更新当前记录集当前行的数据
// re.first();将当前行定位到数据库记录集的第一行
// re.last();和first()方法相反
// re.absolute(int row);将记录集中的某一行设定为当前行,row为目标行的行号,绝对行号
// re.relative(int rows);和上面方法一样,这里的rows为相对于当前行的行号
re.next();
re.getString("Zhanghao"); //返回这一行中的zhanghao字段的内容
preparedStatement
作用:
1.预编译SQL语句并执行:防止SQL注入问题
SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
sql注入
select * from tb_user where username = 'asfa' and password ='' or '1' = '1'; -- 输入的密码为 ' or '1' = '1
//获取prepareStatement对象
String sql = "select *.....";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.PreparedStatement(sql);
executeUpdate()/executeQuery(); //不需要再传递sql
防止sql注入
//接受用户输入 用户名和密码
String name = "asfaf";
String pwd = "sfa";
//定义sql
String sql = "select * from tb_user where username = ? and password = ?";
//获取pstmt对象
PreparedStatement pstmt = conn.PreparedStatement(sql);
//设置?的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行sql
ResultSet rs = pstmt.executeQuery();
//判断登录是否成功
if(rs.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
conn.prepareStatement和conn.createStatement区别:
prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。(在url里加useServerPrepStmts=true)
createStatement不会初始化,没有预处理,没次都是从0开始执行SQL
数据库连接池
简介
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:
资源重用
提升系统响应速度
避免数据库连接遗漏
数据库连接池实现
标准接口:DataSource
官方(sun)提供的数据库连接池标准接口,由第三方组织实现此接口
功能:获取连接
Connection getConnection()
常见的数据库连接池:
DBCP
C3P0
Druid
Druid(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀,是Java语言最好的数据库连接池之一
package Druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
/**
* Druid数据库连接池演示
*/
public class Druid_demo {
public static void main(String[] args) throws Exception{
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("D:/java/jsp/src/druid.properties"));
//4.获取连接池对象
DataSource dataSource= DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接
Connection connection = dataSource.getConnection();
System.out.print(connection);
}
}
配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useServerPrepStmts=true
username=root
password=
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
on);
}
}
配置文件
```properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useServerPrepStmts=true
username=root
password=
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000