黑马程序员技术交流社区
标题:
DAO模式中数据库的关闭和异常处理
[打印本页]
作者:
马亚冲
时间:
2011-8-17 10:58
标题:
DAO模式中数据库的关闭和异常处理
在DAO模式中,数据库的关闭和异常处理,都是在什么地方,什么时候?
有的说过,在DAO的代码中,数据库不用显式的关闭,它会自动关闭,数据库的异常处理交直接抛出给调用它的方法,即谁调用它就有谁来处理?这具体说,是什么意思
大家对这方面的理解呢?
作者:
匿名
时间:
2011-8-17 12:40
我举例说明一下啊!
//查询一个表中的数据
public NoteForm selectById(int id) {
NoteForm note = new NoteForm();
con = new DBConnection();
sql = "select id,title,author,content from note where id=?";
try {
pstmt = con.getCon().prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
note.setId(rs.getInt("id"));
note.setTitle(rs.getString("title"));
note.setAuthor(rs.getString("author"));
note.setContent(rs.getString("content"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();//此处处理异常
} finally {
try { //此处关闭数据库
rs.close();
pstmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return note;
}
//添加
public void insert(NoteForm note) {
con = new DBConnection();
sql = "insert into note(title,author,content) values(?,?,?)";
try {
pstmt = con.getCon().prepareStatement(sql);
pstmt.setString(1, note.getTitle());
pstmt.setString(2, note.getAuthor());
pstmt.setString(3, note.getContent());
pstmt.executeUpdate();
} catch (SQLException e) {//此处又是处理异常
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {//同样是关闭数据库
pstmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
以上只是本人的一点愚见,未知可否为你解惑?
作者:
匿名
时间:
2011-8-17 21:41
我在学习JDBC时候对数据库操作也是非常混乱,但是后来我就理清了思路了,
我和楼主分享下经验吧!
这些是必要的属性
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
private Connection con;
首先是这个获取连接串的方法:
private Connection getConn(){
String driverName=ProReader.getInstance().getProperty("driverClassName");
String url=ProReader.getInstance().getProperty("url");
String user=ProReader.getInstance().getProperty("username");
String password=ProReader.getInstance().getProperty("password");
try {
Class.forName(driverName);
con=DriverManager.getConnection(url,user,password);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
采取的是配置文件读取,可支持编译后的数据库字符串变动的修改
这个ClossAll方法可关闭所有连接,并且防止了空指针异常的出现
public void closeAll(){
try {
if(pstmt!=null){
pstmt.close();
}
if(stmt!=null){
stmt.close();
}
if(rs!=null){
rs.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
接下来是这个构造方法的实现
在构造的同时获取了数据库连接串,并且将Statement 创建,你就可以直接执行对数据库的操作了
public BaseDao(){
closeAll();
con=getConn();
try {
stmt=con.createStatement();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
最后是通用的方法
public Object execute(String sql,boolean isQuery){
if(isQuery){
return executeQuery(sql);
}else{
return executeUpdate(sql);
}
}
public ResultSet executeQuery(String sql){
try {
rs=stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public int executeUpdate(String sql){
int ret=-1;
try {
ret=stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return ret;
}
public ResultSet pExecuteQuery(String sql,Object [] param){
try {
if(pstmt!=null){
pstmt.close();
}
pstmt=con.prepareStatement(sql);
for(int i=1;i<=param.length;i++){
pstmt.setObject(i, param[i-1]);
}
return pstmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public int pExecuteUpdate(String sql,Object [] param){
try {
if(pstmt!=null){
pstmt.close();
}
pstmt=con.prepareStatement(sql);
for(int i=1;i<=param.length;i++){
pstmt.setObject(i, param[i-1]);
}
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
return -1;
}
}
public Object pExecute(String sql,Object [] param,boolean isQuery){
if(isQuery){
return pExecuteQuery(sql, param);
}else{
return pExecuteUpdate(sql, param);
}
}
不过在最后别忘记关闭数据库,调用下closeAll方法就可以将所有的关闭!
作者:
匿名
时间:
2011-8-17 21:43
标题:
附加上一个应用实例吧
public Boolean validate() throws SQLException{
String sql="select userID from userInfo where loginName=? and loginPass=?";
BaseDao bd=new BaseDao();
ResultSet rs=bd.pExecuteQuery(sql, new Object[]{getLoginName(),getLoginPass()});
if(rs.next()){
bd.closeAll();
return true;
}else{
bd.closeAll();
return false;
}
}
作者:
匿名
时间:
2011-8-17 21:51
楼主要是对JDBC有兴趣可以QQ上找我要的这个BaseDao,我之前写项目时候就是用这个BaseDao(),在开发过程中是没有任何问题的
作者:
匿名
时间:
2011-8-25 09:48
标题:
回复 报纸 的帖子
你QQ多少?我的563952634
作者:
匿名
时间:
2011-8-25 09:50
楼上的两位还是没有直接回答我的问题啊,我看两位的代码,意思应该是数据库的异常处理和关闭是在具体的方法实现的时候,不是在被调用的时候处理了。
那我再问一下,被调用处还需要处理吗??????
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2