最近在学习Java操作MySQL数据库,一般的步骤为:
1.注册数据库驱动
2.获取数据库连接对象 Connection
3.定义和编写sql语句
4.获取执行sql语句的对象 Statement
5.执行sql,接受返回结果
6.处理结果
7.释放资源
每写一个操作数据库的类时都需要对有以上的步骤,像注册数据库驱动、获取数据库连接对象 Connection和释放资源这三个步骤都会写到。为了简化代码和更加灵活地应对各种变化,需要编写一个工具类来处理这些重复的步骤。因此,我结合网上的教程,编写了抽取注册数据库驱动、获取数据库连接对象 Connection和释放资源这三个功能的JDBCUtils工具类
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工具类就写好了,下面我来测试一下。
首先,我的需求是:查询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 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;
}
}
**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解决方法
在学习完了数据库的基本操作之后,我进入了JDBC的学习,从简单的编写几行sql语句到编写JDBCUtils工具类,跟着网上的教程来学习,发现了问题找博客来解决,锻炼了自己的能力,也提升了自己的编程能力,加油!