文章目录
JDBC
1. JDBC概述
JDBC 就是使用Java语言操作关系型数据库的一套API
全称:( Java DataBase Connectivity ) Java 数据库连接
JDBC起源
在开发中我们使用的是java语言,而数据库却多种多样,而且每一个关系型数据库的底层实现细节都不一样,那如果在项目开发后期觉得更换数据库,那我们必须对java代码进行大量修改,为解决这个问题,sun公司就指定了一套标准接口(JDBC),JDBC中定义了所有操作关系型数据库的规则。
众所周知接口是无法直接使用的,我们需要使用接口的实现类,而这套实现类(称之为:驱动)就由各自的数据库厂商给出。(压力给到数据库公司)
JDBC特点
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包(驱动),这里给出了此接口的实现类
- Java代码不需要针对不同数据库分别开发,可随时替换底层数据库,访问数据库的Java代码基本不变
2. JDBC基础操作
基本步骤为:(后附案例)
-
创建工程,导入驱动jar包
-
注册驱动
Class.forName("com.mysql.jdbc.Driver");
-
获取连接
Connection conn = DriverManager.getConnection(url, username, pass);
Java代码需要发送SQL给MySQL服务端,就需要先建立连接
-
定义SQL语句
String sql = “update…” ;
-
获取执行SQL对象
执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象
Statement stmt = conn.createStatement();
-
执行SQL
stmt.executeUpdate(sql);
-
处理返回结果
-
释放资源
下面是一个最简单的JDBC-demo及基本步骤
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1"; //本机ip默认127.0.0.1,端口3306(可不写)
String username = "root";
String pass = "1234";
Connection conn = DriverManager.getConnection(url, username, pass);
//3. 定义sql
String sql = "update account set money = 2000 where id = 1";//写出操作
//4. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5. 执行sql
int count = stmt.executeUpdate(sql);//受影响的行数
//6. 处理结果
System.out.println(count);
//7. 释放资源
stmt.close();//后创建的先释放
conn.close();
}
}
3,JDBC API详解
3.1 DriverManager
DriverManager(驱动管理对象)作用有二:
- 注册驱动
但我们写的注册驱动语句为
Class.forName("com.mysql.jdbc.Driver");
是因为forname调用了Driver类而Driver类的静态代码块中执行了 DriverManager
对象的 registerDriver()
方法从而进行驱动的注册
- 获取数据库连接
String url = "jdbc:mysql://127.0.0.1:3306/db1"; //本机ip默认127.0.0.1,端口3306(可不写)
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
url语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
如果连接的是本地mysql服务器,并且mysql服务器默认端口是3306,则url可以简写为jdbc:mysql:///root
3.2 Connection
Connection(数据库连接对象)作用有二:
- 获取执行 SQL 的对象
- 管理事务
3.2.1 获取执行对象
-
普通执行SQL对象
Statement createStatement()
-
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
-
执行存储过程的对象(了解)
CallableStatement prepareCall(sql)
通过这种方式获取的
CallableStatement
执行对象是用来执行存储过程的,而存储过程在MySQL中不常用
3.2.2 事务管理
MySQL事务管理的操作:
- 开启事务 : BEGIN; 或者 START TRANSACTION;
- 提交事务 : COMMIT;
- 回滚事务 : ROLLBACK;
MySQL默认是自动提交事务
JDBC事务管理的方法。
Connection接口中定义了3个对应的方法:
- 开启事务
conn.setAutoCommit(false);//true表示自动提交事务,false表示手动提交事务。而开启事务需要将该参数设为为false
- 提交事务
conn.commit();
- 回滚事务
conn.rollback();
下面为事务管理的具体实现:
public class JDBCDemo3_Connection {
public static void main(String[] args) throws Exception {
//1. 注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//3. 定义sql
String sql1 = "update account set money = 3000 where id = 1";
String sql2 = "update account set money = 3000 where id = 2";
//4. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
try {
// ============开启事务==========
conn.setAutoCommit(false);
//5. 执行sql
int count1 = stmt.executeUpdate(sql1);//受影响的行数
//6. 处理结果
System.out.println(count1);
int i = 3/0;
//5. 执行sql
int count2 = stmt.executeUpdate(sql2);//受影响的行数
//6. 处理结果
System.out.println(count2);
// ============提交事务==========
//程序运行到此处,说明没有出现任何问题,则需求提交事务
conn.commit();
} catch (Exception e) {
// ============回滚事务==========
//程序在出现异常时会执行到这个地方,此时就需要回滚事务
conn.rollback();
e.printStackTrace();
}
//7. 释放资源
stmt.close();
conn.close();
}
}
3.3 Statement
Statement对象的作用就是用来执行SQL语句
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);//执行完DML语句,受影响的行数
3.4 ResultSet
3.4.1 概述
ResultSet(结果集对象)作用:
- 封装了SQL查询语句的结果。
而执行了DQL语句后就会返回该对象,对应执行DQL语句的方法如下:
ResultSet executeQuery(sql):执行DQL 语句,返回 ResultSet 对象
那么我们就需要从 ResultSet
对象中获取我们想要的数据。ResultSet
对象提供了操作查询结果数据的方法,如下:
boolean next()
- 将光标从当前位置向前移动一行
- 判断当前行是否为有效行
方法返回值说明:
- true : 有效航,当前行有数据
- false : 无效行,当前行没有数据
xxx getXxx(参数):获取数据
- xxx : 数据类型;如: int getInt(参数) ;String getString(参数)
- 参数
- int类型的参数:列的编号,从1开始
- String类型的参数: 列的名称
- .next()实现了迭代器
- getxx()实现了读取数据
while (rs.next()){
// 获取数据 getXxx()
int id = rs.getInt("id");
String name = rs.getString("name");
double money = rs.getDouble("money");
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("--------------");
}
3.6 PreparedStatement
作用: 预编译SQL语句并执行:预防SQL注入问题
对上面的作用中SQL注入问题,我单独写了一篇博客SQL注入问题
4,数据库连接池
4.1 数据库连接池简介
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处
- 资源重用(达到Connection对象的复用)
- 提升系统响应速度
- 避免数据库连接遗漏
连接池是在一开始就创建好了一些连接(Connection)对象存储起来。用户需要连接数据库时,不需要自己创建连接,而只需要从连接池中获取一个连接进行使用,使用完毕后再将连接对象归还给连接池;这样就可以起到资源重用,也节省了频繁创建连接销毁连接所花费的时间,从而提升了系统响应的速度。
4.2 数据库连接池实现
-
标准接口:DataSource
官方(SUN) 提供的数据库连接池标准接口,由第三方组织实现此接口。该接口提供了获取连接的功能:
Connection getConnection()
那么以后就不需要通过
DriverManager
对象获取Connection
对象,而是通过连接池(DataSource)获取Connection
对象。 -
常见的数据库连接池
- DBCP
- C3P0
- Druid
-
Druid(德鲁伊)
-
Druid连接池是阿里巴巴开源的数据库连接池项目
-
功能强大,性能优秀,是Java语言最好的数据库连接池之一
-
4.3 Driud使用
- 导入jar包 druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接
编写配置文件如下:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
username=root
password=1234
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
使用druid的代码如下:
public class DruidDemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3. 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
//4. 获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5. 获取数据库连接 Connection
Connection connection = dataSource.getConnection();
System.out.println(connection); //获取到了连接后就可以继续做其他操作了
//System.out.println(System.getProperty("user.dir"));
}
}