前言
本文来讲解,如何获取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封装的工具类
希望本文能够帮助到你😊