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所示:
配置文件内容:
jdbc.properties
//数据库路径 url=jdbc:mysql:///lzm?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC //用户名 user=root //密码 password=root //数据库驱动 driver=com.mysql.jdbc.Driver`
有了配置文件以后,要是数据库路径、用户名、密码或驱动发生了变更,则无须改动代码,直接在配置文件中修改即可!大大提高了生产效率。
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表的内容如图:
现在,需要完成这个需求,我贴上我的代码:
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; } }
运行结果如下,证明成功:
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工具类,跟着网上的教程来学习,发现了问题找博客来解决,锻炼了自己的能力,也提升了自己的编程能力,加油!