记一次关于JDBC-Oracle配置的坑

1 什么是JDBC

  • JDBC(Java DataBase Connectivity,java 数据库连接),是JavaEE 平台下的一个技术规范
  • 它定义了Java 访问数据库的API、执行SQL 语句的标准
  • 可以为多种关系数据库提供统一访问

2. 关于数据库驱动

  • 数据库驱动是数据库厂商对JDBC 规范的具体实现的封装
  • 不同数据库产品的驱动名称、URL协议写法均有差异
  • 在程序中对数据库的操作都必须依赖数据库驱动来完成

3. JDBC的配置

JDBC编程过程中,必不可少的配置就是配置JDBC访问数据库的4大关键配置:Driver、URL、username和password。但是,由于市场上有很多中数据库厂商的数据库产品,各个厂商的数据库驱动又存在着差异,所以在配置过程中需格外注意找准数据库的驱动程序,尤其是url的写法。
我在完成一个项目的过程中,由于数据库使用的是Oracle,在本地和测试环境上运行良好,但是在正式环境中,项目一启动总是报错:“ORA-01017: invalid username/password; logon denied”,检查是否用户名、密码等配置出错了,经过多次检查都没配置错;为了排除有空格等其他不可见字符,使用其他的Oracle客户端用同样的用户名密码登录,结果成功,原因何在?!
着实让人抓狂,无奈翻开了《Java核心技术(卷二)》-5.3.1,赫然写着“在连接数据库时,我们必须使用各种与数据库类型相关的参数,例如主机名、端口号和数据库名”。难道URL配置出错了???那还得取问问各个数据库厂商?!经过查阅,Oracle数据库配置有SID和Service Name和TNSName几种种方式的配置,从9i之后由于并行计算和并发等性能的提高,推荐使用Service Name的方式提供服务。
下面着重记录下市场上常见的数据库URL写法:

Oracle

Oracle数据库的URL写法(用thin模式):
格式一:jdbc:oracle:thin:@//<host>:<port>/<service_name>
格式二:jdbc:oracle:thin:@<host>:<port>:<SID>
格式三:jdbc:oracle:thin:@<TNSName>
造成前文中我出现的问题,用格式一配置了SID方式访问数据库,哎,C!

MySQL

格式:jdbc:mysql://<host>:<port>/<db_name>

MariaDB

格式:jdbc:maria://<host>:<port>/<db_name>

MS SQL Server

  • 使用驱动msbase.jar、mssqlserver.jar、msutil.jar:
    格式一:jdbc:microsoft:sqlserver://<host>:<port>;DatabaseName=<db_name>
  • 使用驱动jtds-1.2.jar:
    格式二:jdbc:jtds:sqlserver://<host>:<port>/<db_name>;s=8.0;lastupdatecount=true

Sysbase

格式一:jdbc:Sysbase://<host>:<port>/<db_name>
格式二:jdbc:sybase:Tds:<host>:<port>/<db_name>

PostgreSQL

格式:jdbc:postgresql://<host>:<port>/<db_name>

DB2

格式:jdbc:db2://<host>:<port>/<db_name>

Informix

格式:jdbc:Informix-sqli://<host>:<port>/<db_name>:INFORMIXSER=myserver

附:JDBC-ODBC

Driver:sun.jdbc.odbc.JdbcOdbcDriver
url:jdbc:odbc:<dbSourceName>

4.JDBC编程步骤(MySQL为例)

public static final String URL = "jdbc:mysql://localhost:3306/test";
public static final String USER = "mysql";
public static final String PASS = "123456";

public static void main(String[] args) throws Exception {
	// 1.加载驱动程序
	Class.forName("com.mysql.jdbc.Driver");
	// 2. 获得数据库连接
	Connection conn = DriverManager.getConnection(URL, USER, PASS);
	// 3.操作数据库,实现增删改查
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM t_users");
	// 4.遍历结果集
	// 如果有数据,rs.next()返回true
	while (rs.next()) {
	     System.out.println(rs.getString("user_name") + " 年龄:" + rs.getInt("age"));
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值