MyBatis基本概念
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息。将接口和Java的POJO映射为数据库中的记录
SqlSessionFactory
每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心,SqlSessionFactory可以通过SqlSessionFactoryBuilder通过读取XML或者从一个预先定制的Configuration构建。
XML配置文件包含DataSource、TransactionManager。
SqlSession可以从SqlSessionFactory中获得
Mapper Instances
映射器是创建用来绑定映射语句的接口。映射器接口的实例是从SqlSession中获得的。
总体的生成顺序为SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession -> Mapper -> POJO
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
优缺点
优点
- 易于上手和掌握
- sql卸载xml里,便于统一管理和优化
- 接触sql与升序代码的耦合
- 提供映射标签,支持对象和数据库的ORM映射关系
- 提供xml标签,支持动态sql
缺点
- sql工作量大,多字段多关联时尤其明显
- sql依赖于数据库,导致数据库移植性差
- 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
- 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
- DAO层过于简单,对象组装的工作量较大。
- 不支持级联更新、级联删除。
- 编写动态sql时,不方便调试,尤其逻辑复杂时。
常见问题
MyBatis与Hibernate的对比
MyBatis是一个半自动化的ORM框架,需要自己编写sql而Hibernate是一个全自动化的。
MyBatis学习门槛低,更容易操作原生SQL,方便调优,但工作量更大。
Hibernate对象/关系映射能力强,数据库无关性好,可以不写SQL减少很多工作量。但是学习门槛更高,想要对SQL进行调优需要比较精通。
#{}和${}的区别是什么?
#{}是占位符替换,相当于’?’替换为对应的参数,可以防止SQL注入。
${}是纯为本替换,相关与sql的简单拼接,可以动态拼接表名等其他字段,更方便灵活但是有SQL注入的危险。
最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?
MyBatis可以通过配置在制定的目录下进行扫描xml文件和@Mapper的接口。接口的报名对应于xml中的namespace,接口的方法名对应于xml中的id字段。通过约定优于配置的方式可以自动将接口通过JDK动态代理,找到对应的xml的MappedStatement,进行sql的执行然后返回。
Mybatis比IBatis比较大的几个改进是什么?
- 有接口绑定,包括注解绑定sql和xml绑定Sql ,
- 动态sql由原来的节点配置变成OGNL表达式,
- 在一对一,一对多的时候引进了association,在一对多的时候引入了collection节点,不过都是在resultMap里面配置
- IBatis里面的核心处理类交SqlMapClient,MyBatis里面的核心处理类叫做SqlSession
参考链接
http://www.cnblogs.com/huajiezh/p/6415388.html
http://www.mybatis.org/mybatis-3/zh/index.html