JDBC编程
什么是JDBC? JDBC(Java Database Connection)为Java开发者 使用数据库提供了统一的编程接口 ,它由一组Java类和接口组成(主要在java sql,javax sql包中)。是Java程序与数据库系统通信的标准API。JDBC API 使得开发人员可以使用纯java的方式来连接数据库,并执行操作。JDBC这套接口的实现,称为 数据库驱动 ,由各个数据库厂商提供。
文章图片
为什么要使用JDBC?
- 市面上有非常多的数据库,本来我们是需要根据不同的数据库学习不同的API,sun公司为了简化这个操作,定义了JDBC API【接口】
- sun公司只是提供了JDBC API,数据库厂商负责实现。
- 对于我们来说,操作数据库都是在JDBC API【接口】上,使用不同的数据库,只要用数据库厂商提供的数据库驱动程序。
文章图片
JDBC优势:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的
- API 程序的可移植性大大增强
- 各个数据库厂商的提供的,对Sun公司提出的Connection等JDBC接口的实现。
- 装载驱动
- Mysql Class.forName("com.mysql.jdbc.Driver");
- Oracle Class.forName("oracle.jdbc.driver.OracleDriver")
- JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。
- 当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面
- 然后我们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。
Connection接口与特定数据库的连接,在连接上下文中执行SQL语句并返回结果.
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
- 通过DriverManger (驱动管理类)的静态方法获取:
文章图片
- 通过DataSource(数据源)对象获取,实际应用中会使用DataSoucre对象
文章图片
DriverManger 和DataSource的区别:
Statement 对象数据库连接池,基于享元模式,在初始化的时候就创建多个连接,每次使用完再还原。(所有的使用者共享资源,不用每次都创建资源,以提高效率)
- DriverManger 类来获取的Connection连接,是无法重新利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接
- DataSource提供连接池支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以进行复用的。每次使用完数据库连接,释放资源调用connection.close()都是将Connection连接对象回收。(回收会重置connection对象的属性)
用于执行静态的SQL语句并返回它锁生成的结果的对象。
三种Statement类:
文章图片
一般使用PreparedStatement对象。
PreparedStatement对象特点:
- 参数化SQL查询——把占位符用参数替换
- 性能比Statement高
- 会进行SQL预编译
- 阻止常见SQL注入攻击
- 占位符下标从1开始
- 占位符不能使用多值
- executeQuery() 方法执行后返回单个结果集的,通常用于select语句
- executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
- Statement 执行 SQL 语句时返回 ResultSet 结果集 。
- ResultSet 提供的检索不同类型字段的方法,常用的有 :
- getString() : 获得在数据库里的varchar、char等数据类型的对象。
- getFloat(): 获得杂数据库里是 Float 类型的对象。
- getDate(): 获得在数据库里面是Date类型的数据。
- getBoolean(): 获得在数据库里面是 Boolean 类型的数据。
- 创建数据库连接Connection
- 创建操作命令Statement
- 使用操作命令来执行SQL
- 处理结果集ResultSet——查询操作需要进行结果集的处理
- 释放资源——反向释放资源(关闭结果集、命令、连接)
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {//1.
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//2.
Class.forName("com.mysql.jdbc.Driver");
//获取与数据库连接的对象-Connetcion
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
//获取执行sql语句的statement对象
statement = connection.createStatement();
//执行sql语句,拿到结果集
resultSet = statement.executeQuery("SELECT * FROM users");
//遍历结果集,得到数据
while (resultSet.next()) {System.out.println(resultSet.getString(1));
System.out.println(resultSet.getString(2));
}} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {//反向关闭结果集if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}}}
JDBC常见面试题???????
【MySQL|JDBC编程】
推荐阅读
- MYSQL|Java中的JDBC编程
- mysql|JDBC 数据库编程
- mysql|mysql索引和事务
- 笔记|MySQL(JDBC编程)
- mysql|初始JDBC 编程
- Docker|Docker容器数据卷详解
- Docker学习记录|关于Docker你不知道的那些事之Docker容器数据卷
- docker|docker部署mysql并挂载数据卷
- 青龙|解决青龙面板白屏问题记录