目录
c. 通过给定的输入流对象读取properties文件并解析
前言
本文来讲解,如何获取Java与MySQL的连接以及如何优化数据库的连接并且JDBC的工具类
文章详解,通俗易懂,旨在帮助读者更好的理解和掌握JDBC数据库连接
个人主页:主页
一. 将MySQL对应版本的jar包放入Java项目中
1. 准备工作
jar:数据库驱动
如果要和数据库通信,就要借助数据库驱动。数据库驱动本质上是一组 Java 类
先在官网下载对应的MySQL的jar包
这里用MySQL5.7版本来演示
可以先通过cmd里,输入mysql --help 来找到自己的MySQL版本
看这个表格,找到自己jdk版本对应的jar,再到官网里下载
jar包官网传送门:官网
MySQL 版本 | 推荐的 MySQL Connector/J 版本 |
---|---|
5.1 | 5.1.x |
5.5 | 5.1.x、5.2.x |
5.6 | 5.1.x、5.2.x、5.6.x |
5.7 | 5.1.x、5.2.x、5.6.x、5.7.x |
8.0 | 5.1.x、5.2.x、5.6.x、5.7.x、8.0.x |
5.7版本的,我是下载的5.1.48版本jar包
2. 复制到Java项目
复制对应的jar包
新建一个java项目
新建一个lib目录
单击lib,复制到lib目录
确定后,这个jar包只是放在目录里
现在就要开始将这个变成一个库
右击jar包 ---> 添加到库
这样就可以获取里面的类了
二. 获取数据库连接
1. 连接Mysql数据库的URL
URL格式:jdbc:mysql://[主机名]:[端口号]/[数据库名]?[参数名]=[参数值]
注:每个数据库的写法不一样,这里以MySQL为例
// 连接Mysql数据库的URL
// localhost 代表本机
// 如果没有修改端口号的话,MySQL默认是3360
// YiBeiGen 是数据库名字
String url = "jdbc:mysql//localhosost:3360/YiBeiGen"
2. 连接数据库的用户名
String name = "root";
3. 连接数据库的密码
连接数据库的密码
String passward = "8383";
4. 通过反射实例化
Class.forName("com.mysql.jdbc.Driver");
这里是要理解的,为什么要反射实例化?
就是因为通过这个反射来加载这个Driver类,目的是为了出发static块
先来看看Driver类
5. 通过DriverManager对象获取数据库的连接对象
// 三个参数分别是
// 1. 连接Mysql数据库的URL
// 2. 连接数据库的用户名
// 3. 连接数据库的密码
// 我们在上面都实现过
Connection connection = DriverManager.getConnection(url, name, pwd);
完整代码
public class JdbcTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 连接Mysql数据库的URL
String url = "jdbc:mysql://localhost:3306/YiBeiGen";
// 连接数据库的用户名
String name = "root";
// 连接数据库的密码
String pwd = "8383";
// 通过反射实现数据库驱动的加载与注册
// 通过反射实例化
// 添加数据库驱动的目的是翻译要执行的sql语句
// 只是加载这个类,目的是为了触发static块
// 那么Driver类已经实例化出来了,并且放到了DriverManager当中
Class.forName("com.mysql.jdbc.Driver");
// 通过DriverManager对象获取数据库的连接对象
Connection connection = DriverManager.getConnection(url, name, pwd);
System.out.println(connection);
}
}
输出结果类似这样没有报错就可以
如果报错了,就先检查密码以及数据库名称是否和MySQL的一致
如果一致都还报错,那么就可以在“连接数据库的URL”中再添加一个 “?useSSL=false"
url = "jdbc:mysql://localhost:3306/YiBeiGen?useSSL=false";
三. Properties文件用法
先讲作用:因为用刚刚这种原始的代码写,会出现一个问题,就是硬编码
硬编码:对于可变的内容,写死在代码中,就像刚刚的那个连接数据库的代码,就是一个死的,它的数据库库名字,连接数据库的URL以及密码都是写死的,这就是硬编码
硬编码的缺点就是,后序如果是另一个人用的这个代码,就要修改源代码,这就很麻烦
那么为了解决这个硬编码问题,就可以通过Properties文件来解决
property的英文意思:属性
1. properties文件介绍
后缀properties的文件是一种属性文件。这种文件以key=value格式存储内容
Java中可以使用Properties工具类来读取这个文件
项目中会将一些配置信息放到properties文件中,所以properties文件经常作为配置文件来使用
2. Properties工具类
Properties工具类,位于java.util包中,该工具类继承自Hashtable<Object,Object>
通过Properties工具类可以读取.properties类型的配置文件
Properties工具类中常用方法
a. load( InputStream is )
load英文意思:加载
通过给定的输入流对象读取properties文件并解析
b. getProperty( String key )
根据key获取对应的value
3. 新建Properties文件
右击包 ---> 新建 ---> 文件
在新建文件对话中,新建文件名字
注意:名字可以随意(最好见名知意),扩展名一定要是properties,扩展名都是小写!
4. 解决文件中文问题
我们创建好这个文件后,就可以在里面些内容了
但是因为文件默认编码的原因,里面写不了中文
如果要能写中文就要先做以下操作
a. 打开Idea的设置
a. 编辑器 ---> 文件编码 ---> 将编码改成GBK编码
修改成GBK中文编码就可以了
5. properties文件写法
这里我创建一个名为:test.properties 的文件
#号是注释
# 欢迎来到艺杯羹的阵地
key1 = 艺杯羹
key2 = LY
四. 使用properties文件优化连接
1. 基本操作
-
PropertiesTest:属性测试
-
class:类
-
getClassLoader:获取类加载器
-
getResourceAsStream:获取资源作为流
a. 实例化Properties对象
Properties prop = new Proerties();
b. 获取读取properties文件的输入流对象
-
PropertiesTest:属性测试
-
class:类
-
getClassLoader:获取类加载器
-
getResourceAsStream:获取资源作为流
InputStream is = PropertiesTest.class.getClassLoader().getResourceAsStream("test.properties");
c. 通过给定的输入流对象读取properties文件并解析
prop.load(is);
d. 获取properties文件中的内容
String value1 = prop.getProperty("key1");
String value2 = prop.getProperty("key2");
System.out.println(value1+" "+value2);
就能够得到key对应的value值
2. 优化获取数据库连接
将连接数据库时所需要的信息存放到properties文件中,可以解决硬编码的问题
所以可以将这些可变的内容,抽取出来放在一个文件中
之后获取数据时,就从文件里获取不就好了
本次就是使用properties文件来优化硬编码问题
可以将以下四处写入properties文件中
a. properties文件内容
#连接Mysql数据库的URL
#jdbc:mysql://连接主机:端口号/数据库名
url=jdbc:mysql://localhost:3306/student
#连接数据库的用户名
username=root
#连接数据库的密码
pwd=3057454077
#数据库驱动名称
driver=com.mysql.jdbc.Driver
b. 获取连接
public class Student {
public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
// 实例化Properties对象
Properties prop = new Properties();
// 获取读取properties文件的字节输入流对象
InputStream is = JdbcTest2.class.getClassLoader().getResourceAsStream("jdbc.properties");
// 读取properties文件并解析
prop.load(is);
// 获取连接数据库的url
String url = prop.getProperty("url");
// 获取连接数据库的用户名
String name = prop.getProperty("username");
// 获取连接数据库的密码
String pwd = prop.getProperty("pwd");
// 获取数据库驱动全名
String drivername = prop.getProperty("driver");
// 加载并注册驱动,获得DriverManager
Class.forName(drivername);
// 通过驱动管理器对象获取连接对象
Connection connection = DriverManager.getConnection(url, name, pwd);
System.out.println(connection);
}
}
五. 封装JDBC工具类
经过刚刚的学习,JDBC一次性的创建连接还是有点麻烦的,那么可以将这个连接的方法封装成一个JDBC工具类,这样之后用就能得心应手了,不会一遍又一遍的去做重复的连接
封装的工具类有两个要求要注意的
工具方法一般定义成静态的
因为直接可以通过类名点方法,这样就更快速,更好
工具类的方法不要抛出异常,直接try - catch因为增强健壮来统一处理
JdbcUtil工具类
public class JdbcUtils {
private static String url;
private static String name;
private static String pwd;
static {
try{
// 实例化Properties对象
Properties prop = new Properties();
// 获取读取properties文件的字节输入流对象
InputStream is = JdbcTest2.class.getClassLoader().getResourceAsStream("jdbc.properties");
// 读取properties文件并解析
prop.load(is);
// 获取连接数据库的url
url = prop.getProperty("url");
// 获取连接数据库的用户名
name = prop.getProperty("username");
// 获取连接数据库的密码
pwd = prop.getProperty("pwd");
// 获取数据库驱动全名
String drivername = prop.getProperty("driver");
// 加载并注册驱动
Class.forName(drivername);
}catch(Exception e){
e.printStackTrace();
}
}
// 获取数据库连接对象
public static Connection getConnection(){
Connection connection = null;
try {
connection = DriverManager.getConnection(url,name,pwd);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
// 关闭连接对象
public static void closeConnection(Connection connection){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// 提交事务
public static void commit(Connection connection){
try {
connection.commit();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// 事务回滚
public static void rollback(Connection connection){
try {
connection.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// 关闭Statement对象
public static void closeStatement(Statement statement){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// 关闭ResultSet
public static void closeResultSet(ResultSet resultSet) {
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// DML操作时关闭资源
public static void closeResource(Statement statement,Connection connection){
// 先关闭Statement对象
// 刚刚写的方法
closeStatement(statement);
//在关闭Connection对象
closeConnection(connection);
}
// 查询时关闭资源
public static void closeResource(ResultSet resultSet,Statement statement,Connection connection){
// 先关闭ResultSet
closeResultSet(resultSet);
// 再闭Statement对象
closeStatement(statement);
// 最后关闭Connection对象
closeConnection(connection);
}
}
为什么要将Properties的操作放在静态块中?
因为Properties文件是一开始就要使用的,那么只有静态块最符合他,当使用了这个类时,最先是执行Properties文件,先获取Properties文件中的值,这样就可以更好的创建连接
这里除了连接数据库的方法,还写出了提交事务、事务回滚、关闭等操作,这些在之后都是会用到的,所以先按这个方法封装一个JDBC工具类
到现在已经讲解完了JDBC获取数据库连接的方法和properties的使用以及JDBC封装的工具类
希望本文能够帮助到你😊