Java应用中的JDBC数据库连接完全指南

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包我们当然去官网下载

https://www.mysql.com/

记得右键添加依赖。


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、数据库工具类封装
  1. 重用性: 通过封装数据库操作的方法,可以在应用程序的不同部分重用这些方法,避免重复编写相同的数据库操作代码,提高了代码的可维护性和可重用性。

  2. 降低耦合性: 封装数据库操作可以将数据库交互的细节隐藏起来,从而降低了应用程序其他部分对数据库结构和操作的依赖,减少了代码的耦合度。

  3. 简化数据库操作: 数据库工具类封装了数据库连接、执行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;
    }
}

希望本文对您有所帮助,祝您编程愉快!如果您有任何其他问题或需要进一步的帮助,请随时告诉我。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
package com.hexiang.utils.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.log4j.Logger; public class DBConnection { /** * 获得与数据库的连接 * * @param path * @return Connection */ public static Connection getConn(String classDriver, String url, String user, String pwd) { try { Class.forName(classDriver); return DriverManager.getConnection(url, user, pwd); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } return null; } public static Connection getConn(DataSource dataSource) { try { return dataSource.getConnection(); } catch (SQLException ex) { ex.printStackTrace(); } return null; } public static Connection getConn(String jndiName) { try { Context ctx; ctx = new InitialContext(); DataSource dataSource = (DataSource) ctx.lookup("java:comp/env/" + jndiName); return dataSource.getConnection(); } catch (NamingException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } return null; } public static Connection getConn(Properties properties) { try { String driver = properties.getProperty("jdbc.driverClassName"); String url = properties.getProperty("jdbc.url"); String user = properties.getProperty("jdbc.username"); String password = properties.getProperty("jdbc.password"); Class.forName(driver); return DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } return null; } /** * oracle连接 * * @param path * @return Connection */ public static Connection getOracleConn(String
要在Java实现JDBC程序,需要遵循以下步骤: 1. 加载JDBC驱动程序:使用Class.forName()方法加载数据库JDBC驱动程序。 2. 建立数据库连接:使用DriverManager.getConnection()方法建立与数据库的连接。 3. 创建Statement对象:使用Connection对象的createStatement()方法创建Statement对象。 4. 执行SQL语句:使用Statement对象的executeUpdate()或者executeQuery()方法执行SQL语句。 5. 处理结果集:如果SQL语句是查询语句,则使用ResultSet对象来处理结果集。 6. 关闭结果集、Statement对象和数据库连接:使用close()方法关闭ResultSet对象、Statement对象和Connection对象。 下面是一个简单的JDBC程序示例,该程序连接到MySQL数据库,查询并输出表的数据: ``` import java.sql.*; public class JdbcTest { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 加载MySQL驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 建立数据库连接 String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "root"; conn = DriverManager.getConnection(url, user, password); // 创建Statement对象 stmt = conn.createStatement(); // 执行查询语句 String sql = "SELECT * FROM student"; rs = stmt.executeQuery(sql); // 处理结果集 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println("id: " + id + ", name: " + name + ", age: " + age); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭结果集、Statement对象和数据库连接 try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 注意:在运行程序之前,需要先下载并安装MySQL数据库,并且需要将MySQL的JDBC驱动程序(mysql-connector-java.jar)添加到classpath

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值