封装数据库链接
-
在软件中数据库连接使用非常平凡,如果每次都创建链接,就会造成代码的大量冗余
-
解决这一问题,常规的做法是建立数据库连接工具,封装数据库连接过程,统一数据库连接过程,使用时候就可以简化代码
封装第一版
public class DBUtils {
public static Connection getConnection() {
try {
String driver = "oracle.jdbc.OracleDriver";
Class.forName(driver);
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "system";
String password = "admin";
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
Properties
-
Java通常将配置文件的扩展名命名为".properties"
-
java.util.Properties就是为了读取 *.properties 文件设计的API,其底层就是文本文件IO
-
Properties本身实现了Map接口,内部是散列表,限定了Key和Value都是String类型
-
常用方法:
-
void load(流):将文件流中的文件读取为散列表
-
String getProperty(key):查询value,如果没有对应的key,返回null
-
-
使用步骤:
-
创建Properties对象
-
利用load方法读取文件
-
利用getProperty查询属性文件的内容
-
在项目中的reource文件夹中添加配置文件:
演示:Properties读取resource文件夹中的文件
package demo;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
public class Demo03 {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
System.out.println(properties);
System.out.println(properties.size());
System.out.println(properties.isEmpty());
InputStream in = DBUtils02.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(in);
System.out.println(properties);
System.out.println(properties.size());
String url = properties.getProperty("jdbc.url");
System.out.println(url);
}
}
封装第二版
package demo;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtils02 {
static String driver;
static String url;
static String username;
static String password;
static {
//初始化静态属性
//1.利用Properties读取配置文件
Properties pro = new Properties();
InputStream in = DBUtils02.class.getClassLoader().getResourceAsStream("db.properties");
try {
pro.load(in);
//2.初始化连接参数
driver = pro.getProperty("jdbc.driver");
url = pro.getProperty("jdbc.url");
username = pro.getProperty("jdbc.username");
password = pro.getProperty("jdbc.password");
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
封装第二版说明:
-
dirver、url、username、password是4个数据库连接参数,因为只需要一份,则定义为静态变量
-
静态代码块的目的是从配置文件中读取4个数据库连接参数的值,只读取一次即可
封装第三版:标准版
package demo;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtils02 {
private static String driver;
private static String url;
private static String username;
private static String password;
static {
//初始化静态属性
//1.利用Properties读取配置文件
Properties pro = new Properties();
InputStream in = DBUtils02.class.getClassLoader().getResourceAsStream("db.properties");
try {
pro.load(in);
//2.初始化连接参数
driver = pro.getProperty("jdbc.driver");
url = pro.getProperty("jdbc.url");
username = pro.getProperty("jdbc.username");
password = pro.getProperty("jdbc.password");
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
//关闭数据库的连接
public static void close(Connection conn) {
if (conn != null) {
try{
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
使用封装数据库连接过程的工具类
package demo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo04 {
public static void main(String[] args) {
Connection conn = null;
try {
conn = DBUtils02.getConnection();
Statement st = conn.createStatement();
String sql = "select * from demo";
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + "," + name);
}
rs.close();//释放查询结果
st.close();//释放语句对象
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtils02.close(conn);
}
}
}