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

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

时间:2024-03-23 18:31:12浏览次数:25  
标签:JDBC Java String 数据库 static 连接 连接池

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;
    }
}

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

标签:JDBC,Java,String,数据库,static,连接,连接池
From: https://blog.csdn.net/qq_55482652/article/details/136965136

相关文章

  • 数据库语句问题
    Mysql中表student_table(id,name,birth,sex),查询张姓、李姓的学生总人数,错误的是()? Aselectsum(casewhennamelike'张%'then1else0end)aszhang_first_name,sum(casewhennamelike'李%'then1else0end)asli_first_namefromstudent_table;Bs......
  • JAVA高级面向对象二:多态下的类型转换问题
     packagecom.itheima.多态;publicclassTest{//多态好处publicstaticvoidmain(String[]args){////好处1:实现解耦合,右边对象可以随时切换,后续业务随即改变//Peoplep1=newTeacher();//p1.run();////好处2:可以使用父......
  • 项目第一个问题关于数据库链接
    项目安装SQLserver2022数据库,在安装完数据库后,使用官方数据库链接软件(SSMS)可以正常链接上数据库。但是使用visualstudio2019自带的数据库链接工具却链接不上在与SQLServer建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正......
  • JAVA非阻塞IO、异步IO(NIO、AIO)-摘自《netty权威指南》
    一、JAVANIO在介绍NIO编程之前,我们首先需要澄清一个概念:NIO到底是什么的简称?有人称之为NewI/O,因为它相对于之前的I/O类库是新增的,所以被称为NewI/O,这是它的官方叫法。但是,由于之前老的I/O类库是阻塞I/O,NewI/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻......
  • JAVA高级面向对象二:认识多态 多态的好处
    1.多态:在继承/实现情况下的一种现象,表现为对象多态(儿子,学生),行为多态(跑的快慢)方法编译看左边,运行看右边  变量编译看左边,运行看左边 packagecom.itheima.多态;publicclassTest{//对象多态,行为多态publicstaticvoidmain(String[]args){//1.对象......
  • 第十三届蓝桥杯省赛真题 Java C 组【原卷】
    文章目录发现宝藏【考生须知】试题A:排列字母试题B:特殊时间试题C:纸张尺寸试题D:求和试题E:\mathbf{E}:......
  • 【附源码】java数字家谱管理系统(ssm毕业设计+maven+vue+计算机专业)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义标题:数字家谱管理系统的选题背景及其意义随着信息技术的快速发展,数字化已经成为现代社会的一种趋势。在传统文化的传承与保护方面,数字技术的应用尤为重要。家谱作......
  • 【附源码】java双端的在线学习考试平台(ssm毕业设计+maven+vue+计算机专业)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在信息技术日益发展的今天,教育行业也在经历着前所未有的变革。传统的面对面教学模式逐渐向线上教育模式转变,这一趋势在全球范围内愈发明显。尤其是在全球......
  • Web漏洞--数据库注入
    数据库注入Access、mysql、mssql、mongDB、postgresql、sqlite、oracle、sybase等#上节课JSON注入案例分析天池大数据众智平台-阿里云天池所以json注入时要在1、2、3上面去注入#简要学习各种数据库的注入特点数据库架构组成,数据库高权限操作Access是低等级的数据库,依......
  • Error: Could not find or load main class org.apache.hadoop.hbase.util.GetJavaPro
    Hbase没有将其自身的依赖包添加到classpath配置路径所以才会导致找不到自身主类的报错vim/usr/local/hbase/bin/hbase 在161行出修改CLASSPATH="${HBASE_CONF_DIR}"CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar:/usr/local/hbase/lib/*修改成功后,不再报错......