映射器是MyBatis最强大的工具,也是我们使用MyBatis时用的最多的工具.MyBatis 是针对映射器构造的Sql构建的轻量级框架.并且通过配置生成对应的JavaBean返回给调用者.而这些配置主要便是映射器,在MyBatis中你可以根据情况定义动态SQL来满足不同场景的需要,因此比其他框架灵活的多.MyBatis 还支持自动绑定JavaBean,我们只要让SQL返回的字段名和JavaBean的属性名保持一致,便可以省掉这些繁琐的映射配置
映射器的主要元素.
一:select 元素.
select 元素帮助我们从数据库中读取数据,组装数据给业务人员.执行 select 语句前,我们需要定义参数,它可以是一个简单的参数类型,例如 int ,float,String,也可以是一个复杂的参数类型.例如JavaBean,Map等,这些都是MyBatis接受的参数类型。执行SQL后,MyBatis也提供了强大的映射规则,甚至是自动映射来帮助我们把返回的结果集绑定到JavaBean中.
常用的是ParameterType,resultMap,fetchSize 等参数.
二:insert 元素。比select 元素简单很多.
如果有用到,可以查询查阅具体的信息
insert 操作还有一个 主键回填特性. 即 插入一条数据后,返回对应的主键id.
首先我们可以使用keyProperty 属性知道那个是主键字段。同时使用useGenerateKeys属性告诉MyBatis这个主键是否使用数据库内置策略生成.
三:update元素和delete元素. 和insert 元素一样,MyBatis执行完update元素和delete元素后会返回一个整数.标出执行后影响的记录条数.
四:参数 typeHandler。处理参数。 我们可以指定特定的类型,来确定哪个typeHandler来处理他们
也可以指定哪个typeHandler去处理
此外还可以对一些参数 设置精度
另外对#和$符号的支持. #会进行预编译处理,这样sql 结构固定。防止sql注入,$是直接进行替换,有时候比较灵活,容易造成sql 注入错误.
五:sql 元素 可以进行sql 语句的复用.比如有多个 sql 语句有重复的sql 语句,可以抽出公共部分进行引用.
六:resultMap 结果映射集
resultMap是MyBatis里面最复杂的元素.它的作用是定义映射规则,级联的更新,定制类型转换器等.
1.constructor .如果 pojo 没有无参构造方法。就可以通过constructor 来构造pojo对象.里面有colum属性
2.使用map存储结果集,这样可读性比较差
3.使用pojo存储结果集 这个可读性较好
4.支持级联
比如角色和用户关联查询.我们希望是在角色的信息中多一个属性,即List<UserBean>userlist。这样取出Role的同时也可以访问到它下面的用户了。我们把这样的情况叫做级联.
MyBatis中级联分为三种.
association:代表一对一关系,比如中国公民和身份证是一对一关系
collection:代表一对多关系.比如班级和学生是一对多的关系
discriminator:鉴别器.可以根据实际选择采用哪个类作为实例,允许你根据特定的条件去关联不同的结果集.
在此说明,级联 可以用关联查询替代. 级联会有性能问题,有时还有n+1问题,即把不需要的数据也加载了。可以采用延迟加载进行优化.
七:缓存
缓存是互联网系统常常用到的,其特点是将数据保存在内存中. 目前流行的缓存服务有MongoDb,Redis,Ehcache等.缓存是计算机内存保存数据,在读取的时候不用再从磁盘读取,大大提升性能。如果缓存命中率很高,就很划算.
MyBatis对缓存的支持,默认只开启一级缓存(一级缓存只是针对同一个SqlSession);所以在同一个SqlSession中,如果sql 和参数相同,多次重复的查询只查询数据库一次.后面的是查询缓存.
因为一级缓存的特殊要求 必须是同一个事务中。所以命中率较低 . 于是我们可以手动开启二级缓存:即 不同的事物,只要select 相同,参数相同。即可命中缓存.
二级缓存的说明:
1.要求返回的pojo 对象必须是序列化的。否则抛异常
2.映射语句中所以的select语句都会被缓存
3.映射语句中的所有insert,update,delete 语句都会刷新缓存
4.默认使用LRU(last recently use)最近最少使用 算法来回收
5.缓存列表 存储的是集合或对象
6.缓存里面的内容是可以被修改的
缓存回收的策略:
1.LRU
2.先进先出
3.软引用和弱引用
MyBatis 还支持自定义缓存.即 可以采用将缓存存入redis中