首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

应用模板方法模式简化JDBC操作

2012-11-09 
使用模板方法模式简化JDBC操作在使用JDBC时,会重复的写很多重复的代码,例如Java代码1.Connection conn n

使用模板方法模式简化JDBC操作
在使用JDBC时,会重复的写很多重复的代码,例如

   
Java代码 
1.              Connection conn = null;  
2.PreparedStatement ps = null;  
3.ResultSet rs = null;  
4.              String sql="insert into t_user(username,brithday) values(?,?)";  
5.try {  
6.    conn = JdbcUtils.getConnection();  
7.    ps = conn.prepareStatement(sql);  
8.      
9. 
10.} catch (SQLException e) {  
11.    throw new DaoException(e.getMessage(), e);  
12.} finally {  
13.    JdbcUtils.free(rs, ps, conn);  
14.}  
15.   
                Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
                String sql="insert into t_user(username,brithday) values(?,?)";
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);


} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
   

这部分代码在数据库操作方法中都会有。因此我们可以把这部分不变的内容提取出来,作为一个公用的方法。

例如,我们的增,删,改操作可以这样写

Java代码 
1./** 
2.     * 增,删,改方法 
3.     * @param sql 
4.     * @param args sql参数 
5.     * @return 
6.     */ 
7.    public int update(String sql, Object[] args) {  
8.        Connection conn = null;  
9.        PreparedStatement ps = null;  
10.        ResultSet rs = null;  
11.        try {  
12.            conn = JdbcUtils.getConnection();  
13.            ps = conn.prepareStatement(sql);  
14.            for (int i = 0; i < args.length; i++)  
15.                ps.setObject(i + 1, args[i]);  
16.            return ps.executeUpdate();  
17.        } catch (SQLException e) {  
18.            throw new DaoException(e.getMessage(), e);  
19.        } finally {  
20.            JdbcUtils.free(rs, ps, conn);  
21.        }  
22.    } 
/**
* 增,删,改方法
* @param sql
* @param args sql参数
* @return
*/
public int update(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
ps.setObject(i + 1, args[i]);
return ps.executeUpdate();
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
}


最麻烦的就是返回一个对象的操作了。因为我不知道要返回的对象是什么,所以在往对象里设值的时候就不确定了。因此我们可以在这个类里面定义一个抽象的方法,具体怎么实现,它的子类知道。

因此我们的这个类就可以这样设计了

Java代码 
1.package com.zzg.jdbc.base;  
2. 
3.import java.sql.Connection;  
4.import java.sql.PreparedStatement;  
5.import java.sql.ResultSet;  
6.import java.sql.SQLException;  
7.import java.util.ArrayList;  
8.import java.util.List;  
9. 
10.import com.zzg.jdbc.exception.DaoException;  
11.import com.zzg.jdbc.util.JdbcUtils;  
12. 
13.public abstract class BaseDao {  
14. 
15.    /** 
16.     * 增,删,改方法 
17.     * @param sql 
18.     * @param args sql参数 
19.     * @return 
20.     */ 
21.    public int update(String sql, Object[] args) {  
22.        Connection conn = null;  
23.        PreparedStatement ps = null;  
24.        ResultSet rs = null;  
25.        try {  
26.            conn = JdbcUtils.getConnection();  
27.            ps = conn.prepareStatement(sql);  
28.            for (int i = 0; i < args.length; i++)  
29.                ps.setObject(i + 1, args[i]);  
30.            return ps.executeUpdate();  
31.        } catch (SQLException e) {  
32.            throw new DaoException(e.getMessage(), e);  
33.        } finally {  
34.            JdbcUtils.free(rs, ps, conn);  
35.        }  
36.    }  
37. 
38.    /** 
39.     * 返回一个对象 
40.     * @param <T> 
41.     * @param sql 
42.     * @param args 
43.     * @return 
44.     */ 
45.    public <T> T find(String sql, Object[] args) {  
46.        Connection conn = null;  
47.        PreparedStatement ps = null;  
48.        ResultSet rs = null;  
49.        try {  
50.            conn = JdbcUtils.getConnection();  
51.            ps = conn.prepareStatement(sql);  
52.            for (int i = 0; i < args.length; i++)  
53.                ps.setObject(i + 1, args[i]);  
54.            rs = ps.executeQuery();  
55.            T t = null;  
56.            if (rs.next()) {  
57.                t = rowMapper(rs);  
58.            }  
59.            return t;  
60.        } catch (SQLException e) {  
61.            throw new DaoException(e.getMessage(), e);  
62.        } finally {  
63.            JdbcUtils.free(rs, ps, conn);  
64.        }  
65.    }  
66. 
67.    /** 
68.     * 返回一个List 
69.     * @param <T> 
70.     * @param sql 
71.     * @param args 
72.     * @return 
73.     */ 
74.    public <T> List<T> list(String sql, Object[] args) {  
75.        Connection conn = null;  
76.        PreparedStatement ps = null;  
77.        ResultSet rs = null;  
78.        try {  
79.            conn = JdbcUtils.getConnection();  
80.            ps = conn.prepareStatement(sql);  
81.            for (int i = 0; i < args.length; i++)  
82.                ps.setObject(i + 1, args[i]);  
83.            rs = ps.executeQuery();  
84.            T t = null;  
85.            List<T> list = new ArrayList<T>();  
86.            while (rs.next()) {  
87.                t = rowMapper(rs);  
88.                list.add(t);  
89.            }  
90.            return list;  
91.        } catch (SQLException e) {  
92.            throw new DaoException(e.getMessage(), e);  
93.        } finally {  
94.            JdbcUtils.free(rs, ps, conn);  
95.        }  
96.    }  
97. 
98.    abstract protected <T> T rowMapper(ResultSet rs) throws SQLException;  
99. 
100.} 
package com.zzg.jdbc.base;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.zzg.jdbc.exception.DaoException;
import com.zzg.jdbc.util.JdbcUtils;

