hibernate易混淆点
萌新小笔记:
用过hibernate的小伙伴肯定经常看到这几个东西吧!但是初学者常常会把这几个搞不清楚:dataSource,session,sessionFactory(dataSource),hibernateTemplate(sessionFactory),hibernateDaoSupport(sessionFactory)
我会每一种是什么说一下并且演示一下用法:
dataSource:一般都称呼为数据源或者连接池,就是配置连接数据库的几个东西,驱动、url、用户名、密码,配置了这些东西就能连接数据库,而且还是自动帮你去连接(不用我们像学jdbc时候手动去加载驱动,然后获取连接.....写这种代码太机械化了),而且还能保证其中几个连接是已经连接好数据库了的,不需要我们用的时候再去慢慢连,那样黄花菜都凉了。想象成一个池子,里面有很多的鱼,这些鱼负责去给你向数据库连接发送sql等类型的语句,这些鱼不需要你去销毁,连接完数据库之后又会回到池子里游啊游
一般就是下图这样的(部分截图)
session:简单来说就是叫做会话(大白话说就是Java程序和数据库的一次交互,跟数据库打了一次交道),貌似这个session是线程不安全的,所以每次用这个session都需要获取session,开启事务,xxx,关闭事务,关闭session....不要和http协议的那个session弄混了。这个session还起到了缓存的作用,emmmm,貌似hibernate的以及缓存就在这里吧!这个东西初学时候用的太多了,用法就略过。
sessionFactory(可以直接用于Dao层,但是必须和当前session配合使用):顾名思义,叫做session工厂,专门生产session的工厂(一个项目是会用一个数据库,一个sessionFactory就可以了),这个的作用是起到缓冲的作用,缓冲一些hibernate自动生成的sql,还有可能重复用到的一些数据(这个我也不知道hibernate怎么知道这个数据我就要重复利用....emmm...); 而且,很明显,要把数据源放到sessionFactory里面,不然数据库都连不到,缓冲个鬼啊!
一般配置如下(部分截图):
HibernateTemplate(可以用于Dao层):用sessionFactory也挺麻烦。每次都要获取session、虽然hibernate就给你自动做了一些工作,比如事务操作给你放到service层去控制了,你在Dao层就专心跟数据库打交道就行(crud方法);用hibernateTemplate相当于进一步对session的方法进行封装和优化,并且让你更简单的使用,所以hibernateTemplate要用到sessionFactory
配置文件配置hibernateTemplate,在Dao中,直接@Autowired就能拿到了。
HibernateDaoSupport类(用于Dao层):这个类其实就是一个工具类,这个本质上和上面一种方案一样,是对HibernateTemplate的一次封装;可能Hibernate觉得让你自己去配置文件里配置,然后通过注解去获得也太麻烦了(xml中不用配置hibernateTemplate),直接给你一个类,你只要继承我,然后给我一个sessionFactory,我就能给你HibernateTemplate这个模板,你尽管用,由此,可以看得出hibernate简直就是让你越来越少的接触底层代码,你越轻松越简便越好。
通常配置如下:
补充一个事务管理器的配置:spring用自己的jdbcTemplate(本质上就是对jdbc简单的封装,发送的是原始sql语句)时候配置的事务管理器:
用hibernate时候配置的事务管理器:注入的是sessionFactory
在所有的事务管理器配置完了之后,不要忘记加一句,<tx:annotation-driven transaction-manager="事务管理器的id" /> 【可以让你用注解去使用事务】,这样你就能直接在service层类或者方法用@Transactional注解去进行事务管理了。
使用hibernate框架时Dao层写法真的有很多种,但是总的来说就是这几个东西,有没有发现,都是各种注入sessionFactory ,而dataSource却很少用到。
总结一下:
你只要用hibernate框架,dataSource你只用一次,就是注入到sessionFactory里面,其他的都是注入sessionFactory。 sessionFactory【datasource】,hibernateTemplate【sessionFactory】,hibernateDaoSupport【sessionFactory】,hibernate事务管理器【sessionFactory】
假如你不用hibernate,就用spring自带的jdbcTemplate, 你只会用到dataSource,比如事务管理器等等