今天来简化一下Mysql操作,也就是进行一些封装。
1,释放资源
为了节约内存空间,我们通常在操作完成后会对资源进行释放。
这里面要关闭的资源有PreparedStatement、Connection、以及ResultSet(前面还没总结到,这个是执行查询返回的结果集)
/**
* 关闭Connection和PreparedStatement
*
* @param con
* @param p
*/
public static void close(Connection con, PreparedStatement p) {
try {
p.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 重载close方法 关闭Connection PreparedStatemen ResultSe
* @param con
* @param p
* @param rs
*/
public static void close(Connection con, PreparedStatement p, ResultSet rs) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
close(con, p);
}
2,对数据库配置信息进行封装
先把我们的配置信息放在properties文件里面,可以方便操作。
然后再自己创建一个Configuration类,用来装载配置文件的信息。再用工具类返回这个类。
配置类
/**
* 将配置文件中的数据放入配置类中以便使用
* @author vv
*
*/
public class Configuration {
private String driver;
private String url;
private String name;
private String pwd;
@Override
public String toString() {
return "Configuration [driver=" + driver + ", url=" + url + ", name=" + name + ", pwd=" + pwd + "]";
}
public Configuration() {
}
public Configuration(String driver, String url, String name, String pwd) {
super();
this.driver = driver;
this.url = url;
this.name = name;
this.pwd = pwd;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
工具类
public class MysqlUtil {
static Configuration conf = new Configuration();
static {
Properties p = new Properties();
InputStream in;
try {
in = new FileInputStream("src/db.properties");
try {
p.load(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conf.setDriver(p.getProperty("mysql.driver"));
conf.setName(p.getProperty("mysql.name"));
conf.setUrl(p.getProperty("mysql.url"));
conf.setPwd(p.getProperty("mysql.pwd"));
}
public static Configuration getConfiguration() {
return conf;
}
}
如果不知道properties基本操作可以移步到 https://blog.csdn.net/weixin_44140423/article/details/100151664
3,对获取连接进行封装
每次都去加载驱动获取连接,有点麻烦。不如封装起来。
public static Connection getConn() {
try {
Class.forName(conf.getDriver());
} catch (ClassNotFoundException e) {
System.out.println("驱动加载失败");
}
try {
return DriverManager.getConnection(conf.getUrl(),
conf.getName(), conf.getPwd()); //目前直接建立链接,后期增加连接池提高效率
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("获取连接失败");
return null;
}
}
以上就是基本的工具类封装情况,其实还可以更加优化。就是对数据库操作的优化。
对了!ResultSet明明只是一个集合,为什么要关闭啊,一般来说没有听说关闭集合。
然后去搜了一下,翻到了源码(英语差,但可以使用翻译软件啊)。
翻译两段后:大概意思是【在某些情况下,需要立即释放ResultSet的数据库和JDBC资源,而不是等待它自动关闭时发生; close方法提供了这个即时发布。】
后面的提示是:【当Statement关闭,重新执行或用于从多个结果序列中检索下一个结果时,ResultSet会自动关闭ResultSet。 在收集垃圾时,ResultSet也会自动关闭。】
emmm,大概意思就是这个集合会自动关闭,或者在preparestatement关闭后会自动关闭。但在这种和数据库打交道的途中资源很宝贵,所以能关就是第一时间关。
帮助文档地址:
https://docs.oracle.com/cd/E13222_01/wls/docs45/classdocs/java.sql.ResultSet.html#top