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所示:
JDBCUtils工具类代码的实现和一些常见问题的总结_第1张图片
配置文件内容:
jdbc.properties

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

有了配置文件以后,要是数据库路径、用户名、密码或驱动发生了变更,则无须改动代码,直接在配置文件中修改即可!大大提高了生产效率。
JDBCUtils工具类代码的实现和一些常见问题的总结_第2张图片
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表的内容如图:
JDBCUtils工具类代码的实现和一些常见问题的总结_第3张图片现在,需要完成这个需求,我贴上我的代码:
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 accountList=new Test9().findAlls();
        Iterator itr=accountList.iterator();
        while (itr.hasNext()){
            System.out.println(itr.next());
        }
    }
    public List findAlls(){
        Connection conn=null;
        Statement stmt=null;
        ResultSet rst=null;
        List 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;
    }
}

运行结果如下,证明成功:
JDBCUtils工具类代码的实现和一些常见问题的总结_第4张图片

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 represents more than one time zone.

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

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

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工具类,跟着网上的教程来学习,发现了问题找博客来解决,锻炼了自己的能力,也提升了自己的编程能力,加油!

你可能感兴趣的:(Java学习,MySQL)