注册驱动和数据库连接是固定操作,何不将这些固定操作封装成一个类,并且提供静态方法返回数据库连接对象,达到代码的重复利用:
/*
* JDBC的工具类
* 用于注册驱动,连接数据库
*/
import java.sql.Connection;
import java.sql.DriverManager;
public class JDBCUtils {
private JDBCUtils() {
}
private static Connection con;
/*
* 静态代码块用于初始化类,为类的属性初始化,每个静态代码块只会执行一次。
* 由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
*/
static {
try {
Class.forName("com.mysql.jdbc.Driver");//注册驱动
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "yuweijun";
con = DriverManager.getConnection(url, user, password);
} catch (Exception ex) {
throw new RuntimeException(ex + "数据库连接失败!");
}
}
/*
* 定义静态方法,返回数据库连接对象
*/
public static Connection getConnection() {
return con;
}
}
但是由于我们要考虑代码的封装性,当我们更换数据库时不应该去改动源码,此时我们应该创建配置文件,配置文件中以键值对的形式写入我们的信息,然后在工具类中加载配置文件,用配置文件信息去连接数据库:
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
/*
* JDBC工具类
* 读取配置文件注册驱动和连接数据库
*/
public class JDBCUtilsConfig {
//私有化构造方法,使类不能被实例化
private JDBCUtilsConfig() {}
private static Connection con;
static {
try {
FileInputStream fis = new FileInputStream("src\\MyDataBase.properties");
Properties pro = new Properties();
pro.load(fis);
// 通过键获取值
String calss = pro.getProperty("dirverClass");
String url = pro.getProperty("url");
String username = pro.getProperty("username");
String password = pro.getProperty("password");
// 注册驱动
Class.forName(calss);
// 连接数据库
con = DriverManager.getConnection(url, username, password);
} catch (Exception ex) {
throw new RuntimeException(ex + "数据库连接失败!");
}
}
// 返回数据库连接对象
public static Connection getConnection() {
return con;
}
}
测试类:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import JDBCUtils.JDBCUtils;
import JDBCUtils.JDBCUtilsConfig;
public class Test {
public static void main(String[] args) throws SQLException {
// 调用JDBC工具类,获得数据库连接对象
// Connection con=JDBCUtils.getConnection();
Connection con = JDBCUtilsConfig.getConnection();
// 查询账务的全部信息
String sql = "select * from zhangwu";
// 获得SQL语句执行对象,并执行预编译
PreparedStatement ps = con.prepareStatement(sql);
// 执行查询语言,获得结果集
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("zname") + " " + rs.getInt("money"));
}
}
}
后面我们可以往工具类中实现更多功能,比如增删改查等等,方便我们的使用。