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 ...
随机推荐
- FZU 2204 7
题意: n个有标号的球围成一个圈.每个球有两种颜色可以选择黑或白染色.问有多少种方案使得没有出现连续白球7个或连续黑球7个? 思路: 如果出现连续的8,9...个球同色,那么也必定含有7个同色.需要统 ...
- (转)SQL注入攻击简介
如果你是做Javaweb应用开发的,那么必须熟悉那声名狼藉的SQL注入式攻击.去年Sony就遭受了SQL注入攻击,被盗用了一些Sony play station(PS机)用户的数据.在SQL注入攻击里 ...
- SAP ERP和C4C Account和Contact的双向同步
Account和Contact是C4C里唯一支持可以和ERP进行双向同步的主数据类别. C4C里创建一个Account:Mouser Electronics 在C4C里保存Account,自动同步到E ...
- Android(java)学习笔记134:Android数据存储5种方式总结
1.使用文件(File)存储 存储一般的数据 2.使用sharedperference(xml) 存储设置信息.配置信息.密码 3.数据库Sqlite 开源的,嵌入式的数据库,轻量级 4.使用Cont ...
- EditPlus 3.7激活码注册码
EditPlus3.7激活教程以及EditPlus3.7激活码使用方法 EditPlus是一款功能齐全的文字编辑器,搭配其他的插件还可以实现很多的功能,还可以编辑和编译Java,调试程序等,主要用来打 ...
- windbg双机调试配置
环境 虚拟机 win7 Pro x86 vmware 12 windbg x86 虚拟机win7配置 管理员权限运行cmd.exe 然后输入以下命令: bcdedit /? bcdedit /enum ...
- JavaScript学习整理(转载)
JavaScript的学习整理(一) 目录: 1.换皮肤功能2.显示/隐藏(点击切换)3.显示/隐藏(onmouseover/onmouseout)4.选项卡5.全选/不选/反选(checkbox)6 ...
- SQL Server 游标的应用
----------------SQL游标应用----------------- 今天由于业务需求,需要在存储过程中实现有一个表的主键去匹配在另一个表中作为外键所对应的数值 ,若在C#中则非常简单只需 ...
- GCD和NSThread延时执行对比
1.NSThread: [self performSelector:@selector(performSome:) withObject:self afterDelay:.f]; [[self cla ...
- 【点分治】luoguP2664 树上游戏
应该是一道中等难度的点分?麻烦在一些细节. 题目描述 lrb有一棵树,树的每个节点有个颜色.给一个长度为n的颜色序列,定义s(i,j) 为i 到j 的颜色数量.以及 现在他想让你求出所有的sum[i] ...