MyBatis延迟加载&注解&缓存

目录

目录

延迟加载:

延迟加载一(多)对一,Assoction实现:

Collection 实现延迟加载 (一对多,多对多)

MyBatis注解开发

使用 Mybatis 注解实现基本CRUD

使用Mybatis注解实现复杂关系映射开发

复杂关系映射的注解说明       

MyBatis缓存:

MyBatis缓存的类别:

一级缓存:-----默认开启

二级缓存:


延迟加载:

        就是需要用到数据的时才会进行加载,不需要用到数据时就不加载数据,延迟加载也叫懒加载

        坏处: 因为只有当需要用到数据时才会进行数据库查询,这样在大批量数据查询时,因为查询工作也需要时间,可能会造成用户等待时间长,用户体验下降

        好处: 先从表单查询,需要时在从关联表去关联查询,大大提高了数据库性能

        延长加载只有在多表联合查询时才会出现

        延迟加载的实现,需要将原来的一条连接查询sql语句修改为两条表单查询的sql语句

延迟加载一(多)对一,Assoction实现:

        使用延迟加载就不能使用连接查询, 因为连接查询会一次性将数据信息查询出来

        实际就是将连接查询一步实现改为两步实现,并且当不需要具体数据的时候,第二步可以省略

                一对一的配置:
                            association:用于配置一对一
                                property:设置一方属性名称
                                javaType:设置一方属性类型
                        延迟加载配置:
                                column:条件列  设置传递到下一个查询的条件列
                                select:配置关联的下一个查询
                                fetchType:加载类型 lazy:延迟加载 eager:立即加载

延迟加载和关联查询(内连接|外连接)区别:

  • 关联查询的动作: 会把两张表同时都查询出来,意思就是:数据结果在一次就搞定,不会再来第二次。

  • 懒加载的动作: 分开来查,先查询A表, B表会不会查询,取决于用户想不想看B表的数据。如果想看,就查询B表,如果不想看,就不查询B表。

Collection 实现延迟加载 (一对多,多对多)

        多对多可以看做是一对多的形式来操作

        先查询主表的所有记录,在查询从表的单条记录,根据外键查询

        collection:用于配置1对多 配置多方
                property:多方对象集合属性名称
                ofType:多方对象集合属性类型  写集合的泛型
        延迟加载配置:
                    column:条件列
                    select:设置下一个查询  select * from t_account where uid=?
                    fetchType:加载类型  lazy:延迟加载 eager:立即加载

立即加载: 只要一方调用方法,则码数发起查询,把所有数据查询出来

延迟加载: 只有在真正使用是,才发起查询,不使用则不查询

MyBatis注解开发

使用 Mybatis 注解实现基本CRUD

        注解添加在dao接口的方法中配置sql语句就可以了,原来的映射文件就可以消失了

        增删改需要进行事物手动提交

  1. @Insert:实现新增

  2. @Update:实现更新

  3. @Delete:实现删除

  4. @Select:实现查询

  5. @SelectKey:保存之后 获得保存的id

    1. @SelectKey:查询获取添加记录的主键,填充到插入对象的主键上

    2. keyProperty:表示要将查询出的主键填充到对象的哪个属性上

    3. resultType:主键列属性类型

    4.  before:boolean类型  如果主键生成在插入语句之前就设置为true  主键生成在插入语句之后就设置为false

    5.  statement:设置获取主键的SQL语句

使用Mybatis注解实现复杂关系映射开发

        实现复杂关系映射在映射文件中通过配置<resultMap>标签来实现

复杂关系映射的注解说明       

@Result注解代替的是标签<resultMap>

        1.该注解中农可以使用单个@Result注解也可以使用@Result集合

                @Results({@Result(), @Result() })或@Results(@Result())

        2.@Resutl 注解属性说明    
                 column 数据库的列名
                 Property 需要装配的属性名
                 one 需要使用的@One 注解(@Result(one=@One)()))
                 many 需要使用的@Many 注解(@Result(many=@many)()))

        3.@One注解(一对一)

               代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。

                        @Result(column="列名",property="属性名",one=@One(select="指定用来多表查询的 sqlmapper"))

                column:条件列  也就是两个表关联的外键列
                property:配置一方对象属性名称
                one:@One注解 替代association标签  配置一方
                   select:配置关联的下一个查询
                   fetchType:配置加载类型 FetchType.LAZY:懒加载 FetchType.EAGER:立即加载

         4.@Many注解(一对多)

                代替了<collection>标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合

                注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般 为 ArrayList) 但是注解中可以不定义;

                @Result(property="",column="",many=@Many(select=""))

                column:作为条件列【外键】 传递给下一个查询
                property:配置多方对象集合属性
                many:@Many注解 替代collection标签 配置多方
                    select:配置关联的下一个查询
                    fetchType:加载类型  FetchType.LAZY:懒加载

