发表于: 2017-11-10 22:53:38
1 778
今天把mybatis相关内容基本上算是了解完了,总结一下:
mybatis是一个基于java的持久层框架,内部封装了JDBC,可以通过xml或者注解的方式将要执行的statement配置起来,并通过java对象和statement中sql语句的动态参数进行映射生成最终的sql语句,最后由mybatis框架执行并将映射成的java对象返回。
mybatis中包括主配置文件和mapper映射文件。主配置文件完成数据库的连接配置以及mapper文件的注册。mapper映射文件主要完成dao层中sql语句的映射,包括增删改查。
当bean中的属性名与数据表中的字段名不一致时,可以将查询结果的字段名使用别名,让别名与bean中的属性名相同。也可以使用resultMap来建立数据表字段与bean属性间的映射,达到将查询结果封装为对象的目的。
mapper动态代理:无需实现到dao接口。接口是由mybatis结合映射文件自动生成的动态代理实现的。
一个dao接口的实现类方法使用的是同一个sql映射文件的sql映射id,所以需要将映射文件中<mapper>标签的namespace属性设定为dao接口的全类名,系统会根据方法所属的dao接口,自动到相应namespace的映射文件中查找相关的sql映射。
动态sql:主要用于解决查询条件不确定的情况,在程序运行期间,会根据用户提交的查询条件进行查询。条件不同,生成的sql语句也不同。通过标签来控制:<if>、<where>、<choose><when><otherwise>来进行控制,此外还可以使用数组或集合存放查询条件,然后使用<foreach>标签进迭代取出。
关联关系和延迟加载见昨天的日报。
缓存可以提高查询访问的速度,mybatis的查询缓存机制,根据缓存的作用域可划分为一级缓存和二级缓存。
MyBatis查询缓存的作用域是根据映射文件mapper的namespace划分的,相同namespace的mapper查询数据存放在同一个缓存区域。不同namespace下的数据互不干扰。无论是一级缓存还是二级缓存,都是按照namespace进行分别存放的。
但一、二级缓存的不同之处在于,SqlSession一旦关闭,则SqlSession中的数据将不存在,即一级缓存就不复存在。而二级缓存的生命周期会与整个应用同步,与SqlSession是否关闭无关。换句话说,一级缓存是在同一线程(同一SqlSession)间共享数据,而二级缓存是在不同线程(不同的SqlSession)间共享数据。
一级缓存的作用域是SqlSession,即在同一个SqlSession中两次执行相同的sql查询,第一次执行完之后会将查询结果写入到缓存中,第二层查询会直接从缓存中读取数据,而不会到数据库中进行查询。体现到代码上就是select语句只有在第一次查询时生成,第二次查询则没有。(可以通过日志记录来查看)。增删改操作会清空一级缓存。
二级缓存中的数据不是为了在多个查询之间共享,因为mybatis从缓存中读取数据依据的是sql语句的id(而非查询结果的对象),而是为了延长查询结果的保留时间,提高系统性能。
二级缓存的使用需要两点:1.查询结果涉及的bean实现java.io.Serializable接口。2.在mapper映射文件中配置<cache>字标签,该标签包括4个属性:eviction,二级缓存中的对象达到最大值时,通过eviction将缓存中的对象移除缓存,策略有FIFO,先进先出;LRU,未被使用时间最长的 ; flushInterval,刷新缓存的时间间隔,单位为毫秒;readOnly,设置缓存中数据是否只读;size,二级缓存中放置对象的最大个数。增删改操作会清空二级缓存。
二级缓存使用原则:只能在同一个namespace下使用二级缓存
查询多于修改时使用二级缓存。
如果一个表和其他表有关联,那么就存在多个namespace对同一数据的操作,可能会导致多个namespace二级缓存中的数据不一致。
注解与类、接口、枚举是同一级别的。一个注解,后台对应一个@interface类。
mybatis注解主要包括@Insert、@Delete、@Update、@Select,在注解中配置后不需要再在mapper映射文件中注册sql语句。需要在主配置文件中配置:
<mappers>
<package name="dao接口所在的包的全名">
</mappers>
重点:mapper动态代理、动态sql、关联查询、延迟加载以及缓存。
明天的计划:通过代码将mybatis中的内容在复习一遍。趁着双11买几本书啃啃
评论