JDBC之使用模板方法模式优化查询方法
2017-07-29 12:14
691 查看
1、在超类中定义模板方法,留给子类实现
package cn.itcast.jdbc.dao.refactor;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.itcast.jdbc.JdbcUtils;
import cn.itcast.jdbc.dao.DaoException;
/**
* 抽象的公共的Dao
*/
public abstract class AbstractDao {
/**
* 查询的方法
* @param sql
* @param args
* @return
*/
public Object 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();
Object obj = null;
if(rs.next()) {
//对结果集的处理是不同的
obj = rowMapper(rs);
}
return obj;
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
/**
* 模板方法,留给子类去实现
* @param rs
* @return
* @throws SQLException
*/
protected abstract Object rowMapper(ResultSet rs) throws SQLException;
/**
* 执行更新或者删除的操作
* @param sql
* @param args
* @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);
}
}
}
2、定义具体的实现类
package cn.itcast.jdbc.dao.refactor;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.itcast.jdbc.domain.User;
/**
* 创建Dao的具体实现
*/
public class UserDaoImpl extends AbstractDao {
/**
* 查询方法
* @param loginName
* @return
*/
public User findUser(String loginName) {
String sql = "select id, name, money, birthday "
+ "from user where name = ?";
Object[] args = new Objec
4000
t[]{loginName};
//执行该方法时,执行到这里时,执行到rowMapper方法时,
//会执行下面的rowMapper方法
Object user = super.find(sql, args);
return (User) user;
}
/**
* 模板方法的具体实现
*/
@Override
protected Object rowMapper(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setMoney(rs.getFloat("money"));
user.setBirthday(rs.getDate("birthday"));
return user;
}
/**
* 执行删除操作
* @param user
*/
public void delete(User user) {
String sql = "delete from user where id = ?";
Object[] args = new Object[]{user.getId()};
super.update(sql, args);
}
/**
* 更新操作
* @param user
*/
public void update(User user) {
String sql = "update user set name=?, birthday=?, "
+ "money=? where id = ?";
Object[] args = new Object[]{user.getName(), user.getBirthday(),
user.getMoney(), user.getId()};
//调用父类的更新方法
super.update(sql, args);
}
}
3、编写测试类进行测试
package cn.itcast.jdbc.dao.refactor;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.itcast.jdbc.JdbcUtils;
import cn.itcast.jdbc.dao.DaoException;
/**
* 抽象的公共的Dao
*/
public abstract class AbstractDao {
/**
* 查询的方法
* @param sql
* @param args
* @return
*/
public Object 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();
Object obj = null;
if(rs.next()) {
//对结果集的处理是不同的
obj = rowMapper(rs);
}
return obj;
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
/**
* 模板方法,留给子类去实现
* @param rs
* @return
* @throws SQLException
*/
protected abstract Object rowMapper(ResultSet rs) throws SQLException;
/**
* 执行更新或者删除的操作
* @param sql
* @param args
* @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);
}
}
}
2、定义具体的实现类
package cn.itcast.jdbc.dao.refactor;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.itcast.jdbc.domain.User;
/**
* 创建Dao的具体实现
*/
public class UserDaoImpl extends AbstractDao {
/**
* 查询方法
* @param loginName
* @return
*/
public User findUser(String loginName) {
String sql = "select id, name, money, birthday "
+ "from user where name = ?";
Object[] args = new Objec
4000
t[]{loginName};
//执行该方法时,执行到这里时,执行到rowMapper方法时,
//会执行下面的rowMapper方法
Object user = super.find(sql, args);
return (User) user;
}
/**
* 模板方法的具体实现
*/
@Override
protected Object rowMapper(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setMoney(rs.getFloat("money"));
user.setBirthday(rs.getDate("birthday"));
return user;
}
/**
* 执行删除操作
* @param user
*/
public void delete(User user) {
String sql = "delete from user where id = ?";
Object[] args = new Object[]{user.getId()};
super.update(sql, args);
}
/**
* 更新操作
* @param user
*/
public void update(User user) {
String sql = "update user set name=?, birthday=?, "
+ "money=? where id = ?";
Object[] args = new Object[]{user.getName(), user.getBirthday(),
user.getMoney(), user.getId()};
//调用父类的更新方法
super.update(sql, args);
}
}
3、编写测试类进行测试
package cn.itcast.jdbc.dao.refactor; import org.junit.Before; import org.junit.Test; import cn.itcast.jdbc.domain.User; public class TestRefactor { private UserDaoImpl userDaoImpl; private User user; @Before public void init() { userDaoImpl = new UserDaoImpl(); user = new User(); user.setId(1); user.setBirthday(new java.sql.Date(System.currentTimeMillis())); user.setMoney(23f); user.setName("kaka"); } @Test public void testUpdate() { userDaoImpl.update(user); } @Test public void testDelete() { userDaoImpl.delete(user); } @Test public void testFind() { User user = userDaoImpl.findUser("wangwu"); System.out.println(user); } }
相关文章推荐
- JDBC之使用策略模式和模板方法模式优化代码
- 黑马程序员 JDBC_使用模板方法设计模式处理DAO中的方法(李勇老师)
- 机房重构——模板方法模式+单例模式+存储过程优化组合查询
- 使用模板方法设计模式处理DAO中的查询方法
- 使用模板方法模式简化JDBC操作
- 模板方法模式——【VB.NET机房收费系统(组合查询)】
- JDBC-模板模式优化DAO
- Linq多条件查询优化---使用扩展方法
- 模板方法模式实现组合查询
- linux 设计模式(模板方法)的使用
- JDBC学习笔记(21):使用模板方法设计模式
- 使用spring的jdbcTemplate-----用JDBC模板查询数据库
- Spring整合JDBC模板方法设计模式之基于组合的实现
- 模板方法模式的房间改造-组合查询
- Groovy探索之闭包 七 使用闭包来实现模板方法模式
- DH项目总结一(模板方法模式的使用)
- 菜鸟译文(二)——使用Java泛型构造模板方法模式
- JDBC的CRUD操作中使用模板模式
- 模板方法模式——组合查询的实现
- PHP 模板方法模式使用