hibernate与mybatis异同与比较
作者:互联网
1 hibernate与mybatis异同
1.1 引言
最近一直用mybatis
做开发,以前用过hibernate
,能感受到一些它们在使用上的区别,不过总想抽出时间来好好比较比较弄弄清楚它们各自的优劣,以便更好进行选择和深入的了解。
网上也看了很多资料,结合自己的使用体会,粗率地概括和总结了一下,以供大家参考。
1.2 具体运用上的不同
1.2.1 所需的jar包
Mybatis
:只需要3个(mybatis-3.1.1.jar,mybatis-3.1.1-javadoc.jar,mybatis-3.1.1-sources.jar
)
Hibernate
:根据功能不同大概需要十几个
1.2.2 映射关系
Mybatis
:实体类与sql
之间的映射
Hibernate
:实体类与数据库之间映射
1.2.3 配置文件
Student类:
属性:
int id,String name,String password;
方法配置:
getStudentByName; //通过name查找
getStudentById //通过id查找
insertStudent //添加Student
updateStudent //更改Student
deleteStudent //通过id删除Student
deleteStudentById //通过name伤处Student
selectStudentmohu //通过name模糊查询
Mybatis:
总配置文件:
mybatisConfig.xml
<configuration>
<typeAliases>
<typeAlias alias="Student" type="com.niit.model.Student"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/niit/model/StudentMap.xml"/>
</mappers>
</configuration>
实体类映射文件:StudentMap.xml(一个或多个)
<mapper namespace="com.niit.model.StudentMap">
<select id="getStudentByName" resultType="Student"
parameterType="string">
select * from student where name=#{name}
</select>
<select id="getStudentById" resultType="Student" parameterType="int">
select * from student where id=#{id}
</select>
<insert id="insertStudent" parameterType="Student">
insert into student(id, name, password) value(#{id}, #{name}, #{password})
</insert>
<update id="updateStudent" parameterType="Student">
update student set name=#{name}, password=#{password} where id=#{id}
</update>
<delete id="deleteStudent" parameterType="String">
delete from student where name=#{name}
</delete>
<delete id="deleteStudentById" parameterType="int">
delete from student where id=#{id}
</delete>
<select id="selectStudentmohu" parameterType="String"
resultType="Student">
select * from student where name like "%"#{name}"%"
</select>
</mapper>
Hibernate:
总配置文件:hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/sample</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect </property>
<property name="connection.password">123</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.show_sql">True</property>
<mapping resource="com/niit/model/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
实体类配置文件:Student.hbm.xml(一个或多个)
<hibernate-mapping package="com.niit.model.">
<class name="Student" table="student">
<id name="id" column="id" type="int"><generator class="identity"/> </id>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>
1.2.4 基本用法(增删改查模糊)
1.2.4.1 Mybatis
@Test
select by name
public void test() throws IOException{
String resource = "mybatisConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
session.selectOne("com.niit.model.StudentMap.getStudentByName","b");
}
select by id
session.selectOne("com.niit.model.StudentMap.getStudentById",2);
insert
session.insert("com.niit.model.StudentMap.insertStudent", student);
update
session.insert("com.niit.model.StudentMap.updateStudent", student);
delete by name
session.insert("com.niit.model.StudentMap.deleteStudent", "wl");
delete by id
session.insert("com.niit.model.StudentMap.deleteStudentById", 3);
select muhu(模糊查询)
session.selectList("com.niit.model.StudentMap.selectStudentmohu", "b");
1.2.4.2 Hibernate
select by id
Configuration cfg = new Configuration().configure();
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
Session.get(Student.class,id);
select by name
session.createQuery("from Student as s where s.name =’a’").list();
insert
session.save(Student);
update
Session.update(Student) ;
delete by name
Session.delete (Student) ;
delete by id
User user = new User();
user.setId(1);
session.delete(user);
select muhu(模糊查询)
session.createQuery("from Student as s where s.name like '%"+str+"%'").list();
1.2.5 与Spring的整合
1.2.5.1 Mybatis
配置数据源文件
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property
name="url" value="jdbc:mysql://127.0.0.1:3306/spring?useUnicode=true&characterEncoding=UTF-8>
</property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
<property name="maxActive" value="100"></property>
<property name="maxIdle" value="30"></property>
<property name="maxWait" value="500"></property>
<property name="defaultAutoCommit" value="true"></property>
</bean>
配置sqlsessionfactory(将数据源注入)
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:MyBatis-Configuration.xml"></property>
<property name="dataSource" ref="dataSource" />
</bean>
在Dao实现层中通过spring Ioc 愉快使用SqlSessionFactory
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.mybatis.UserDao"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
1.2.5.2 Hibernate
配置数据源文件
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
配置sessionfactory(将数据源注入)
<bean id="sf"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<value>com.niit.model</value></list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
配置hibernatetemplete(将SessionFactory注入)
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sf"></property>
</bean>
1.2.6 注解支持
1.2.6.1 mybatis
启用注解并注入testMapper
@Repository("testBaseDAO")
@Autowired
@Autowired
public void setTestMapper(@Qualifier("testMapper") TestMapper testMapper) {
this.testMapper = testMapper;
}
@SelectProvider(type = TestSqlProvider.class, method = "getSql")或@Select("select * from ....")(SelectBuilder/SqlBuilder)
@InsertProvider(type = TestSqlProvider.class, method = "insertSql")
@DeleteProvider(type = TestSqlProvider.class, method = "deleteSql")
@Options(flushCache = true, timeout = 20000)
@UpdateProvider(type = TestSqlProvider.class, method = "updateSql")
@Param("id")
@Result(id = true, property = "id", column = "test_id")
1.3 各种效果上的不同
Hibernate
是全自动ORM
框架,而Mybatis
是半自动的。hibernate
完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean
对象与数据库的映射结构来自动生成sql
。而mybatis
仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql
来实现和管理。hibernate
数据库移植性远大于mybatis
。hibernate
通过它强大的映射结构和hql
语言,大大降低了对象与数据库(oracle、mysql
等)的耦合性,而mybatis
由于需要手写sql
,因此与数据库的耦合性直接取决于程序员写sql
的方法,如果sql
不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。hibernate
拥有完整的日志系统,mybatis
则欠缺一些。hibernate
日志系统非常健全,涉及广泛,包括:sql
记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis
则除了基本记录功能外,功能薄弱很多。- 缓存方面都可以使用第三方缓存,但是
Hibernate
的二级缓存配置在SessionFactory
生成的配置文件中进行详细配置,然后再在具体的表-对象
映射中配置是那种缓存,而Mybatis
的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis
可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref
来实现。
4.Mybatis
非常简单易学,hibernate
相对较复杂,门槛较高。
5.二者都是比较优秀的开源产品
6.当系统属于二次开发,无法对数据库结构做到控制和修改,那Mybatis
的灵活性将比hibernate
更适合
7.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的sql
语句(或存储过程)才能达到系统性能设计指标,在这种情况下Mybatis
会有更好的可控性和表现,可以进行细粒度的优化。
8.Mybatis
需要手写sql
语句,也可以生成一部分,hibernate
则基本上可以自动生成,偶尔会写一些hql
。同样的需求,Mybatis
的工作量比hibernate
要大很多。类似的,如果涉及到数据库字段的修改,hibernate
修改的地方很少,而Mybatis
要把那些sql mapping
的地方一一修改。
9.以数据库字段一一对应映射得到的po
和hibernte
这种对象化映射得到的po
是截然不同的,本质区别在于Mybatis
这种po
是扁平化的,不像映射的po
是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。
10.hibernate
现在已经是主流o/r mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于Mybatis
1.4 总结
mybatis:小巧、方便、高效、简单、直接、半自动
hibernate:强大、方便、高效、复杂、绕弯子、全自动
转载于:http://blog.csdn.net/chenleixing/article/details/43818611
标签:hibernate,name,1.2,异同,Mybatis,mybatis,id 来源: https://www.cnblogs.com/jingzh/p/16218079.html