一、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改到哭( ▼-▼ )