封装JDBC
由于在使用jdbc连接数据库时,出现了多次下列代码
//注册驱动获取地址
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/tb1?characterEncoding=utf-8";
String username = "root";
String password = 自己的密码;
//获取数据库连接
Connection conn = DriverManager.getConnection(url, username, password);
存在大量数据冗余,所以可以将该代码提取出来,封装成一个工具类,在使用时只需传入sql语句以及sql代码中 ? 的数量即可
封装代码:
/**
* 数据库工具类
*/
public class BaseDao {
Connection conn = null;
PreparedStatement ps = null;
//获取Conn对象 打开数据库链接
public boolean getConn() {
boolean bool = false;//默认 false 未打开数据库
try {
//加载驱动 方言
Class.forName("com.mysql.jdbc.Driver");
//准备数据库连接路径
String url = "jdbc:mysql://127.0.0.1:3306/xxshop?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
//用户名与密码
String username = "root";
String userpwd = "密码";
//根据路径,用户名,密码 使用DriverManager获取数据库connection连接
conn = DriverManager.getConnection(
url,username,userpwd);
bool = true;//已经打开
} catch (Exception e) {
e.printStackTrace();
bool = false ;//已经打开
}
return bool;
}
/**
* 添加,修改,删除数据
* @param sql
* @param objs
* @return
*/
public int executeUpdate(String sql,Object objs[])
{
int res = 0;//初始化执行结果 失败0
try {
if(getConn())//打开数据库链接
{
ps = conn.prepareStatement(sql);
if(objs!=null){
for (int i = 0; i < objs.length; i++) {
ps.setObject((i+1),objs[i]);
}
}
res = ps.executeUpdate();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeResource();//关闭数据源
}
return res;
}
/**
* 查询
* @param sql
* @param objs
* @return
*/
public ResultSet executeSQL(String sql,Object objs[]){
ResultSet rs = null;
try {
if(getConn())//打开数据库链接
{
ps = conn.prepareStatement(sql);
//判断是否有参数
if (objs != null) {
//循环封装参数
for (int i = 0; i < objs.length; i++) {
ps.setObject((i + 1), objs[i]);
}
}
rs = ps.executeQuery();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeResource();//释放资源
}
return rs;
}
//关闭资源
public void closeResource(){
try {
if(ps!=null)
{
ps.close();
}
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
由于在开发过程中,后续使用时数据库文件不可能写死到java代码中,多使用 yml 或者 properties 文件来存储数据库信息,所以我们将数据库url以及用户名密码提取出来,使用其他方式来读取
示例代码:
jdbc.properties:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/tb1?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username=root
pwd=密码
编写读取类,读取数据库信息
package JDBC02.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 使用单例模式将文件中的信息提取出来
* 每次使用这个类时,只new一次
*/
public class ConfigManager {
private static Properties pro = null;
private static ConfigManager cm = new ConfigManager();
public ConfigManager() {
pro = new Properties();
InputStream is = ConfigManager.class.getClassLoader().getResourceAsStream("jdbc.properties");
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Properties getProperties() {
return pro;
}
}
修改工具类中的加载数据库信息代码,不再写死
/**
* 获取数据库连接驱动
*/
public static boolean getConn() {
boolean bool = false;//默认 false 未打开数据库
try {
Properties pro = ConfigManager.getProperties();
String driver = pro.getProperty("driver");
String url = pro.getProperty("url");
String username = pro.getProperty("username");
String pwd = pro.getProperty("pwd");
Class.forName(driver);
//获取数据库连接
conn = DriverManager.getConnection(url, username, pwd);
bool = true;
} catch (Exception e) {
e.printStackTrace();
}
return bool;
}
这样子可以方便后续的修改以及阅读。