栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis基础学习(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis基础学习(二)


MyBatis基础学习(二) 文章目录
    • MyBatis基础学习(二)
    • @[toc]
  • 分页
    • 使用Limit分页
    • 使用mybatis分页
    • RowBounds分页
    • 分页插件
      • **使用注解开发**
        • **面向接口编程**
      • mybatis执行的流程
      • **使用注解CRUD**
        • **关于@Param()注解**
        • **#{}和${}**
    • Lombok
    • **多对一处理**
  • 动态SQL
      • IF
      • Choose(when, otherwise)
      • trim(where, set)
      • Foreach
      • **SQL片段**
  • 缓存
    • **简介**
      • 什么是缓存【cache】
      • 为什么使用缓存
      • 什么样的数据能使用缓存
    • **Mybatis缓存**
      • **一级缓存**
      • **缓存失效的情况:**
      • **二级缓存**
      • 自定义缓存
  • **Mybatis自定义插件**
分页

减少数据的处理量

使用Limit分页
语法:
select * from user limit startIndex,pageSize;
select * from user limit 3;  #[0,n]
使用mybatis分页
  1. 接口

    List getUserByLimit(Map map);
    
  2. Mapper.xml

    
       select * from mybatis.user limit #{startIndex}, #{pageSize}
    
    
  3. 测试

@Test
public void getUserListByLimit(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    HashMap map = new HashMap();
    map.put("startIndex", 1);
    map.put("pageSize", 2);
    List userByLimit = userMapper.getUserByLimit(map);
    for (User user : userByLimit) {
        logger.info("user>>>" + user);
    }
    sqlSession.close();
}
RowBounds分页

不再使用SQL实现分页

  1. 接口

    List getUserBYRowBounds();
    
  2. mapper.xml

    
        select *
        from teacher
        where id = #{id}
    
    

    根据结果嵌套处理

     
    
        select s.id sid, s.name sname, t.id tid, t.name tname
        from student s,
             teacher t
        where s.tid = t.id
          and t.id = #{tid}
    
    
        
        
        
        
        
        
            
            
            
        
    
    

    按照查询嵌套处理

    
        select *
        from student
        where tid = #{tid}
    
    

    小结

    1. 关联 - association [多对一]

    2. 集合 - collection [一对多]

    3. javaType & ofType

      1. javaType 用来指定实体类中属性的类型
      2. ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!

    面试高频

    • MySQL引擎
    • InnoDB底层原理
    • 索引
    • 索引优化
    动态SQL

    根据不同的条件生成不同的SQL语句

    ##借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
    if
    choose (when, otherwise)
    trim (where, set)
    foreach
    
    CREATE TABLE `blog`
    (
        `id`          VARCHAR(50)  NOT NULL COMMENT '博客id',
        `title`       VARCHAR(100) NOT NULL COMMENT '博客标题',
        `author`      VARCHAR(30)  NOT NULL COMMENT '博客作者',
        `create_time` DATETIME     NOT NULL COMMENT '创建时间',
        `views`       INT(30)      NOT NULL COMMENT '浏览量'
    ) ENGINE = INNODB
      DEFAULT CHARSET = utf8;
    
    IF
    
        select * from blog
        
            
                
                    title = #{title}
                
                
                    and author = #{author}
                
                
                    and views = #{views}
                
            
        
    
    
    trim(where, set)
    
        select * from blog where 1=1
       
    
    

    注意事项:

    • 最好基于单表来定义SQL片段
    • 不要存在where标签
    缓存 简介
    1. 什么是缓存【cache】
      1. 存在内存中的临时数据
      2. 将用户经常出现的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题
    2. 为什么使用缓存
      1. 减少和数据库的交互次数,减少系统开销,提高系统效率
    3. 什么样的数据能使用缓存
      1. 经常查询并且不经常改变的数据
    Mybatis缓存
    • mybatis包含一个非常强大的查询缓存特性,可以非常方便的定制和配置缓存,缓存可以极大的提升查询效率

    • mybatis系统中默认定义了两级缓存:一级缓存和二级缓存

      • 默认情况情况下,只有一级缓存开启(SqlSession级别的缓存,也称为本地缓存)
      • 二级缓存需要手动开启和配置,它是基于namespace级别的缓存
      • 为了提高扩展性,mybatis定义了缓存接口Cache,通过实行Cache接口来自定义二级缓存
    一级缓存
    • 一级缓存也叫本地缓存:SqlSession

      • 与数据库同一次会话期间查询到的数据会放在本地缓存中
      • 以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库
    缓存失效的情况:
    1. 查询不同的东西
    2. 增删改操作,可能会改变原来的数据,所以必定会刷新缓存
    3. 查询不同的Mapper.xml
    4. 手动清理缓存
    sqlSession.clearCache()
    
    二级缓存
    • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存

    • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存

    • 工作机制

      • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
      • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中
      • 新的会话查询信息,就可以从二级缓存中获取内容;
      • 不同的mapper查出的数据放在自己对应的缓存(map)中

    步骤:

    1. 开启全局缓存

      
      
    2. 在要使用二级缓存的mapper中开启

    
    
    • 只要开启了二级缓存,在同一个Mapper下就有效
    • 所有的数据都会先放在一级缓存中
    • 只有当会话提交,或者关闭的时候,才会提交到二级缓存中
    自定义缓存
    
        org.mybatis.caches
        mybatis-ehcache
        1.1.0
    
    

    在mapper中指定我们的ehcache缓存实现

    
    

    ehcache.xml

    
    
    
        
        
        
    
    

    Mybatis自定义插件
    1. 依赖注入

      
          com.baomidou
          mybatis-plus-boot-starter
          3.4.0
      
      
    2. 编写Interceptor的实现类

    3. 使用@Intercepts注解完成插件签名

    package com.luxiaobai.dao;
    
    import org.apache.ibatis.executor.statement.StatementHandler;
    import org.apache.ibatis.plugin.*;
    
    import java.util.Properties;
    
    
    
    
    
    @Intercepts({
            @Signature(type = StatementHandler.class, method = "parameterize", args = java.sql.Statement.class)
    })
    public class MyFirstPlugin implements Interceptor {
        
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            //执行目标方法
            Object proceed = invocation.proceed();
            //返回执行后的返回值
            return proceed;
        }
    
        
        @Override
        public Object plugin(Object target) {
    //        借助Plugin的wrap方法来使用当前interceptor包装我们的目标对象
            Object wrap = Plugin.wrap(target, this);
    //        返回为当前target创建的动态代理
            return wrap;
        }
    
        
        @Override
        public void setProperties(Properties properties) {
            System.out.println("插件配置的信息:" + properties);
        }
    }
    

    ​ 4. 将写好的插件注册到全局配置文件中

    
        
    
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/489022.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号