入职不久,我所了解的数据存储框架周边常用到的有两种:Hibernate和Mybatis。对于这两种框架的区别,简单了解到的是Hibernate较重,学习成本较高,但功能也比Mybatis强大一点。由于对Mybatis不甚了解,没法展开对比。由于自己的业务用的框架是Hibernate,平时总是浅尝则止,了解业务,走读代码的时候遇到DAO层就犯怵。所以这篇主要是想记录我在网上所学到的关于Hibernate框架的一些基础知识,便于理解后续的如何给普通的程序以及Spring框架整合上Hibernate,这样就告别sql了。
Hibernate框架是什么?(截取百度百科中的总结)
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通实体类。其中有一些属性及其getter setter方法的类,没有业务逻辑。有时可以作为VO(value object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的。这篇文章 https://blog.csdn.net/u010772673/article/details/54948815 把JavaEE三层结构说的简短明了。Hibernate所处的位置便是第三层DAO层。
学习Hibernate框架,离不开ORM思想。ORM是什么?
Object Relation Mapping(对象关系映射)思想,是让实体类(上述的POJO)中的类属性与数据库中表的字段一一对应。且不需要对数据库表进行CRUD的操作,而是对实体类对象中的属性进行操作。最后通过Hibernate封装了所有CRUD功能的Session对象来处理实体类的对象。不需要我们关注数据库的加载驱动,创建数据库链接,写sql语句,以及为了防止命令注入而创建preparedStatement来执行sql以及得到返回结果。(注:这种一一对应关系可通过配置文件,或者java注释的方式来完成,后面的代码会有展示)
基本概念理清后,开始尝试代码:
平时普通的程序基本上都是如下的操作方式,即使用数据库的最基本步骤:
然而,当使用框架后,为了Hibernate全自动框架带来的便捷,自然使用前的配置要多一些。但记住步骤,也并不繁琐,如下:
第一步:导入依赖。如果不是maven项目的话,有点麻烦,首先要知道hibernate框架运行需要依赖哪些jar包,同时还要手动导入这些jar包到lib下,并添加到build path(也就是java命令运行程序的时候 会有一个set classpath的设置,告诉程序运行所依赖的jar包都去哪找class文件)。但是如果我们使用的maven项目,直接可以在pom配置文件中添加对hibernate的依赖就好,maven会帮助我们下载所需的相关依赖,如下:
External lib中就可看到相关依赖包的下载,除了hibernate核心jar,还能看到其他jar包关于xml解析fasterxml,xml与java对象映射的JAXB,还有关于实体类注解的javax.persistence:
需要一提的是Hibernate并不会帮助下载数据库相关驱动器,用户需要根据自身需求,用什么数据库,pom就添加对应驱动的依赖。我使用的是mysql数据库,所以pom中添加的依赖是:
第二步:创建实体类。公司的项目数据库中的表就没有创建语句,而是靠自动生成。学习了Hibernate,才了解这是他的特性之一。当在配置文件hibernate.cfg.xml中,<property name="hbm2ddl.auto">update</property> 配置为update值时,启动hibernate时会自动检查数据库,更新表结构。当升级Spring框架时,其支持的Hibernate版本也有相应要求,发现数据库中表的生成后,有个别字段的类型就有变化。也是跨版本较大,注释没有限制死,导致默认项有变更出现的坑。这种问题主要是实体类与数据库字段的映射,用户并不需要声明数据库中自动生成的字段类型type,而是通过实体类中的属性类型而定的。当然也可以在映射关系的配置中去强制性声明。一般实体类名称可以叫做***PO类,如下:
第三步:根据PO实体,配置实体类与数据库表字段的关系。
下图便是对TaskPO实体类的映射关系配置文件,当然当你的model很多时,一个配置文件中自然可以配置多个类的映射关系。注意,class标签的name属性需要配置的是实体类的全路径,也就是包名加实体类名称。而table对应的就是数据库的表名称。上述讲过,Hibernate有特性可以帮助我们创建表,但注意不能帮我们创建数据库。
第四步:配置Hibernate核心配置文件
核心配置文件中主要配置1)数据库信息如:url,账户,密码等。2)Hibernate相关配置项,如:是否需要自动创建表,是否显示执行sql语句等。3)Hibernate框架只会加载核心配置文件,所以像上述映射关系配置文件同样需要配置在核心配置文件中。且不同于映射配置文件,其名称(hbernate.cfg.xml)与路径(src下)是固定的,也可以代码中指定路径。配置如下:
好,接下来就可以测试以上配置了。如何测试呢?有以下步骤:
1)首先,我们需要Hibernate框架加载其核心配置文件,
2)加载后创建SessionFactory,有了工厂类,便可以得到相应Session,
3)开启事务。
4)相关CRUD操作后把事务提交,并关闭资源。
注意:为什么要手动开启事务呢?这就涉及数据库中的基本概念,数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。最简单的例子就是银行转账了,一个出,一个入,要么全完成,要么全失败。具体代码如下:
执行成功的结果如下,过程中如果核心配置文件中数据库相关信息配置错误会报错。PO对象中主键自增加类型不为int会报错,PO实体类属性与映射关系文件不对应会报错,核心配置文件中数据库方言配置有误也会出现问题等:
后面会继续更新如何用Spring框架与Hibernate整合...TBD