前言
在javaweb开发中,最经典的就是ssh框架组合和ssm框架组合,现在很多it公司愿意使用ssm,对于这里的h和m即hibernate和mybatis,今天简单来说道说道。
班门弄斧
上课时,我经常跟学生说,学习任何一门技术,一定要弄明白:
- what:这个东西是什么?连这个技术是什么都说不清,人家会相信你精通吗?
- why:为什么要用?不要盲目学,一门技术的产生肯定有其背后的原因,解决了一个什么难题?还是简化了开发等等?
- when:什么时候需要用?学完了不会灵活运用也不行。
- how:怎么用?首先最重要的弄清楚原理,多思考,多应用,多犯错,才会成长。
知识讲解
hibernate和mybatis都是很流行的orm(对象关系映射,说白了就是一种和数据库进行映射的技术)持久化层框架,其实质是还是对jdbc进行了封装,方便我们使用,简化我们的开发。先弄明白几个问题:
- 什么是对象持久化:说白了就是把对象保存到数据库或者文件中
- 传统开发:界面(view) --------- 业务层(sql语句) --------- 数据库
-
产生的问题:
一旦更换底层的数据库,很多操作都要重写
jdbc冗余代码过多(这是hibernate发明的最初动力) - 引入持久层开发:界面(view) --------- 业务层(hql语句、动态查询语句) --------- 持久层 --------- 数据库
为什么引入持久层就可以解决这个问题呢?解析:在持久层可以引入一个机制,当作一个翻译,针对底层不同的数据库,把hql语句、动态查询语句翻译成不同的sql语句,这样就解决了更换数据库后也不需要改sql语句的问题,而且代码量也会大大降低。
说的这么好,那么hibernate和mybatis到底是怎么实现上述所说的方案的呢,也就是他们的orm怎么来实现?
hibernate
在hibernate中这个机制就是一个配置文件hibernate.cfg.xml(放在src目录下)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<hibernate-configuration> <session-factory> <property name= "connection.url" >jdbc:mysql: //localhost/hibernate</property> <property name= "connection.username" >root</property> <property name= "connection.password" >saber</property> <property name= "connection.driver_class" >com.mysql.jdbc.driver</property> <property name= "dialect" >org.hibernate.dialect.mysqldialect</property> <!-- ddl语句自动建表 --> <property name= "hbm2ddl.auto" >none</property> <property name= "show_sql" > true </property> <property name= "format_sql" > true </property> <!-- 连接池配置 --> <property name= "hibernate.connection.provider_class" > org.hibernate.service.jdbc.connections.internal.c3p0connectionprovider </property> <!-- 连接池中jdbc连接的最小数量。hibernate默认为 1 --> <property name= "hibernate.c3p0.min_size" > 5 </property> <!-- 连接池中jdbc连接的最大数量。hibernate默认为 100 --> <property name= "hibernate.c3p0.max_size" > 20 </property> <!-- 何时从连接池中移除一个空闲的连接(以秒为单位)时。默认为 0 ,永不过期 --> <property name= "hibernate.c3p0.timeout" > 300 </property> <!-- 被缓存的预编译语句数量。用来提高性能。hibernate默认为 0 ,缓存不可用--> <property name= "hibernate.c3p0.max_statements" > 100 </property> <!-- 一个连接被自动验证前的闲置时间(以秒为单位)。hibernate默认为 0 --> <property name= "hibernate.c3p0.idle_test_period" > 3000 </property> <!-- 独立线程运行,如果通过getcurrentsession()来获得session,需要设置如下--> <property name= "current_session_context_class" >thread</property> <!-- 映射持久化类 两种方式--> <mapping class = "com.serup.model.teacher" /> <mapping resource= "com/serup/model/teacher.hbm.xml" /> </session-factory> </hibernate-configuration> |
一旦项目换了数据库,需要修改的就是这个文件中的几个属性而已,业务层的逻辑代码不需要做任何修改。
使用hibernate进行开发推荐这么干:
** domain object ----> mapping ----> database 也就是说对象和表要有一种映射,这种映射在hibernate中有两种配置方式**
1、xml方式(类名.hbm.xml)
通过hbm文件建立表和类的映射关系
2、 annotation方式
后来有了逆向工程,就简单多了,直接通过数据库表生成对应的文件即可。
mybatis
在mybatis中这个机制也是靠一个配置文件mybatis-config.xml(放在src目录下)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<configuration> <properties resource= "sqlserverinfo.properties" /><!--数据库的配置文件--> <typealiases> < package name= "com.demo.domain" /> <!--扫描类型别名的包 也可以单独扫描某个文件--> </typealiases> <environments default = "development" > <environment id= "development" > <transactionmanager type= "jdbc" /> <datasource type= "pooled" > <property name= "driver" value= "${driver}" /> <property name= "url" value= "${url}" /> <property name= "username" value= "${username}" /> <property name= "password" value= "${password}" /> </datasource> </environment> </environments> <mappers> <!--映射文件完成具体的crud操作 --> <mapper resource= "com/demo/domain/usermapper.xml" /> </mappers> </configuration> |
这样每次换数据库,也只需要修改一下配置文件即可。
使用mybatis进行开发推荐这么干:
** 建数据库,创建各种表 ---> 逆向工程自动生成mybatis执行所需要的代码(mapper.java,mapper.xml、po..) ---> 根据业务逻辑写控制层和服务层。**
不同点
网上有各种对比,我只谈个人觉得的几点不同的地方
1、hibernate有一个面向对象的查询语言叫hql,这个非常强大,可以让不会sql语句的猿也可以进行数据库的增删改查,但这也是它的一个弱项,sql语句不能进行优化。
2、mybatis需要进行sql语句的配置,也就是说还是需要数据库的基础知识才能上手的,而且初学者在结果映射那块肯定遇到的坑很多。
3、没做过特别大的项目,如果对性能没特别特别的要求,hibernate还是更容易实现功能。
系统调优
hibernate的调优方案
- 制定合理的缓存策略;
- 尽量使用延迟加载特性;
- 采用合理的session管理机制;
- 使用批量抓取,设定合理的批处理参数(batch_size);
- 进行合理的o/r映射设计
mybatis调优方案
- mybatis在session方面和hibernate的session生命周期是一致的,同样需要合理的session管理机制。mybatis同样具有二级缓存机制。 mybatis可以进行详细的sql优化设计。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://www.jianshu.com/p/ba6e0de9fa52