简单介绍
Mybatis本是apache的一个开源项目,2010年这个项目由apache software foundation迁移到了google code,并且改名为Mybatis.2013年11月迁移到Github.
Mybatis是支持普通SQL查询、存储过程和高级映射的优秀持久层框架。Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及抽取结果集。Mybatis使用简单的XML注解用于配置原始映射,将接口和Java的POJOS映射成数据库中的记录。
原理
使用
使用Mybatis,只需要将mybatis-x.x.x.jar文件置于classpath即可。
如果使用Maven来构建项目,则需将下面的dependency代码置于pom.xml文件中:
长处
1. 简单易学
Mybatis本身小且简单。没有任何第三方依赖,最简单只要jar文件+配置几个sql映射文件,易于学习、易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
2. 灵活
Mybatis不会对应用程序或者数据库的现有设计强加任何影响。Sql写在xml文件中,便于统一管理和优化。通过sql基本上可以实现我们不使用数据库访问框架可以实现的所有功能。
3. 解除SQL与程序代码的耦合
通过提高DEL层,将业务逻辑和数据访问逻辑分离,使系统的涉及更清晰,更易维护,更易单元测试。Sql和代码的分离,提高了可维护性。
4. 提供映射标签,支持对象与数据库的orm字段关系映射
5. 提供对象关系映射标签,支持对象关系组建维护
6. 提供XML标签,支持编写动态sql
短处
1. 编写SQL语句时工作量大,尤其是字段多、关联表多时,更是如此。
2. SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
3. SQL写在XML中,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难。
小知识点
1. 每个基于Mybatis的应用都是以一个SqlSessionFactory的实例为中心的。可以通过SqlSessionFactoryBuilder获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。
2. Mppper实例
映射器是创建绑定映射语句的接口。映射器接口的实例可以从SqlSession中获得。
3. XML映射配置文件
Mybatis的XML配置文件包含了影响Mybatis行为甚深的设置和属性信息,XML文档的高层级结构如下:
4. 映射语句关键字标签:
查询:select 新增:insert 修改update 删除:delete
5. 映射xml需添加标签,用来解析Mybatis关键字:
<!DOCTYPEmapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
6. 命名空间(Namespaces):
在之前版本的iBatis中是可选的,但现在的命名空间则是必须的。
4.类型别名typeAliases
用于在映射XML中对POJO类进行重命名,在映射XML实际应用时可直接使用该别名,减少类完全限定名的出现次数,方便书写,便于维护。
7. 传入参数:parameterType
parameterType:SQL映射语句入参关键字,将会传入这条语句的参数类的完全限定名或别名
8. 返回参数:resultType或resultMap
resultType:SQL映射语句返回关键字,从这条语句返回的期望类型的类的完全限定名或别名。当返回是集合时,这里应该是集合可以包含的类型,而不能是集合本身。
resultMap:SQL映射语句返回关键字,命名引用外面的resultMap.
resultType与resultMap不能同时使用
9. 动态SQL
a.if:在动态sql中所做的最常用的事情是包含部分where字句的条件
b.choose,when,otherwise
有时我们不想应用所有的条件,相反我们想选择很多情况下的一种。与java中的switch语句相似。
10. sekectKey
当映射语句为插入语句时,如果你的数据库支持自动生成主键的字段,那么可以设置useGenneratedKeys=”true”,而且设置keyProperty到你已经做好的目标属性上。或者使用selectKey, selectKey会首先运行,这使得我们可以在数据库中来处理自动生成的主键,而不需要在Java中处理,而这时keyProperty作为selectKey语句结果应该被设置的目标属性。
11. sql
可以用来定义可重用的SQL代码片段,可以包含在其他语句中。
12. 字符串替换
默认情况下,使用#{}格式的语法会导致Mybatis创建预处理语句属性并以它为背景设置安全的值(如?)。但有时你只是想直接在SQL语句中插入一个不改变的字符串,可以使用${}.
13. resultMap
constructor –类在实例化时,用来注入结果到构造方法中
idArg –ID参数,标记结果作为ID可以帮助提高整体效能
arg -注入到构造方法的一个普通结果
id –一个ID结果,标记结果作为ID可以帮助提高整体效能
result –注入到字段或JavaBean属性的普通结果
association –一个复杂的类型关联,许多结果将包成这种类型
嵌入结果映射 –结果映射自身的集,或者参考一个
Collection –复杂类型的集
嵌入结果映射–结果映射自身的集,或者参考一个
Discriminator –使用结果值来决定使用哪个结果映射
Case–基于某些值的结果映射
嵌入结果映射 –结果映射自身的集,或者参考一个
14. null值的处理
如果null值被当做值来传递,对于所有可能为空的列,JDBC type是需要的
实战