求助 大家好。帮我看看这个封装有什么缺陷。谢谢
下面是我封装的数据库。。大家帮我看看。有什么缺陷。最好详细点。谢谢各位帮我看看。。
package db;
import java.io.*;
import java.sql.*;
public class db {
public String DBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
public String ConStr = "jdbc:odbc:shop";
public String user = "sa";
public String pw = "sa";
Connection con = null;
ResultSet rs = null;
public String getStr(String s) {
String str = s;
try {
byte b[] = str.getBytes("ISO-8859-1");
str = new String(b);
return str;
} catch (Exception e) {
return null;
}
}
public String gb2iso(String qs) {
try {
if (qs == null) {
return "NULL";
} else {
return new String(qs.getBytes("gb2312"), "iso-8859-1");
}
} catch (Exception e) {
System.out.println("gb2iso error:" + e.getMessage());
}
return "NULL";
}
public void setDBDriver(String DBDriver) {
this.DBDriver = DBDriver;
}
public String getDBDriver() {
return DBDriver;
}
public void setConStr(String ConStr) {
this.ConStr = ConStr;
}
public String getConStr() {
return ConStr;
}
public void setuser(String user) {
this.user = user;
}
public String getuser() {
return user;
}
public void setpw(String pw) {
this.pw = pw;
}
public ResultSet query(String sql) throws Exception {
try {
Class.forName(DBDriver).newInstance();
con = DriverManager.getConnection(ConStr, user, pw);
Statement st = con.createStatement();
rs = st.executeQuery(sql);
return rs;
} catch (SQLException ex) {
System.out.println("sql.executeQuery:" + ex.getMessage());
}
return null;
}
public void Close()
{
try {
con.close();
} catch (SQLException ex) {
}
}
public void update(String sql) throws Exception {
try {
Class.forName(DBDriver).newInstance();
con = DriverManager.getConnection(ConStr, user, pw);
Statement st = con.createStatement();
st.executeUpdate(sql);
con.close();
st.close();
} catch (SQLException ex) {
System.out.println("sql.executeUpdate:" + ex.getMessage());
}
}
}
[解决办法]
要说缺陷的话。
1。Class.forName(DBDriver).newInstance(); 这个东西调用一次就可以了,每次都执行没啥意思。
2.你那些close()应该写在finally{}里保证关闭数据链接,要不前头的出了异常,这个链接就没法释放了
con和st的关闭错误也反了,先关闭st再关闭con
其他的暂时没看出来。
[解决办法]
在下初学:是不是可以把Class.forName(DBDriver).newInstance();
con = DriverManager.getConnection(ConStr, user, pw);
Statement st = con.createStatement();
这三句写到一个public Statement getStmt()中,
然后在适当的地方调用。
public Statement getStmt(){
try{
Class.forName(DBDriver).newInstance();
con = DriverManager.getConnection(ConStr, user, pw);
Statement st = con.createStatement();
}catch(Exception e){
return null;
}
return st;
}
[解决办法]
1.
Class.forName(DBDriver).newInstance();
con = DriverManager.getConnection(ConStr, user, pw);
放静态块
static {
Class.forName(DBDriver).newInstance();
con = DriverManager.getConnection(ConStr, user, pw);
}
2.
ResultSet 不能用全局的
3.
[你那些close()应该写在finally{}里保证关闭数据链接,要不前头的出了异常,这个链接就没法释放了
con和st的关闭错误也反了,先关闭st再关闭con]引用楼上的
4.类名首字母大写。要遵守java规范阿,否则整合到java框架里可能会有问题。
5.为什么db类里面会有字符转换方法?类的职责不明。应该新建一个类,把这部分分离出去。
6.return "NULL"; ??????????????????????
return null;return "";或者比较好
7.return 语句尽量不要放在try里,这种写法不规范,因为如果finnally里也有会覆盖你try里的return
8.变量首字母小写,遵守规范
9.public String gb2iso(String qs) {
try {
if (qs == null) {
return "NULL";
} else {
return new String(qs.getBytes("gb2312"), "iso-8859-1");
}
} catch (Exception e) {
System.out.println("gb2iso error:" + e.getMessage());
}
return "NULL";
}
对于绝对走不到的return 要避免。
10.貌似少了事务
11.gb2iso命名不规范
[解决办法]
query 应该写个回调,ResultSet也是需要关闭的啊.
[解决办法]
在下新手
楼主代码中的问题我也总犯啊
这部分代码应该属于Dao层的可以不写事务控制的吧
resultSet为什么不能是全局的呢 ?