JdbcUtilsSingleton代码如下:
package cn.itcast.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 使用单例模式创建JDBC工具类
*/
public final class JdbcUtilsSingleton {
//省略localhost:3306,这些信息通常从配置文件中读取
private String url = "jdbc:mysql:///jdbc";
private String username = "root";
private String password = "root";
//懒汉式单例
private static JdbcUtilsSingleton singleton;
/**
* 构造器私用,防止直接创建对象,
* 通过反射或反序列化可以破解单例
*/
private JdbcUtilsSingleton(){
}
/**
* 延迟加载,这个方法必须在JDK5以后执行才不会有问题
* @return
*/
public static JdbcUtilsSingleton getInstance() {
if(singleton == null) {
//加入有一个线程走到这里,然后又然给另一个线程执行完
synchronized(JdbcUtilsSingleton.class) {
if(singleton == null) {
singleton = new JdbcUtilsSingleton();
}
}
}
return singleton;
}
//保证只是注册一次驱动
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* 获取连接
* @return
* @throws SQLException
*/
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
/**
* 释放资源
*/
public void free(ResultSet rs, Statement st, Connection conn) {
//规范的关系连接的方式
try{
if(rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try{
if(st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
测试类代码如下:
package cn.itcast.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 测试类
*/
public class BaseSingleton {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
template();
}
/**
* 比较严谨的实现方式
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void template() throws ClassNotFoundException, SQLException {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//首先需要获取实例,然后获取连接
conn = JdbcUtilsSingleton.getInstance().getConnection();
//创建语句
st = conn.createStatement();
//执行语句
rs = st.executeQuery("select * from user");
//处理结果集
while(rs.next()) {
System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t"
+ rs.getObject(3) + "\t" + rs.getObject(4));
}
} finally {
JdbcUtils.free(rs, st, conn);
}
}
}
运行结果:
1 zhangsan
2017-06-30 100.0
2 lisi
2017-06-06 200.0
3 wangwu
2017-05-30 300.0