您的位置:首页 > 其它

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 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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息