JAVA访问数据库之连接数据库

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

开发一个访问数据库的应用程序,首先要加载数据库的驱动程序,只需要在第一次访问数据库时加载一次,然后每次运行时创建一个Connection实例,紧接着执行操作数据库的SQL语句,并处理返回的结果集,最后在完成完成此次操作时销毁前面创建的Connection,释放与数据库的连接。

加载数据库驱动

在连接数据库之前,首先要把JDBC驱动类加载到java虚拟机,可以使用java.lang.Class类的静态方法forName(String className)。成功加载后会将加载的驱动类注册给DriverManager类,加载失败将抛出ClassNotFoundException异常。

创建数据库连接

DriverManager类跟踪已注册的驱动程序,通过调用DriverManager类的静态方法getConnection(String url, String user, String password)可以建立与数据库的连接。3个参数依次为欲连接的数据库的路径、用户名和密码,方法返回值类型为java.sql.Connection。当调用该方法时,会搜索整个驱动程序列表,直到找到一个能够连接至数据连接字符串中指定的数据库的驱动程序为止。

执行SQL语句,得到结果集

当数据库连接建立以后,就可以使用该连接创建Statement实例,并将SQL语句传递给它所连接的数据库,并返回类型为ResultSet的对象(查询的时候),Statement实例分为3种类型:

  • Statement实例:该类型的实例只能用来执行静态的SQL
  • PreparedStatement实例:该类型的实例可以执行动态的SQL
  • CallableStatement实例:该类型的实例可以执行数据库的存储过程

处理查询结果

对于返回的结果集,使用ResultSet对象的next()方法将光标指向下一行。最初光标位于第一行之前,因此第一次调用next()方法将光标置于第一行上,如果到达结果集的末尾,则ResultSet的next()方法会返回false,方法getXXX提供了获取当前行中某一列的值的途径,列名或列号可用于标识要从中获取数据的列。

连接示例

为了方便操作,这里我选用H2数据库,这样电脑上没有安装数据库的朋友也可以快速的构建程序,H2数据库的官网地址为:
http://www.h2database.com/html/main.html

H2是一个短小精干的嵌入式数据库引擎,主要的特性包括:
1. 免费、开源、快速
2. 嵌入式的数据库服务器,支持集群
3. 提供JDBC、ODBC访问接口,提供基于浏览器的控制台管理程序
4. Java编写,可使用GCJ和IKVM.NET编译
5. 短小精干的软件,1M左右

如电脑上已经安装了数据库,直接使用对应数据库厂商提供的驱动包即可,操作过程一致。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCConnectDemo
{
   public static void main(String[] args)
   {
      // 加载数据库驱动
      try
      {
         Class.forName("org.h2.Driver");
      }
      catch (ClassNotFoundException e)
      {
         System.out.println("加载数据库驱动失败...");
         return;
      }
      // 初始化数据库,方便运行加的这一段代码,实际开发中,数据库应该是初始化好的,如果已存在数据库,请将该段代码注释掉,无需执行
      try
      {
         initDataBase();
      }
      catch (SQLException e1)
      {
         System.out.println("数据库表初始化失败驱动失败...");
         return;
      }
      Connection conn = null;
      Statement statement = null;
      ResultSet resultSet = null;
      try
      {
         // 获得数据库连接
         conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
         statement = conn.createStatement();
         resultSet = statement
               .executeQuery("SELECT USER_ID, USER_NAME FROM USER_INFO");
         System.out.printf("%20s %50s\n", "USER_ID", "USER_NAME");
         // 遍历结果集
         while (resultSet.next())
         {
            System.out.printf("%20s %50s\n", resultSet.getString("USER_ID"),
                  resultSet.getString("USER_NAME"));
         }
      }
      catch (SQLException e)
      {
         System.out.println("出现异常...");
      }
      finally
      {
         // 释放资源
         if (resultSet != null)
         {
            try
            {
               resultSet.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
         if (statement != null)
         {
            try
            {
               statement.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
         if (conn != null)
         {
            try
            {
               conn.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
      }
   }

   /**
    * 初始化数据库
    * 
    * @throws SQLException
    */
   private static void initDataBase() throws SQLException
   {
      Connection conn = null;
      Statement statement = null;
      try
      {
         // 获得数据库连接
         conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
         // 创建一张表
         String sql = "CREATE TABLE IF NOT EXISTS USER_INFO (USER_ID VARCHAR(20) PRIMARY KEY, USER_NAME VARCHAR(50))";
         statement = conn.createStatement();
         statement.executeUpdate(sql);
      }
      catch (SQLException e)
      {
         throw e;
      }
      finally
      {
         if (statement != null)
         {
            try
            {
               statement.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
         if (conn != null)
         {
            try
            {
               conn.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
      }
   }
}

常用数据库驱动类及连接字符串

数据库 驱动类 连接字符串
Oracle oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@[IP]:[PORT]:[SID]
DB2 com.ibm.db2.jdbc.app.DB2Driver jdbc:db2://[IP]:[PORT]/[databaseName]
Sql Server com.microsoft.jdbc.sqlserver.SQLServerDriver jdbc:microsoft:sqlserver://[IP]:[PORT];databaseName=[databaseName]
Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:[IP]:[PORT]/databaseName
MySQL com.mysql.jdbc.Driver jdbc:mysql://[IP]:[PORT]/databaseName

其中[]为需要替换的部分。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
9天前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
34 5
|
18天前
|
Java API Apache
|
21天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
34 3
|
21天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
39 2
|
21天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
43 2
|
21天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
22 1
|
21天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
34 1
|
5月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
4月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
66 0
|
SQL Java 数据库连接
JAVA中jdbc连接数据库 sql注入与PrepareStatement预处理
JAVA中jdbc连接数据库 sql注入与PrepareStatement预处理
198 0
下一篇
无影云桌面