JDBC的基本介绍
JDBC即Java DataBase Connectivity(Java数据库连接),是Java语言访问数据库的一种标准方法。JDBC提供了一组API,用于连接不同类型的数据库并执行SQL语句,以便与数据库进行交互。
JDBC API包括两部分:一是JDBC驱动程序API,它提供了连接数据库、执行SQL查询和更新语句、处理结果集等功能;二是JDBC管理器API,它提供了管理驱动程序、连接池和数据源等功能。
JDBC连接数据库的基本步骤如下:
-
加载JDBC驱动程序。
-
建立连接。
-
创建Statement对象(但是一般不会使用Statement,因为Statement会存在sql注入的问题)
-
执行SQL语句。
-
处理结果集。
-
关闭连接。
JDBC有两种类型的驱动程序:基于JDBC-ODBC桥的驱动程序和本地协议驱动程序。基于JDBC-ODBC桥的驱动程序通过ODBC驱动程序连接数据库,而本地协议驱动程序通过网络连接数据库。
JDBC连接池是一组连接对象的缓存,可以有效地提高应用程序对数据库的访问性能。JDBC数据源是连接池的管理器,它负责提供连接、管理连接池和维护连接的状态。
代码演示:
package com.jdbc.myjdbc;
/**
* 我们规定的jdbc接口(方法)
*/
public interface JdbcInterface {
//连接
public Object getConnection() ;
//crud
public void crud();
//关闭连接
public void close();
}
package com.jdbc.myjdbc;
/**
* mysql 数据库实现了jdbc接口 [模拟] 【mysql厂商开发】
*/
public class MysqlJdbcImpl implements JdbcInterface{
@Override
public Object getConnection() {
System.out.println("得到 mysql 的连接");
return null;
}
@Override
public void crud() {
System.out.println("完成 mysql 增删改查");
}
@Override
public void close() {
System.out.println("关闭 mysql 的连接");
}
}
package com.jdbc.myjdbc;
/**
* 模拟oracle数据库实现 jdbc
*/
public class OracleJdbcImpl implements JdbcInterface {
@Override
public Object getConnection() {
System.out.println("得到 oracle的连接 升级");
return null;
}
@Override
public void crud() {
System.out.println("完成 对oracle的增删改查");
}
@Override
public void close() {
System.out.println("关闭 oracle的连接");
}
}
package com.jdbc.myjdbc;
public class TestJDBC {
public static void main(String[] args) throws Exception {
//完成对mysql的操作
JdbcInterface jdbcInterface = new MysqlJdbcImpl();
jdbcInterface.getConnection(); //通过接口来调用实现类[动态绑定]
jdbcInterface.crud();
jdbcInterface.close();
//完成对oracle的操作
System.out.println("==============================");
jdbcInterface = new OracleJdbcImpl();
jdbcInterface.getConnection(); //通过接口来调用实现类[动态绑定]
jdbcInterface.crud();
jdbcInterface.close();
}
}
JDBC的好处
-
平台无关性:JDBC屏蔽了具体数据库的实现细节,使得Java应用程序可以轻松访问任何支持JDBC标准的关系型数据库,同时避免了针对不同数据库实现的不同代码编写的麻烦。
-
安全性:JDBC提供了一种安全的方法来访问和操作数据库。Java SE平台提供了各种机制来保护应用程序和数据,比如访问控制和代码签名等。
-
高性能:JDBC支持连接池,连接池可以缓存一些已经连接的数据库连接,这样可以避免重复连接数据库所消耗的时间和资源,提高了数据库的访问效率和应用程序的性能。
-
可扩展性:JDBC提供了灵活的API,可以扩展和定制实现,以支持更多的数据库功能和特性。
-
成熟稳定:JDBC是Java SE平台的一部分,经过多年发展和实践,已经成为Java应用程序与数据库交互的标准和最佳实践之一。
JDBC程序编写步骤
1.注册驱动 - 加载Driver 类
2获取连接 - 得到Connection
3.执行增删改查 - 发送SQL 给mysql执行
4.释放资源 - 关闭相关连接
代码演示:
package com.jdbc;
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 第一个jdbc程序 完成体验的操作
*/
public class Jdbc01 {
public static void main(String[] args) throws SQLException {
//前置工作: 在项目下创建一个文件夹比如 libs
// 将 mysql.jar 拷贝到该目录下,点击 add to project ..加入到项目中
//1. 注册驱动
Driver driver = new Driver(); //创建driver对象
//2. 得到连接
// 解读
//(1) jdbc:mysql:// 规定好表示协议,通过jdbc的方式连接mysql
//(2) localhost 主机,可以是ip地址
//(3) 3306 表示mysql监听的端口
//(4) hsp_db02 连接到mysql dbms 的哪个数据库
//(5) mysql的连接本质就是前面学过的socket连接
String url = "jdbc:mysql://localhost:3306/hsp_db02";
//将 用户名和密码放入到Properties 对象
Properties properties = new Properties();
//说明 user 和 password 是规定好,后面的值根据实际情况写
properties.setProperty("user", "root");// 用户
properties.setProperty("password", "yjw"); //密码
Connection connect = driver.connect(url, properties);
//3. 执行sql
//String sql = "insert into actor values(null, '刘德华', '男', '1970-11-11', '110')";
//一定要注意是不是sql语句中 的一个逗号写成了中文的逗号
//String sql = "update actor set name='周星驰' where id = 1";
String sql = "delete from actor where id = 1";
//statement 用于执行静态SQL语句并返回其生成的结果的对象
Statement statement = connect.createStatement();
int rows = statement.executeUpdate(sql); // 如果是 dml语句,返回的就是影响行数
System.out.println(rows > 0 ? "成功" : "失败");
//4. 关闭连接资源
statement.close();
connect.close();
}
}
获取数据库连接的五种方式
代码演示:
package com.jdbc;
import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
/**
* 分析java 连接mysql的5中方式
*/
public class JdbcConn {
//方式1
@Test
public void connect01() throws SQLException {
Driver driver = new Driver(); //创建driver对象
String url = "jdbc:mysql://localhost:3306/hsp_db02";
//将 用户名和密码放入到Properties 对象
Properties properties = new Properties();
//说明 user 和 password 是规定好,后面的值根据实际情况写
properties.setProperty("user", "root");// 用户
properties.setProperty("password", "yjw"); //密码
Connection connect = driver.connect(url, properties);
System.out.println(connect);
}
//方式2
@Test
public void connect02() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
//使用反射加载Driver类 , 动态加载,更加的灵活,减少依赖性
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
String url = "jdbc:mysql://localhost:3306/hsp_db02";
//将 用户名和密码放入到Properties 对象
Properties properties = new Properties();
//说明 user 和 password 是规定好,后面的值根据实际情况写
properties.setProperty("user", "root");// 用户
properties.setProperty("password", "yjw"); //密码
Connection connect = driver.connect(url, properties);
System.out.println("方式2=" + connect);
}
//方式3 使用DriverManager 替代 driver 进行统一管理
@Test
public void connect03() throws IllegalAccessException, InstantiationException, ClassNotFoundException, SQLException {
//使用反射加载Driver
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
//创建url 和 user 和 password
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "yjw";
DriverManager.registerDriver(driver);//注册Driver驱动
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("第三种方式=" + connection);
}
//方式4: 使用Class.forName 自动完成注册驱动,简化代码
//这种方式获取连接是使用的最多,推荐使用
@Test
public void connect04() throws ClassNotFoundException, SQLException {
//使用反射加载了 Driver类
//在加载 Driver类时,完成注册
/*
源码: 1. 静态代码块,在类加载时,会执行一次.
2. DriverManager.registerDriver(new Driver());
3. 因此注册driver的工作已经完成
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
*/
Class.forName("com.mysql.jdbc.Driver");
//创建url 和 user 和 password
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "yjw";
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("第4种方式~ " + connection);
}
//方式5 , 在方式4的基础上改进,增加配置文件,让连接mysql更加灵活
@Test
public void connect05() throws IOException, ClassNotFoundException, SQLException {
//通过Properties对象获取配置文件的信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
Class.forName(driver);//建议写上
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式5 " + connection);
}
}
练习
代码演示:
要求:
1.创建 news 表
2.使用jdbc 添加 5条数据
3.修改id = 1的记录,将content 改成 一个新的消息
4.删除id = 3 的记录
package com.jdbc;
import com.mysql.jdbc.Driver;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/*
1.创建 news 表
2.使用jdbc 添加 5条数据
3.修改id = 1的记录,将content 改成 一个新的消息
4.删除id = 3 的记录
*/
public class JdbcTest {
public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
//使用properties 读取配置文件信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\Tsetmysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
Class.forName(driver);
//String sql="create table news (id int , content varchar(32))";
//String sql = "insert into news values(5,'a')";
//String sql = "delete from news where id = 5";
String sql = "update news set content = 'b' where id = 1";
Connection connection = DriverManager.getConnection(url, properties);
Statement statement = connection.createStatement();
int rows = statement.executeUpdate(sql);
System.out.println(rows > 0 ? "成功" : "失败");
}
}