话说
在JavaWeb-JDBC-1-不仅仅只是连接里面,我们做了CURD的操作,不过我们重复写了好多遍,就会想到如何去做优化,难道每次都这么写?这只能算是操作工,没有思想的操作工罢了。
今天,在上次基础上做优化。
先看下JavaWeb结构:
一、我们今天升级的第一个版本是daov1.
发现,在1里面,在加载驱动、获取连接、关闭资源方面,代码都相同,故而做个封装。封装成BaseDaoV1,代码如下:
package com.hmc.jdbc.daov1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @Author Meice
* @Date 2017年8月5日
*/
public class BaseDaoV1 {
// 把加载驱动这部分放在静态语句块里,随着类的加载而加载
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//把获取连接这一CURD都共有的操作封装成getConn()方法。
public Connection getConn() {
Connection conn = null;
String url = "jdbc:mysql://localhost:3306/news_db";
String user = "root";
String password = "119913";
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
// 定义关闭资源方法close()
public void close(ResultSet rs, PreparedStatement ps, Connection conn) {
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
if(conn != null) conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
总结:
1 重复性的的代码,就封装成方法,直接调用。如同我们给自己确定的一
些原则和底线一样,遇到类似的事情,我们直接选择,不用纠结。我会
固定买一些品牌的服装,买的时候直接买,很省事省力,选择是很费精
力的事情。
2 创建方法的时候,考虑好是否有返回值,方法修饰符以及是否带参。
3 我们有4中选择可以利用已有的方法
1)new这个类,调用方法;
2)设置为静态语句块,不用调兵遣将,直接随着类的加载而加载;
3)把这个方法也定义为静态的,不用new,直接调用。
4)extends这个类,也就继承了类的方法和属性(除private),用this调用。
二、测试版,测试CURD
package com.hmc.jdbc.daov1;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @Author Meice
* @Date 2017年8月5日
*/
public class TestBaseDaoV1CURD extends BaseDaoV1{
//定义为全局变量,方便多个方法调用。
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
// 1 测试Select
public void select() {
//调用BaseDaoV1封装好的getConn()方法获取连接
conn = this.getConn();
String sql = "select * from t_news";
// 预编译
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
//遍历结果集
while(rs.next()) {
//可以根据.getInt( int columnIndex)或者.getInt(String columnLabel)来获取集合中的具体值。
System.out.println(rs.getInt("id")+"--"+rs.getString("title")+rs.getString("author"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//调用关闭资源方法close()
this.close(rs, ps, conn);
}
}
//2 测试Insert
public void add() {
conn = this.getConn();
String sql = "insert into t_news (title,author) values (?,?)";
try {
ps = conn.prepareStatement(sql);
ps.setString(1, "我是V1版本新增的新闻1");
ps.setString(2, "admin3");
int result = ps.executeUpdate();
if(result>0) {
System.out.println("恭喜你,增加新闻成功!");
}else {
System.out.println("遗憾,增加新闻失败!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
/**
* 这里要注意,我们executeUpdate()方法,是没有返回结果集ResultSet的。
* 所以用null来替代,如果没有就不关闭。
*/
this.close(null, ps, conn);
}
}
// 3 测试update
public void update() {
conn = this.getConn();
String sql = "update t_news set title = ?,author = ? where id = ? ";
try {
ps = conn.prepareStatement(sql);
//这只参数。第一个参数代表第几个?,第二个参数代表值
ps.setString(1, "我是DaoV1修改后的新闻");
ps.setString(2, "admin5");
ps.setInt(3, 6);
int result = ps.executeUpdate();
if(result>0) {
System.out.println("DaoV1修改新闻成功!");
}else {
System.out.println("遗憾,DaoV1修改新闻失败!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
this.close(null, ps, conn);
}
}
//4 测试delete
public void Del() {
conn = this.getConn();
String sql = "delete from t_news where id = ?";
try {
ps = conn.prepareStatement(sql);
//注意设置参数的位置,应该在执行之前,预编译之后。如果在预编译之前,汇报NullPointException
ps.setInt(1, 6);
int result = ps.executeUpdate();
if(result>0) {
System.out.println("DaoV1执行删除成功!可喜可贺!");
} else {
System.out.println("DaoV1执行删除失败!再接再厉!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
this.close(null, ps, conn);
}
}
public static void main(String[] args) {
// new TestBaseDaoV1CURD().select();
// new TestBaseDaoV1CURD().add();
// new TestBaseDaoV1CURD().update();
new TestBaseDaoV1CURD().Del();
}
}
总结
1 除了Select与众不同之外,发现还是写了大量重复性代码,如何继续优化?
2 优化insert update delete,怎么优化?看来只能在sql和传参上想办法了;
3 这里会发现main方法测试的一个弊端,我只想执行一个方法,但是main()总是不由分辨的从头执行到尾。所以得注释掉测试。因此,世界上就诞生了Junit测试,想测试哪个就测试哪个。
预知后事如何,请听下回分解。
本文介绍了通过封装公共操作如数据库连接获取与关闭等方法,实现对JavaWeb-JDBC代码的优化过程。通过创建BaseDaoV1类进行CURD操作的优化,并提供了具体的实现示例。
1213

被折叠的 条评论
为什么被折叠?



