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

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

开发一个访问数据库的应用程序,首先要加载数据库的驱动程序,只需要在第一次访问数据库时加载一次,然后每次运行时创建一个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
目录
相关文章
|
14天前
|
存储 Go API
使用GoFrame连接和操作TDengine时序数据库
通过使用GoFrame框架和TDengine Go驱动,我们可以方便地连接和操作TDengine时序数据库。无论是插入、查询还是分析时序数据,都可以通过简单的API调用来实现。GoFrame提供了强大的Web开发功能,结合TDengine的高性能时序数据存储和查询能力,可以构建高效、可扩展的时序数据应用。
|
12天前
|
NoSQL 关系型数据库 PHP
php连接数据库
要使用PHP连接PolarDB或MongoDB数据库,需先准备连接信息,并编写相应代码。对于PolarDB,需设置主机地址、端口、数据库名及凭据,使用`pg_connect`函数建立连接;而对于MongoDB副本集,需安装MongoDB PHP驱动,通过`MongoDB\Client`连接指定的副本集实例。请确保替换示例代码中的占位符为实际值,并正确配置副本集名称和主机信息。更多详细信息与示例代码,请参考相关链接。
120 72
|
18天前
|
SQL Java 数据库连接
Java开发者必知:JDBC连接数据库的“三大法宝”
Java开发者必知:JDBC连接数据库的“三大法宝”
16 7
|
16天前
|
数据采集 存储 前端开发
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
|
24天前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
18天前
|
SQL 数据库 开发者
|
18天前
|
存储 SQL 数据库
自连接:数据库查询中的镜像技术
【8月更文挑战第31天】
9 0
|
20天前
|
安全 Java API
Java 8 流库的魔法革命:Filter、Map、FlatMap 和 Optional 如何颠覆编程世界!
【8月更文挑战第29天】Java 8 的 Stream API 通过 Filter、Map、FlatMap 和 Optional 等操作,提供了高效、简洁的数据集合处理方式。Filter 用于筛选符合条件的元素;Map 对元素进行转换;FlatMap 将多个流扁平化合并;Optional 安全处理空值。这些操作结合使用,能够显著提升代码的可读性和简洁性,使数据处理更为高效和便捷。
28 0
|
存储 消息中间件 缓存
面试疑难点解析——Java数据库开发(一)
阿里云再offer 5000人,数据库人才求贤若渴!7月9日 19:00,阿里云数据库事业部的两位技术大咖在线直招10多个岗位,想要进入阿里云吗?快来投递简历吧:https://developer.aliyun.com/special/offerday01
面试疑难点解析——Java数据库开发(一)
|
NoSQL Java 关系型数据库
面试疑难点解析——Java数据库开发(七)
本文介绍事务处理的四个特性:ACID,以及开发中可能见到的事务处理模式。