本文全文参考 https://www.bilibili.com/video/BV12b411K7Zu
二.演示完整步骤
2.1 准备工作
- 导入JDBC依赖
2.2 加载并注册驱动
- 1.
Class.forName( )
- 因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用
DriverManager.registerDriver()
方法来注册自身的一个实例,所以可以换一种方式来加载驱动。(即只要想办法让驱动类的这段静态代码块执行即可注册驱动类,而要让这段静态代码块执行,只要让该类被类加载器加载即可)
- 调用
Class
类的静态方法forName()
,向其传递要加载的 JDBC 驱动的类名
//通过反射,加载与注册驱动类,解耦合(不直接依赖)
Class.forName("com.mysql.jdbc.Driver");
- 2.
服务提供者框架(例如:JDBC的驱动程序)自动注册
2.3 获取数据库连接
- 可以通过
DriverManager
类建立到数据库的连接Connection: DriverManager
试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序。
public static Connection getConnection(String url)
public static Connection getConnection(String url,String user, String password)
public static Connection getConnection(String url,Properties info)其中Properties info通常至少应该包括 "user" 和 "password" 属性
- JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。JDBC URL的标准由三部分组成,各部分间用冒号分隔。
- jdbc:<子协议>:<子名称>
- 协议:JDBC URL中的协议总是jdbc
- 子协议:子协议用于标识一个数据库驱动程序
- 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息
- MySQL的连接URL编写方式:
- jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
- jdbc:mysql://localhost:3306/testdb
- jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
- jdbc:mysql://localhost:3306/testdb?user=root&password=123456
2.4 操作或访问数据库
- 数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果。
- 其实一个数据库连接就是一个Socket连接。
- 在
java.sql
包中有 3 个接口分别定义了对数据库的调用的不同方式:Statement
:用于执行静态 SQL 语句并返回它所生成结果的对象。PrepatedStatement
:SQL 语句被预编译并存储在此对象中,然后可以使用此对象多次高效地执行该语句。CallableStatement
:用于执行 SQL 存储过程
Statement
- 通过调用
Connection
对象的createStatement()
方法创建该对象 - 该对象用于执行静态的 SQL 语句,并且返回执行结果
Statement
接口中定义了下列方法用于执行 SQL 语句:int excuteUpdate(String sql)
:执行更新操作INSERT、UPDATE、DELETEResultSet excuteQuery(String sql)
:执行查询操作SELECT
ResultSet
- 通过调用
Statement
对象的excuteQuery()
方法创建该对象 ResultSet
对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet
接口由数据库厂商实现ResultSet
对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过ResultSet
对象的next()
方- 法移动到下一行ResultSet
接口的常用方法:boolean next()
getXxx(String columnLabel)
:columnLabel使用 SQL AS 子句指定的列标签。如果未指定 SQL AS 子句,则标签是列名称getXxx(int index)
:索引从1开始- …
增删改查示例代码:
public class TestConnection {
//增删改
@Test
public void testUpdate() throws Exception {
//步骤1:注册驱动(为了让mysql的实现类加载到内存可以使用)
// DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//步骤2:获取连接
Properties properties = new Properties();//配置文件要求里面必须有连接参数和配置参数
properties.load(new FileInputStream("src\\druid.properties"));
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
Connection connection = ds.getConnection();
//步骤3:执行增删改查操作
//①获取执行sql语句的命令对象
Statement statement = connection.createStatement();
//②执行sql语句
// statement.executeQuery(sql);//执行查询语句
// statement.executeUpdate(sql)//执行增删改语法,返回受影响行数
// statement.execute(sql)//执行任何sql语句
int update = statement.executeUpdate("delete from admin where id =1");
//③处理结果
System.out.println(update>0?"成功":"失败");
//步骤4:关闭连接(释放资源)
statement.close();
connection.close();
}
//查询
@Test
public void testQuery() throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Properties pro = new Properties();
pro.load(new FileInputStream("src\\druid.properties"));
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
Connection connection = ds.getConnection();
//3.执行查询
//①获取执行sql的命令对象
Statement statement = connection.createStatement();
//②执行sql
ResultSet set = statement.executeQuery("select name bname,sex gender,borndate born from beauty");
while(set.next()) {
String name = set.getString("bname");
char gender = set.getString("gender").charAt(0);
Date date = set.getDate("born");
// String date = set.getString("born");
System.out.println(name+"\t"+gender+"\t"+date);
}
//4.关闭
set.close();
statement.close();
connection.close();
}
}
2.5 释放资源
Connection
、Statement
、ResultSet
都是应用程序和数据库服务器的连接资源,使用后一定要关闭,可以在finally
中关闭- 演示未关闭后果:
import java.sql.Connection;
import java.sql.DriverManager;
public class TestConnectionClose {
public static void main(String[] args) throws Exception{
//1、加载与注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
String url = "jdbc:mysql://localhost:3306/test";
//my.ini中max_connections=10
for (int i = 0; i < 15; i++) {
Connection conn = DriverManager.getConnection(url,"root", "123456");
System.out.println(conn);
//没有关闭,资源一直没有释放
}
}
}