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() ;//crudpublic void crud();//关闭连接public void close();
}package com.jdbc.myjdbc;/*** mysql 数据库实现了jdbc接口 [模拟] 【mysql厂商开发】*/
public class MysqlJdbcImpl implements JdbcInterface{@Overridepublic Object getConnection() {System.out.println("得到 mysql 的连接");return null;}@Overridepublic void crud() {System.out.println("完成 mysql 增删改查");}@Overridepublic void close() {System.out.println("关闭 mysql 的连接");}
}package com.jdbc.myjdbc;/*** 模拟oracle数据库实现 jdbc*/
public class OracleJdbcImpl implements JdbcInterface {@Overridepublic Object getConnection() {System.out.println("得到 oracle的连接 升级");return null;}@Overridepublic void crud() {System.out.println("完成 对oracle的增删改查");}@Overridepublic 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@Testpublic 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@Testpublic 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 进行统一管理@Testpublic void connect03() throws IllegalAccessException, InstantiationException, ClassNotFoundException, SQLException {//使用反射加载DriverClass<?> aClass = Class.forName("com.mysql.jdbc.Driver");Driver driver = (Driver) aClass.newInstance();//创建url 和 user 和 passwordString 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 自动完成注册驱动,简化代码//这种方式获取连接是使用的最多,推荐使用@Testpublic 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 和 passwordString 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更加灵活@Testpublic 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 ? "成功" : "失败");}
}