【项目总结】持久化工具 hibernate VS mybatis

一、What?

1、在项目中用到的hibernate举例:

    /**
     * 根据选题Id查询已选学生学号--2016年8月20日16:05:30
     * @param tgdTopic
     * @return
     */
    public List<TgdConnection> queryStudentByTopicId(String tgdTopic){

        String hql="From TgdConnection where tgdTopic=:tgdTopic and isDelete =:isDelete";
        Map<String,Object> map = new HashMap<String,Object>();

        map.put("tgdTopic", tgdTopic);
        map.put("isDelete", 0);
        List<TgdConnection> listConn = this.query(hql, map);        

        return listConn;        
    }

可以看出hibernate是用hql语句查询的,hql的参数序列化为map辅助查询。

2、项目中遇到的mybatis举例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.dmsd.trine.graduateDissertation.dto.TgdFildDto">

    <select id="selectfildBystudentNo" parameterType="String" resultType="com.dmsd.trine.graduateDissertation.dao.StudentCourseDao">
        SELECT c.id as courseId,c.name as courseName,
        cs.studentId as studentCode
        FROM t_course c ,t_coursestudent cs
        WHERE c.id = cs.courseId AND c.studentId = #{ studentId }
    </select> 

</mapper>

是写在core层mapper下的一个xml文件,select标签下用sql语句做多表查询,参数类型和返回的数据类型都是自己定义的。

二、why?
在没有hibernate和mybatis,J2EE的JDBC就是实现数据库访问的低端接口,就是原始的数据库访问API或访问规范。我们看一下它的经典访问模式:

Connection con = DriverManager.getConnection("jdbc:odbc:wombat","login","password");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) {
int x = rs.getInt("a");
String s = rs.getString("b");
float f = rs.getFloat("c");
}

先对数据库,写查询语句,反序列化取值。
由此也能看出来,之所以要对它进行封装是首先因为每次调用都要写数据库连接,这是需要抽象出来;其次项目扩展到一定级别数据库的查询势必会从程序化向ORM,EJB在3.0的时候把实体bean单独整理成JPA规范就是很好的例证。
为了解决这些问题,叫持久层 开发框架也好,数据库中间件也行的各类量级的产品大行其道,hibernate和mybatis是其中非常优秀、非常流行的两个。

三、how?
hibernate和mybatis都实现了OR映射,都有相应的代码生成工具,可以根据数据库逆向生成简单的POJO,像上面代码展示一样,它们使用上各有千秋。

hibernate对JDBC提供了非常完整的封装,把数据封装成一个个对象,实现了POJO和数据库表之间的映射,更面向对象化。hibernate已经脱离sql的语言环境,它自己的一套hql则是对sql语句的封装,对开发人员来说,这种面向对象的设计不需要知道太多数据库里的库表结构、开发非常快。同时底层非常复杂,难以知道是sql语句的生成和运行。这在项目完成阶段,就算测试出哪些语句运行慢,也不好改sql,运维就有些难度。

mybatis则是OXR结构,用映射配置文件的方法灵活的的处理POJO的Relation,可以直接用sql语言进行在多表联查等操作,把返回结果映射到指定POJO上,可以进行更为细致的sql优化,也更容易掌握。相对Hibernate“O/R”而言,Mybatis 是一种“Sql Mapping”的ORM实现。这也要求开发人员非常熟悉数据库的表、字段等的意义。

另:hibernate对JDBC的一次封装,mybatis是基于原生的JDBC,mybatis在运行速度有天生的优势。单表操作上,相对与mybatis需要扫描配置文件,hibernate效率比较高,mybatis每次都要写返回对应的返回实体,批量查询hibernate比较快。然而高并发的多表操作上,hibernate测试是比mybatis慢的,而且有不规范对象的hql也不好写。hibernate前期开发挺痛快,后期维护的时候,奇葩需求非常多,hql改到哭( ▼-▼ )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值