JDBC 学习笔记(四)—— JDBC 加载数据库驱动,获取数据库连接
1. 加载数据库驱动
通常来说,JDBC 使用 Class 类的 forName() 静态方法来加载驱动,需要输入数据库驱动代表的字符串。
例如:
加载 MySQL 驱动:
Class.forName("com.mysql.jdbc.Driver");
加载 Oracle 驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");
以及之后我 demo 使用的 SQLite 驱动
Class.forName("org.sqlite.JDBC");
这些数据库驱动的字符串,可以在数据库厂商提供的驱动(jar 包)找到,例如我使用的 SQLite:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.8.11.2</version>
</dependency>
在下面这个文件内,就存放着该驱动的字符串:
org\xerial\sqlite-jdbc\3.8.11.2\sqlite-jdbc-3.8.11.2.jar!\META-INF\services\java.sql.Driver
2. 获取数据库连接
DriverManagement 提供了一系列的方法,来获取 Connection,每一个 Connection 代表一个对数据库的物理连接:
public static Connection getConnection(String url, java.util.Properties info) throws SQLException;
public static Connection getConnection(String url, String user, String password) throws SQLException;
public static Connection getConnection(String url) throws SQLException;
对于大多数的数据而言,获取 Connection 需要数据库 URL,登陆数据库的用户和密码。
数据库的用户和密码,通常由 DBA(Database Administrator)来分配,同时需要具有登录数据库的权限。
数据库 URL 遵循如下写法:
jdbc:subprotocol:other stuff
上面的写法中,jdbc 是固定的,subprotocol 指特定的数据库驱动,而后面的 other 和 stuff 则不固定,不同的数据库写法也存在差异。
而我 demo 的 SQLite 数据库,由于只是一个很小型的数据库,所以只需要 URL 就可以获取连接:
DriverManager.getConnection("jdbc:sqlite:G:/github-workspace/jdbc/src/main/resources/db/test.db");
特定的数据库 URL 写法,在 JDBC 驱动文档中会提供。
3. 使用 properties 文件
一般来说,数据库驱动字符串,数据库连接 URL,数据库用户和密码这些信息,都不会直接在代码中写死,而是使用一个 properties 文件去存储这些信息。
例如 Hibernate, MyBatis 这些 ORM 框架都是采取了这种做法。
下面 demo 一个我写的例子:
sql.properties
driver=org.sqlite.JDBC
url=jdbc:sqlite:{0}
SqlProperties.java
package com.gerrard.util; import com.gerrard.constants.ErrorCode;
import com.gerrard.exception.JdbcSampleException;
import lombok.Getter; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Properties; @Getter
public final class SqlProperties { private static final String PROPERTIES_PATH = new File("").getAbsolutePath().replace("\\", "/") + "/src/main/resources/sql.properties";
private static final String DB_ROOT_URL = new File("").getAbsolutePath().replace("\\", "/") + "/src/main/resources/db/";
private static SqlProperties sqlProps; private static final String DB_TEST = "test.db"; private String driver;
private String url; private SqlProperties() { } public static final SqlProperties getInstance() {
if (sqlProps == null) {
try {
Properties props = new Properties();
props.load(new FileInputStream(PROPERTIES_PATH));
transferProperties(props);
} catch (IOException e) {
String errorMessage = "Fail to load properties file";
throw new JdbcSampleException(ErrorCode.LOAD_PROPERTIES_ERROR, errorMessage);
}
}
return sqlProps;
} private static void transferProperties(Properties props) {
sqlProps = new SqlProperties();
sqlProps.driver = props.getProperty("driver");
sqlProps.url = props.getProperty("url");
transferDbUrl();
} private static void transferDbUrl() {
String params[] = {DB_ROOT_URL + DB_TEST};
sqlProps.url = MessageFormat.format(sqlProps.url, params);
}
}
DriverLoader.java
package com.gerrard.util; import com.gerrard.constants.ErrorCode;
import com.gerrard.exception.JdbcSampleException; public final class DriverLoader { private DriverLoader() { } public static void loadSqliteDriver() {
try {
Class.forName(SqlProperties.getInstance().getDriver());
} catch (ClassNotFoundException e) {
throw new JdbcSampleException(ErrorCode.LOAD_DRIVER_EXCEPTION, "Fail to load sqlite driver");
}
}
}
Connertor.java
package com.gerrard.util; import com.gerrard.constants.ErrorCode;
import com.gerrard.exception.JdbcSampleException; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; public final class Connector { private Connector() { } public static Connection getSqlConnection() {
String url = SqlProperties.getInstance().getUrl();
try {
return DriverManager.getConnection(url);
} catch (SQLException e) {
String errorMessage = "Fail to get SQL connection with url " + url;
throw new JdbcSampleException(ErrorCode.GET_CONNECTION_EXCEPTION, errorMessage);
}
}
}
JDBC 学习笔记(四)—— JDBC 加载数据库驱动,获取数据库连接的更多相关文章
- jdbc 加载数据库驱动如何破坏双亲委托模式
导读 通过jdbc链接数据库,是每个学习Java web 方向的人必然一开始会写的代码,虽然现在各路框架都帮大家封装好了jdbc,但是研究一下jdbc链接的套路还是很意义 术语以及相 ...
- JDBC:加载数据库驱动、连接数据库(详细讲解)
加载数据库驱动: 1)由于Java是一个纯面向对象语言,任何事物在其中都必须抽象成类或者类对象,数据库也不例外,JDBC同样也把数据库抽象成面向对象的结构: 2)JDBC将整个数据库驱动器在底层抽象成 ...
- thinkphp学习笔记9—自动加载
原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...
- java 加载数据库驱动
JDBC编程步骤见 JDBC编程步骤 JDBC编程的第一步是加载数据库驱动,使用Class类的forName()方法,Class.forName("com.mysql.jdbc.Driver ...
- ThinkCMF项目部署出现无法加载数据库驱动解决方案
最近有个TP项目刚从从本地部署到阿里云服务器上,出现了无法加载数据库驱动的错误,提示 :( 无法加载数据库驱动: Think\Db\Driver 这里分享一下出现该错误的解决步骤: 首先记得项目部署到 ...
- JDBC学习笔记(1)——JDBC概述
JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...
- 【转】JDBC学习笔记(1)——JDBC概述
转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...
- webpack学习笔记--按需加载
为什么需要按需加载 随着互联网的发展,一个网页需要承载的功能越来越多. 对于采用单页应用作为前端架构的网站来说,会面临着一个网页需要加载的代码量很大的问题,因为许多功能都集中的做到了一个 HTML 里 ...
- JDBC加载数据库驱动的方式
JDBC作为数据库访问的规范接口,其中只是定义一些接口.具体的实现是由各个数据库厂商来完成. 一.重要的接口: 1.public interface Driver 每个驱动程序类必须实现的接口.Jav ...
随机推荐
- 使用ServiceController组件控制计算机服务
实现效果: 知识运用: ServiceController组件的MachineName属性 //获取或设置服务所驻留的计算机名称 public string MachineName{get;set;} ...
- c#和Java中的抽象类
应用场景:当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法. 比如:描述一个图形.圆形. 矩形三个类.不管哪种图形都会具备计算面积与周长的行为,但是每种图形计算的方式 ...
- jqury点击返回顶部代码
效果请看右下角:代码如下: <div class="totop"><img src="https://www.cnblogs.com/images/cn ...
- 经常用到的js函数
//获取样式 function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; }else{ retu ...
- OI杂记
从今天开始记录一下为数不多天的OI历程 8.25 上 今天举行了难得的五校联考,模拟noip,题目的解压密码竟然是$aKnoIp2o18$,对你没有看错!!! 7:50老师?啊啊啊啊,收不到题目啊,还 ...
- VMware安装Ubuntu配置NAT模式下静态IP,解决访问外网问题
安装好VMware后,打开网络连接可以看到有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两个网络适配器,VMnet1是针对桥接 ...
- python入门:CONTINUE 的作用 跳出本次循环后,重新开始循环
#!/usr/bin/env python # -*- coding:utf-8 -*- # CONTINUE 的作用 跳出本次循环后,重新开始循环 import time while True: ' ...
- thinkcmf常用标签
1.图片地址:{:cmf_get_image_url($vo.icon)} 2.模板控件 模板变量调用:$theme_vars.title <widget name="aboutUs& ...
- css3属性:美化表单、点击元素产生的背景与边框怎么去掉,滚动回弹效果
- manjaro中virtualbox(vbox)配置
一.更新源的配置: 1).自动方法: 在 终端 执行下面的arch" style="color: #002be5">命令从官方的源列表中对中国源进行测速和设置 su ...