利用模板模式重构JDBC操作
生活随笔
收集整理的這篇文章主要介紹了
利用模板模式重构JDBC操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
創建一個模板類JdbcTemplate,封裝所有的JDBC 操作。以查詢為例,每次查詢的表不同,返回的數據結構也就不一樣。我們針對不同的數據,都要封裝成不同的實體對象。而每個實體封裝的邏輯都是不一樣的,但封裝前和封裝后的處理流程是不變的,因此,我們可以使用模板方法模式來設計這樣的業務場景。先創建約束ORM 邏輯的接口RowMapper:
/*** ORM映射定制化的接口*/ public interface RowMapper<T> {T mapRow(ResultSet rs,int rowNum) throws Exception; }在創建封裝了所有處理流程的抽象類JdbcTemplate:
public abstract class JdbcTemplate {private DataSource dataSource;public JdbcTemplate(DataSource dataSource) {this.dataSource = dataSource;}public List<?> executeQuery(String sql, RowMapper<?> rowMapper, Object[] values){try {//1、獲取連接Connection conn = this.getConnection();//2、創建語句集PreparedStatement pstm = this.createPrepareStatement(conn,sql);//3、執行語句集ResultSet rs = this.executeQuery(pstm,values);//4、處理結果集List<?> result = this.paresResultSet(rs,rowMapper);//5、關閉結果集this.closeResultSet(rs);//6、關閉語句集this.closeStatement(pstm);//7、關閉連接this.closeConnection(conn);return result;}catch (Exception e){e.printStackTrace();}return null;}protected void closeConnection(Connection conn) throws Exception {//數據庫連接池,我們不是關閉conn.close();}protected void closeStatement(PreparedStatement pstm) throws Exception {pstm.close();}protected void closeResultSet(ResultSet rs) throws Exception {rs.close();}protected List<?> paresResultSet(ResultSet rs, RowMapper<?> rowMapper) throws Exception {List<Object> result = new ArrayList<Object>();int rowNum = 1;while (rs.next()){result.add(rowMapper.mapRow(rs,rowNum ++));}return result;}protected ResultSet executeQuery(PreparedStatement pstm, Object[] values) throws Exception {for (int i = 0; i < values.length; i++) {pstm.setObject(i,values[i]);}return pstm.executeQuery();}protected PreparedStatement createPrepareStatement(Connection conn, String sql) throws Exception {return conn.prepareStatement(sql);}public Connection getConnection() throws Exception {return this.dataSource.getConnection();} }創建實體對象Member 類:
public class Member {private String username;private String password;private String nickname;private int age;private String addr;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;} }創建數據庫操作類MemberDao:
public class MemberDao extends JdbcTemplate {public MemberDao(DataSource dataSource) {super(dataSource);}public List<?> selectAll(){String sql = "select * from t_member";return super.executeQuery(sql, new RowMapper<Member>() {public Member mapRow(ResultSet rs, int rowNum) throws Exception {Member member = new Member();//字段過多,原型模式member.setUsername(rs.getString("username"));member.setPassword(rs.getString("password"));member.setAge(rs.getInt("age"));member.setAddr(rs.getString("addr"));return member;}},null);} }客戶端測試代碼:
public class MemberDaoTest {public static void main(String[] args) {MemberDao memberDao = new MemberDao(null);List<?> result = memberDao.selectAll();System.out.println(result);} }希望通過這兩個案例的業務場景分析,能夠幫助小伙們對模板方法模式有更深的理解。
?
總結
以上是生活随笔為你收集整理的利用模板模式重构JDBC操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模板模式的应用场景
- 下一篇: 模板模式在源码中的体现