使用Spring也是蛮多的!也用SSM框架做了一些小型项目,当然这些项目使用的都是三层MVC架构!其中DAO层也是很关键的一层。刚开始做的时候,代码结构都是这样写的!
1 /** 2 * 用于查询数据库 3 * @author 张荣 4 * @since 2015-12-18 5 */ 6 public class SelectDAOImpl implements SelectDAO{ 7 8 @Override 9 public List<Message> queryUserMessageById(int id) { 10 SqlSession sqlSession = DB.getSqlSessionFactory().openSession(); 11 User user =sqlSession.selectOne(DAOMappperUrl.QUERY_USER_MESSAGE_BY_ID.toString(), 1); 12 if (user.getMessages() == null) { 13 user.setMessages(new ArrayList<Message>()); 14 } 15 DB.closeSqlsession(sqlSession); 16 return user.getMessages(); 17 } 18 19 @Override 20 public List<Admin> queryAllAdminOrById(int adminId) { 21 SqlSession sqlSession = DB.getSqlSessionFactory().openSession(); 22 List<Admin> admins =sqlSession.selectList(DAOMappperUrl.QUERY_ALL_ADMIN_OR_BYID.toString(), adminId); 23 if (admins == null) { 24 admins = new ArrayList<Admin>(); 25 } 26 DB.closeSqlsession(sqlSession); 27 return admins; 28 } 29 }
以上贴出的知识一个DAO类的代码,从上面可以看得出来。每一个方法中,有一个一模一样的流程:先得到Sqlsession对象,再调用Sqlsession的select方法,最后关闭Sqlsession对象并将查询到的结果返回!我们很容易就能抽象出一个模板!代码如下:
1 /** 2 * @title: AbstractTemplate 3 * @description: 抽象模板类 4 * @author: 张荣 5 * @date: 2016年3月12日 6 */ 7 public abstract class AbstractTemplate<T>{ 8 9 protected SqlSession openSession(){ 10 return DBUtils.getSqlSessionFactory().openSession(); 11 } 12 13 protected void closeSession(SqlSession sqlSession){ 14 DBUtils.closeSqlsession(sqlSession); 15 } 16 17 public List<T> findById(T paramter){ 18 SqlSession sqlSession = openSession(); 19 List<T> rseultList = getResultCollection(sqlSession , paramter); 20 closeSession(sqlSession); 21 return rseultList == null ? new ArrayList<T>() : rseultList; 22 } 23 24 public abstract List<T> getResultCollection(SqlSession sqlSession , T paramter); 25 }
接下来一个去继承这个类,代码如下:
1 /** 2 * @title: DAOTemplate 3 * @description: 4 * @author: 张荣 5 * @date: 2016年3月12日 6 */ 7 public class DAOTemplate extends AbstractTemplate<User>{ 8 @Resource(name = "userDAOImpl") 9 private UserDAO userDAO; 10 @Override 11 public List<User> getResultCollection(SqlSession sqlSession, User paramter) { 12 // TODO Auto-generated method stub 13 return null; 14 } 15 }
显然,使用这种模板模式来设计类,其效果肯定要比上一种好,或者说,使用模板方法之后。DAOTemplate类的职责更加清晰,只需要中间的最核心部分代码!而不需要一直重复写得到Sqlsession和关掉Sqlsession对象的方法!使得程序的逻辑结构更加的清晰明了!
话虽如此,但是仔细一想,问题还是来了。上面只是写了根据用户id来查询用户信息的方法。但如果需要一个查询所有用户信息的方法(findAll),岂不是又得在AbstractTemplate类中定义一个与findById函数体几乎一样的方法么吗?(只需要把中间部分getResultCollection()方法签名换一下)但这样做的话,在抽象父类中也是存在大量雷同的代码!岂不和原来的方法就没什么区别了!这肯定不是我们想看到的!但是仔细分析一下,也不是说一点办法也没有!也就是说,我们可以使用另外一种设计模式:代理模式来解决这个问题!来产生不同的代理类!而Spring中的确也是使用这种方法来达到这个目的!只需要配置MapperScannerConfigurer,SpringIOC就帮我们把这个工作做了!(如有兴趣:参看我写的另外一篇博客:电商平台学习笔记(四)——SPRING配置MYBATIS简化DAO层省略MYBATIS核心配置文件)
好了,博客到此为止!
浙公网安备 33010602011771号