1.什么是Mybatis?
1.1、mybatis是数据映射器(数据映射器层 )1.2、mybatis不是直接把类映射为数据库表,而是把sql语句的参数与结果(即输入与输出)映射为类。
2.Mybatis的作用
2.1、Mybatis是三层架构中的数据持久层框架。
2.2、Mybatis对sql语句进行了封装和外部化,使sql语句从程序中分离出来(走配置文件)。业务逻辑从数据库中分离出来,应用程序更容易修改和测试,有更好的可移植性。
3.Mybatis的使用
Mybaits共有四种操作数据的方式
这里使用Mybatis与Spring结合来进行开发
3.1、通过注入SqlSessionTemplate
首先,通过Spirng配置文件配置SqlSessionFactory和SqlSessionTemplate
在dao的实现类中注入SqlSessionTemplate,这样就能使用sqlSession对象提供的方法对数据数据库进行操作了
package com.sunsharing.module.dao.impl;import com.sunsharing.module.dao.TempDao;import com.sunsharing.module.model.User;import org.apache.ibatis.session.SqlSession;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.stereotype.Component;import org.springframework.stereotype.Repository;import javax.annotation.Resource;/** * Created by Administrator on 2015/9/23. */@Repositorypublic class TempDaoImpl implements TempDao { @Resource private SqlSessionTemplate sqlSession; @Override public User getUser(int id) { return (User)sqlSession.selectOne("com.sunsharing.module.dao.TempDao.getUser",id); }
附上sql的配置文件
3.1、继承SqlSessionDaoSupport
同样是操作sqlSession对象,只是是通过继承的方式获得,这里就不详细说了。
3.2、使用MapperFactoryBean
定义dao接口
package com.sunsharing.module.dao;import com.sunsharing.module.model.User;/** * Created by panyz on 2015/9/23. */public interface UserDao { public User getUser(int id); public void addUser(User user); public void updateUser(User user); public void deleteUser(int id);}
配置sql
接下来要做什么呢?按照之前获得取qlSession的方法,你可能会想到,接下来应该就是实现dao接口提供实现类了吧。
但是其实我们的工作已经完成了,MapperFactoryBean的出现为了代替手工使用SqlSessionDaoSupport或SqlSessionTemplate编写数据访问对象(DAO)的代码,使用动态代理实现。具体实现其实就是
com.sunsharing.module.dao.UserDao是一个接口,我们创建一个MapperFactoryBean实例,然后注入这个接口和sqlSessionFactory(mybatis中提供的SqlSessionFactory接口,MapperFactoryBean会使用SqlSessionFactory创建SqlSession)这两个属性。之后想使用这个UserDao接口的话,直接通过spring注入这个bean,然后就可以直接使用了,spring内部会创建一个这个接口的动态代理。如此这般,我们就不需要编写实现类了,少写了好多代码,又可以多花点时间陪女朋友了。
但这样还不够,虽然不用自己编写实现类,但是需要为每一个dao接口配置一个MapperFactoryBean,还是有点麻烦,为了更加节省时间陪女票,于是mybatis-spring提供了MapperScannerConfigurer这个类,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。
MapperScannerConfigurer会扫描com.sunsharing.module.dao下所有的接口,为其创建动态代理。
4.Mybatis与Hibernate对比
4.1、开发对比
学习成本:
Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。
开发社区:
Hibernate 与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快。
开发工作量:
Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
4.2、调优对比
sql优化:
Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段,更重要的是,sql写在配置文件中,后期可以请专业dba来优化。扩展性:
Hibernate与具体数据库的关联只需在XML文件中配置数据库方言即可,所有的HQL语句与具体使用的数据库无关,移植性很好。MyBatis项目中所有的SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持不好。5.Mybatis与Hibernate总结
5.1、Hibernate
优点:Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
缺点:Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
5.1、Mybatis
优点:Mybatis入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
缺点:Mybatis的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。