总结:

  1. @Results:替代resultMap标签 用于手动配置关联映射

  2. @Result:替代resultMap标签中的id和result标签

  3. @One:替代association标签 用于配置一方

  4. @Many:替代collection标签 用于配置多方

  5. @ResultMap:注意 它不是用于封装数据的 而是用于引用配置好的Results

        实际开发中,xml配置居多,  注解和xml可不可以同时使用,但是要注意不要一个方法配置了两次映射 这时就会出问题,一般使用 简单的CURD使用注解配置,复杂的使用xml配置

  • 缓存

    • mybatis有两层缓存: 一级缓存 , 二级缓存

      • 一级缓存 : 属于SqlSession级别的缓存,不用设置,默认就存在。

        • 只有当我们执行的查询语句和以前的查询语句是一样的,才会从缓存里面拿数据

      • 二级缓存 : 属于SqlSessionFactory级别的缓存,虽然是默认开启,但是哪个想用,还需要在xml里面配置 : <cache/>

        • 由于它的范围很大,所以只要是从这个SqlSessionFactory产出的session对象,都可以共享这份缓存。

      • 不管是什么缓存,只要执行了增删改的动作,那么都会清空缓存(一级&二级)

  • 懒加载

    • 在涉及到多张表查询的时候,才会用到懒加载。另一张表的数据先别查询出来,等需要的时候再查询。

    • 步骤: 把查询拆分成两个表的独立查询,需要有两个dao,需要查询两次。

      • 通常来说:

        • 第一次查询都是查询整张表的所有数据

        • 第二次查询,一般是按照主键来查询数据

      • 关联:

        • 如果是一对一: 使用<association property="user" column="uid" select="com.itheima.dao.UserDao.findByUid" fetchType="lazy">

        • 如果是一对多: 使用 <collection property="acccountList" column="uid" select="com.itheima.dao.AccountDao.findByUid" fetchType="lazy">

  • 注解开发

    • 基本单表操作的注解:

      • @Insert | @Delete | @Update | @Select | @SelectKey

    • 多张表的操作:

      • @Results : 对应 <resultMap>

      • @Result : 对应 <id> 和 <result>

      • @One 对应 <association>

      • @Many 对应 <collection>

  • 分页插件

      1. 导入依赖

      2. 在SqlMapConfig.xml配置拦截器

      3. 在调用dao方法之前,先设置要查询第几页,每页查询多少条: PageHelper.startPage(1, 10);

MyBatis缓存:

缓存: 就是一块内存空间,保存临时数据

将数据源(数据库或者文件)中的数据读取出来存储到缓存中,再次获取的时候,直接从缓存中获取,这样可以减少和数据库交互的次数,提升程序的性能

使用场景:

        经常查询但不经常修改的数据,数据的正确与否对最终的结果影响不大

不适用的场景:

        经常改变的数据,敏感数据

MyBatis缓存的类别:

一级缓存:-----默认开启

是sqlSession对象的缓存,自带的(不需要配置),不可卸载的(不使用不行),一级缓存的生命周期和sqlSession的一致

二级缓存:-----需要配置,手动开启且属于sqlSessionFactory

是sqlSessionFactory的缓存,只要是同一个sqlSessionFactory创建的sqlSession就会共享二级缓存的内容,并且可以操作二级缓存(二级缓存需要使用需要手动开启也就是配置)

只有查询操作才会有缓存的必要,增删改不会有缓存

一级缓存:

增删改会清空一级缓存

sqlSession的销毁,调用close()也会情况

二级缓存:

同一个sqlSessionFactory创建的SqlSession二级缓存的内容是共享的

MyBatis默认不会开启二级缓存,需要手动开启配置

  <settings></settings>标签下<setting name=”cacheEnabled” value=”true”/>

true----表示开启

如果希望查询的数据存储到二级缓存中,就需要在映射文件中配置

<cache>标签表示使用二级缓存(该mapper文件中所有的查询操作都将使用二级缓存,无需单独使用<select>标签一个一个的开启)

针对每次查询都需要使用最新的数据sql , 需要设置useCache=false禁用二级缓存

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值