当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    Java Web学习教程之Hibernate And MyBatis的理解

    栏目:win服务器问题汇总 时间:2019-11-25 16:18

    前言

    在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目录下)

    <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>