public abstract class BaseDao {

/**
* 增,删,改方法
* @param sql
* @param args sql参数
* @return
*/
public int update(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
ps.setObject(i + 1, args[i]);
return ps.executeUpdate();
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
}

/**
* 返回一个对象
* @param <T>
* @param sql
* @param args
* @return
*/
public <T> T find(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
ps.setObject(i + 1, args[i]);
rs = ps.executeQuery();
T t = null;
if (rs.next()) {
t = rowMapper(rs);
}
return t;
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
}

/**
* 返回一个List
* @param <T>
* @param sql
* @param args
* @return
*/
public <T> List<T> list(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
ps.setObject(i + 1, args[i]);
rs = ps.executeQuery();
T t = null;
List<T> list = new ArrayList<T>();
while (rs.next()) {
t = rowMapper(rs);
list.add(t);
}
return list;
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
}

abstract protected <T> T rowMapper(ResultSet rs) throws SQLException;

}


在使用时我们的类只需要继承上面那个类就可以了。

Java代码 
1.package com.zzg.jdbc.dao.impl;  
2. 
3.import java.sql.ResultSet;  
4.import java.sql.SQLException;  
5.import java.util.List;  
6. 
7.import com.zzg.jdbc.base.BaseDao;  
8.import com.zzg.jdbc.dao.UserDao;  
9.import com.zzg.jdbc.domain.User;  
10. 
11.public class UserDaoImpl extends BaseDao implements UserDao {  
12. 
13.    @Override 
14.    public User findUser(int id) {  
15.        String sql = "select *from t_user where id=?";  
16.        Object[] args = new Object[] { id };  
17.        User user = super.find(sql, args);  
18.        return user;  
19.    }  
20. 
21.    @Override 
22.    public List<User> listUser(String username) {  
23.        String sql = "select *from t_user where username=?";  
24.        Object[] args = new Object[] { username };  
25.        List<User> list = super.list(sql, args);  
26.        for (User u : list) {  
27.            System.out.println(u.getId());  
28.        }  
29.        return list;  
30.    }  
31. 
32.    @Override 
33.    protected Object rowMapper(ResultSet rs) throws SQLException {  
34.        User user = new User();  
35.        user.setId(rs.getInt("id"));  
36.        user.setUsername(rs.getString("username"));  
37.        user.setBrithday(rs.getDate("brithday"));  
38.        return user;  
39.    }  
40. 
41.} 
package com.zzg.jdbc.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import com.zzg.jdbc.base.BaseDao;
import com.zzg.jdbc.dao.UserDao;
import com.zzg.jdbc.domain.User;

public class UserDaoImpl extends BaseDao implements UserDao {

@Override
public User findUser(int id) {
String sql = "select *from t_user where id=?";
Object[] args = new Object[] { id };
User user = super.find(sql, args);
return user;
}

@Override
public List<User> listUser(String username) {
String sql = "select *from t_user where username=?";
Object[] args = new Object[] { username };
List<User> list = super.list(sql, args);
for (User u : list) {
System.out.println(u.getId());
}
return list;
}

@Override
protected Object rowMapper(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setBrithday(rs.getDate("brithday"));
return user;
}

}

热点排行