JDBCUtils工具类代码的实现和一些常见问题的总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: JDBCUtils工具类代码的实现和一些常见问题的总结

JDBCUtils工具类


1.前言


最近在学习Java操作MySQL数据库,一般的步骤为:

1.注册数据库驱动

2.获取数据库连接对象 Connection

3.定义和编写sql语句

4.获取执行sql语句的对象 Statement

5.执行sql,接受返回结果

6.处理结果

7.释放资源


每写一个操作数据库的类时都需要对有以上的步骤,像注册数据库驱动、获取数据库连接对象 Connection和释放资源这三个步骤都会写到。为了简化代码和更加灵活地应对各种变化,需要编写一个工具类来处理这些重复的步骤。因此,我结合网上的教程,编写了抽取注册数据库驱动、获取数据库连接对象 Connection和释放资源这三个功能的JDBCUtils工具类


2.代码实现


2.1.首先在Project的src目录下创建一个名为“jdbc.properties”的配置文件,如图1,注意到要是src目录下,否则会出错;在src目录下创建一个名为“util”的package,在util下创建JDBCUtils.java. 如图2所示:

20190826115055336.png


配置文件内容:

jdbc.properties

//数据库路径
url=jdbc:mysql:///lzm?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
//用户名
user=root
//密码
password=root
//数据库驱动
driver=com.mysql.jdbc.Driver`

有了配置文件以后,要是数据库路径、用户名、密码或驱动发生了变更,则无须改动代码,直接在配置文件中修改即可!大大提高了生产效率。


2019082611500944.png

2.2编写代码

JDBCUtils.java

package util;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils{
    private static String driver="";
    private static String url="";
    private static String user="";
    private static String password="";
    /*
    * 文件的读取,只需要读取一次即可获取这些值,因此使用静态代码块
     */
    static {
        try {
            //读取资源文件,获取值
            //1.Properties集合类
            Properties properties=new Properties();
            //2.加载文件
            properties.load(new FileReader("E:\\Java项目\\JDBC_Test\\demo1\\src\\jdbc.properties"));
            //3.获取数据,赋值
            url=properties.getProperty("url");
            user=properties.getProperty("user");
            password=properties.getProperty("password");
            driver=properties.getProperty("driver");
            //4.注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static Connection getconnection() throws SQLException {//获取数据库连接对象 Connection
        return DriverManager.getConnection(url,user,password);
    }
    /**
    *重载方式实现close方法:
    *1.当执行SQL的增、删、改语句时,使用void close(Statement ,Connection)来关闭资源
    *2.当执行SQL的查询语句时,使用void close(ResultSet,Statement ,Connection)来关闭资源
    */
    public static void close(Statement statement,Connection connection){//释放资源
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    public static void close(ResultSet resultSet,Statement statement,Connection connection){//释放资源
        if (resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

2.3改进代码

将上一段代码中的加载文件的代码

  //2.加载文件
 properties.load(new FileReader("E:\\Java项目\\JDBC_Test\\demo1\\src\\jdbc.properties"));


修改成以下代码

 //获取src路径下的文件的方式--->ClassLoader类加载器
 ClassLoader classLoader=JDBCUtils.class.getClassLoader();
 String path=classLoader.getResource("jdbc.properties").getFile();
 path=java.net.URLDecoder.decode(path,"utf-8");
 properties.load(new FileReader(path));

这样以后,一个简单的JDBCUtils工具类就写好了,下面我来测试一下。


3.测试JDBCSUtils类


首先,我的需求是:查询MySQL的lzm数据库中的account表,并将结果打印到IDEA控制台上

我使用SQLyog查询出account表的内容如图:

20190826131506383.png


现在,需要完成这个需求,我贴上我的代码:

Test9.java

//需求:查询MySQL的lzm数据库中的account表,并将结果打印到控制台上
import domain.Account;
import util.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class Test9 {
    public static void main(String[] args) {
        List<Account> accountList=new Test9().findAlls();
        Iterator<Account> itr=accountList.iterator();
        while (itr.hasNext()){
            System.out.println(itr.next());
        }
    }
    public List<Account> findAlls(){
        Connection conn=null;
        Statement stmt=null;
        ResultSet rst=null;
        List<Account> list=null;
        try {
            //1.使用了JDBCUtils工具类来获取数据库连接,简化了代码
            conn=JDBCUtils.getconnection();
            //2.定义sql语句,查询account表中的数据
            String sql="select * from account";
            //3.获取执行sql的对象
            stmt=conn.createStatement();
            //4.执行sql对象
            rst=stmt.executeQuery(sql);
            //5.遍历结果集,封装对象,装载集合
            Account act;
            list= new ArrayList<>();
            while (rst.next()){
                act=new Account();
                int id=rst.getInt("id");
                String name=rst.getString("name");
                double balance=rst.getDouble("balance");
                act.setId(id);
                act.setName(name);
                act.setBalance(balance);
                list.add(act);
            }
            //6.使用JDBCUtils工具类来关闭资源,简化了代码
            JDBCUtils.close(rst,stmt,conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
}

运行结果如下,证明成功:


20190826131759879.png

4.常见问题


**1.**在jdbc.properties配置文件中,如果数据库路径中:


url=jdbc:mysql:///要访问的数据库名称?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

没有


useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC


这一行代码的话,IDEA会报java.sql.SQLException异常:


java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or r


解决方法就是按照这种格式来配置jdbc.properties文件


url=jdbc:mysql:///要访问的数据库名称?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UT

2.使用类加载器ClassLoader来获取src路径下的文件,采用以下这种方式,如果路径中含有中文,我的jdbc.properties文件的绝对路径名为:E:\Java项目\JDBC_Test\demo1\src\jdbc.properties,

IDEA会报java.io.FileNotFoundException: **E:\Java%e9%a1%b9%e7%9b%ae\JDBC_Test\out\production\demo1\jdbc.properties (系统找不到指定的路径。)**的异常,很明显,Java项目这一目录中文乱码了!才导致系统找不到指定的路径。


//获取src路径下的文件的方式--->ClassLoader类加载器
            ClassLoader classLoader=JDBCUtils.class.getClassLoader();
            URL res=classLoader.getResource("jdbc.properties");
            String path=res.getPath();
            properties.load(new FileReader(path));

因此,将上述代码修改成:

 ClassLoader classLoader=JDBCUtils.class.getClassLoader();
 String path=classLoader.getResource("jdbc.properties").getFile();
 path=java.net.URLDecoder.decode(path,"utf-8");
 properties.load(new FileReader(path));

问题即可解决!


3. java.lang.NoClassDefFoundError: Could not initialize class utils.JDBCUtils

出现这种情况一般来说是配置文件的位置放错了,解决方法是,把jdbc.properties文件放在项目的src目录下。

更加详细的解决方法可参考链接:java.lang.NoClassDefFoundError解决方法


5.总结


在学习完了数据库的基本操作之后,我进入了JDBC的学习,从简单的编写几行sql语句到编写JDBCUtils工具类,跟着网上的教程来学习,发现了问题找博客来解决,锻炼了自己的能力,也提升了自己的编程能力,加油!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Java 数据库连接 数据库
JDBC学习(三):封装工具类JDBCUtils类
为了以后方便进行数据库连接、数据库关闭、还有后面的连接池的操作等功能,现在将功能封装到JDBCUtils类当中,作为自己的一个工具箱。
396 0
|
5月前
|
人工智能 小程序 Java
【Java】throw异常后代码还执行吗?80%小伙伴竟然不知道
本文通过具体的Java代码示例,探讨了Java异常处理机制下的程序流程变化,包括未使用try-catch时异常导致流程中断、使用try-catch捕获异常后的不同执行路径、循环中的异常处理以及throw抛出异常后的代码执行情况。总结了异常处理的关键点,强调了finally块的重要性。
84 4
【Java】throw异常后代码还执行吗?80%小伙伴竟然不知道
|
7月前
|
Java 数据库连接
Java的数据库连接工具类的编写
Java的数据库连接工具类的编写
59 1
|
Java 数据库连接
Java 中封装JDBC连接到JDBCUtils工具类的详解
Java 中封装JDBC连接到JDBCUtils工具类的详解
96 0
|
人工智能 Java easyexcel
【工具篇】java导出excel工具类,多种模式自动配置,绝对值得你收藏
【工具篇】java导出excel工具类,多种模式自动配置,绝对值得你收藏
618 0
|
Java
【常用工具类】Java控制台打印工具类LogUtil
【常用工具类】Java控制台打印工具类LogUtil
386 0
【常用工具类】Java控制台打印工具类LogUtil
|
SQL Java 数据库连接
【JDBC】JDBCUtils工具类开发
1.JDBCUtils工具类开发 我们来写一个Jdbc工具类——JdbcUtils,这个工具类可以用来获取Connection对象以及关闭数据库连接 上代码:
186 0
|
SQL Java 数据库
java简单实现事务控制的demo
java简单实现事务控制的demo
389 0
|
关系型数据库 MySQL Java
后台数据库连接以及工具类编写
后台数据库连接以及工具类编写
155 0