现在的位置: 首页 > 综合 > 正文

之前关于userDao.save()方法的困惑

2017年12月27日 ⁄ 综合 ⁄ 共 1080字 ⁄ 字号 评论关闭

(之前记录下的学习笔记)

         之前困惑的save()方法的调用,userDao.save()方法的调用,其实要理解背后的原理。。。。就是要先理解Hibernate的实现原理,spring的注入,spring和Hibernate的整合Dao。理解了Hibernate底层怎么实现数据持久化,就知道了this.getHibernateTemplate().save(entity);中的save()方法是由Hibernate封装出来的,底层其实就是生成了一条insert sql语句!update()就是生成一条update语句,delete()就是生成一条delete语句,query就是生成一条select语句,list()也是生成一条select
*语句,然后各种查询条件就是一段段的where语句……最后恍然大悟,soga,原来就是这么回事,具体的封装实现方法,可以研究下Hibernate源码,看里面是如何通过反射等实现ORM的。
    其次,要解决userDao.save()调用的实际上是userDaoImpl.save()方法的困惑,其实就是要理解spring的ioc,无论通过xml配置还是通过注解,实质就是在spring容器中注册了一个bean,<bean id="userDao"class="com.xxx.userDaoImpl" />,再将这个userDao注入到userService中使用。也就是说通过spring容器的管理,我们调用userDao的bean的时候,spring是会找到userDaoImpl实现类来实现的,通过注入,调用userDao就是相当于调用了实现类userDaoImpl。所以这里的userDao.save(),实际上就是调用了userDaoImpl.save()。不知道我说清楚了没有。
    关于spring和Hibernate的整合后的Dao层封装,有很多可以供选择的技术实现,比如直接操作sessionFactory,HibernateTemplate,HibernateDaoSupport,或者操作JDBCTemplate。之所以要封装DAO,是为了更好地实现解耦合。实现方式有初期的一个实体对应一个dao,不然user对应userDao,userDaoImpl;这种方式当实体很多的时候缺点就暴露了,会导致代码很臃肿。另一个实现就是采用泛型Dao,通过泛型Dao就只需有一个基础的BaseDao,通过java反射技术,在这个BaseDao中可以取到各个实体的类信息,进而进行crud操作,避免了臃肿。

【上篇】
【下篇】

抱歉!评论已关闭.