前言
在JavaWeb开发中,最经典的就是SSH框架组合和SSM框架组合,现在很多IT公司愿意使用SSM,对于这里的H和M即Hibernate和MyBatis,今天简单来说道说道。
班门弄斧
上课时,我经常跟学生说,学习任何一门技术,一定要弄明白:
知识讲解
Hibernate和MyBatis都是很流行的ORM(对象关系映射,说白了就是一种和数据库进行映射的技术)持久化层框架,其实质是还是对JDBC进行了封装,方便我们使用,简化我们的开发。先弄明白几个问题:
为什么引入持久层就可以解决这个问题呢?解析:在持久层可以引入一个机制,当作一个翻译,针对底层不同的数据库,把HQL语句、动态查询语句翻译成不同的SQL语句,这样就解决了更换数据库后也不需要改SQL语句的问题,而且代码量也会大大降低。
说的这么好,那么Hibernate和MyBatis到底是怎么实现上述所说的方案的呢,也就是他们的ORM怎么来实现?
Hibernate
在Hibernate中这个机制就是一个配置文件java/282634.html">hibernate.cfg.xml(放在src目录下)
<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目录下)
<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的调优方案
Mybatis调优方案
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对VeVb武林网的支持。
新闻热点
疑难解答
图片精选