1、简介
1.1介绍JDBC连接数据库的重要性
是Java平台中用于连接和操作数据库的标准API。它的重要性体现在以下几个方面
跨平台性: JDBC允许Java应用程序与各种数据库进行通信,而无需关心底层数据库系统的具体细节
实时连接: 通过JDBC,Java应用程序可以实时连接到数据库,从而实现动态数据存取、更新和处理
数据操作能力: JDBC为开发人员提供了一种灵活的方式来执行SQL查询、更新数据库内容、和执行存储过程等操作
安全性: JDBC通过提供连接池、安全认证等机制,有助于确保数据库连接的安全性。
1.2、定义基本术语
JDBC全称(Java Database Connectivity): Java数据库连接,是用于执行SQL语句并与数据库交互的Java API
驱动程序(Driver): 用于连接Java应用程序和特定数据库的软件组件,它使得Java应用程序可以与数据库通信
数据库URL(Uniform Resource Locator): 用于指定连接到数据库的位置的字符串。它包括数据库服务器的地址、端口和数据库的名称等信息。
连接(Connection): 表示Java应用程序与数据库之间的通信管道。通过连接,可以发送SQL语句给数据库,执行查询并接收结果。
语句(Statement): 用于向数据库发送SQL语句的对象。它可以执行查询(查询语句)或更新数据库内容(更新语句)。
结果集(Result Set): 代表从数据库中检索的数据集。它包含了SQL查询的结果,可以在Java应用程序中进行处理和操作。
了解以上基本术语对接下来学习有很大的帮助。
2、JDBC基础
2.1JDBC是什么?
是Java平台的一个标准API,用于通过Java编程语言连接和操作数据库。它提供了一种方法,使得Java应用程序可以与各种不同的关系型数据库系统进行通信。
2.2、JDBC的工作原理
Java应用程序通过使用JDBC API来请求连接、发送SQL语句、执行数据库操作,并获取结果。
JDBC使用标准接口,使得Java应用程序能够与不同的数据库系统进行交互,而无需针对每种数据库编写特定的代码。
2.3、JDBC与ODBC的区别
JDBC是Java平台上的API,而ODBC(Open Database Connectivity)是Windows平台上的API
需要特定的驱动程序。
3、基本操作过程
3.1、六大步骤
A.通过反射加载驱动
B.获取连接对象
C.根据连接对象获取执行sql的对象
D.向数据库发送sql指令
E.获取结果集
F.关闭资源
3.2、数据库建立
3.3、配置数据库驱动程序
创建一个java项目,导入jar包,置于jar包我们当然去官网下载
记得右键添加依赖。
3.4、设置连接参数建立连接
Statement和PreparedStatement的区别:
编译:
Statement: 每次执行SQL语句时,都需要将SQL语句编译一次。这可能会导致性能上的一些损失。
PreparedStatement: 在第一次执行SQL语句时,就将其编译好,然后可以多次重复使用。这种预编译的方式可以提高性能。安全性:
Statement: 使用Statement执行SQL时,需要手动处理输入参数的转义和注入问题,存在安全▍
3.4.1、使用Statement
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//定义接收用户输入和用户名和密码
String uname="张三";
String upwd="123";
//1:注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2:获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?charsetEncoding=utf-8", "root", "123456");
//3.获取Statement对象
Statement statement = connection.createStatement();
//4:定义sql
String sql ="select *from login where uname='"+uname+"'and upwd='"+upwd+"'";
//5.执行sql
ResultSet resultSet = statement.executeQuery(sql);
//5处理结果集
if (resultSet.next()){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
//6.释放资源
connection.close();
statement.close();
resultSet.close();
}
}
3.4.2、使用PreparedStatement
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//定义接收用户输入和用户名和密码
String uname="张三";
String upwd="123";
//1:注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2:获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?charsetEncoding=utf-8", "root", "123456");
//3:定义sql
String sql ="select *from login where uname=? and upwd=? ";
//4.获取prepareStatement对象
PreparedStatement ps = connection.prepareStatement(sql);
//设置参数
ps.setString(1,uname);
ps.setString(2,upwd);
//6.执行sql
ResultSet resultSet = ps.executeQuery();
//7处理结果集
if (resultSet.next()){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
//6.释放资源
connection.close();
ps.close();
resultSet.close();
}
}
3.4.3、ResultSet方法
方法名 | 方法描述 |
---|---|
boolean next() throws SQLException; | 判断是否有下一行 |
rs.getString("索引") | 根据数据库列 索引获取数据(索引是从1开始) |
rs.getString("列名") | 根据数据库列表获取数据 |
//发送指令 获取结果集
ResultSet rs = sta.executeQuery(sql);
//使用循环获取数据
while (rs.next()) {
//根据索引获取
// int uid = rs.getInt(1);
// String uname = rs.getString(2);
// String upwd = rs.getString(3);
//System.out.println(uid+"\t"+uname+"\t"+upwd);
//根据表名获取
int uid = rs.getInt("uid");
String uname = rs.getString("uname");
String upwd = rs.getString("upwd");
System.out.println(uid+"\t"+uname+"\t"+upwd);}
3.4.4、数据库工具类封装
-
重用性: 通过封装数据库操作的方法,可以在应用程序的不同部分重用这些方法,避免重复编写相同的数据库操作代码,提高了代码的可维护性和可重用性。
-
降低耦合性: 封装数据库操作可以将数据库交互的细节隐藏起来,从而降低了应用程序其他部分对数据库结构和操作的依赖,减少了代码的耦合度。
-
简化数据库操作: 数据库工具类封装了数据库连接、执行SQL语句、处理结果集等操作,使得在应用程序中使用数据库变得更加简单和直观。
代码
第一种方式
这里需要用到静态代码块,因为驱动是只加载一次就可以.
/*
* 封装获取连接工具
*/
public class JDBCUtil {
// 声明连接
private static Connection connection;
// 注册驱动
static{
try {
// 只注册一次
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
// 直接抛个运行时异常
throw new RuntimeException("注册驱动失败");
}
}
// 私有化构造方法
private JDBCUtil1() {
}
// 获取连接方法
public static Connection getConnection(){
// 数据库地址
String url = "jdbc:mysql://localhost:3306/login?charsetEncoding=utf-8";
// 数据库账号
String user = "root";
// 数据库密码
String password = "123456";
// 获取连接
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
// 直接抛个运行时异常
throw new RuntimeException("数据库连接失败");
}
return connection;
}
// 关闭资源
public static void myClose(Connection connection, ResultSet resultSet,Statement statement){
// 关闭资源
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (resultSet != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
第二种方式
使用从文本读入的方式,环境变了,更改地址用户密码等直接从文本更改.
注意:文本只能创建在src文件夹下
properties文件
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=123456
url=jdbc:mysql:///java2207?serverTimezone=Asia/Shanghai
maxWait=60000
initialSize=100
maxActive=200
minIdle=10
工具类
public class DBUtils {
private static final Properties PROPERTIES = new Properties();
private static DataSource dataSource = null;
static {
try {
PROPERTIES.load(DBUtils.class.getResourceAsStream("/db.properties"));
dataSource = DruidDataSourceFactory.createDataSource(PROPERTIES);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource() {
return dataSource;
}
}
4、连接池的使用
4.1、引言
性能提升: 连接池可以预先建立一组数据库连接并将其保存在池中,这样当应用程序需要时可以直接获取连接,避免了频繁地创建和断开数据库连接,从而显著提升了数据库访问的性能。
资源管理: 连接池管理连接的生命周期,确保连接的合理分配和释放,避免了因连接未正确关闭而导致的资源泄露问题。
并发处理: 连接池可以限制应用程序同时使用的连接数,从而在高并发情况下控制对数据库的访问,防止数据库被过多的连接请求所淹没。
连接重用: 连接池能够重用已经建立的连接,减少了每次请求时创建连接和进行身份验证的开销,有效地减少了系统负载。
连接的健康检查: 连接池可以周期性地检查已有连接的健康状况,确保连接的可用性,一旦发现异常连接可以进行关闭或重新初始化。
灵活性: 连接池提供了调整连接数目、超时配置、闲置连接的回收等配置选项,使得可以灵活地针对不同的应用场景进行优化。
4.2、常见的连接池
A.DBCP:效率高 安全性低 tomcat服务器使用的连接池就是DBCP
2.c3p0 安全性高 效率低 spring的全家桶 使用连接池就是c3p0
3.druid:阿里 支持高并发的连接池
4.3、Durid连接池
我们演示druid连接池
4.3.1、相关配置文件
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=123456
url=jdbc:mysql:///java2207?serverTimezone=Asia/Shanghai
maxWait=60000
initialSize=100
maxActive=200
minIdle=10
4.3.2、工具类代码
public class DBUtils {
private static final Properties PROPERTIES = new Properties();
private static DataSource dataSource = null;
static {
try {
PROPERTIES.load(DBUtils.class.getResourceAsStream("/db.properties"));
dataSource = DruidDataSourceFactory.createDataSource(PROPERTIES);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource() {
return dataSource;
}
}
希望本文对您有所帮助,祝您编程愉快!如果您有任何其他问题或需要进一步的帮助,请随时告诉我。
标签:JDBC,Java,String,数据库,static,连接,连接池 From: https://blog.csdn.net/qq_55482652/article/details/136965136