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