浅析MyBatis的各个方面

目录

 

MyBatis的核心组件

MyBatis的执行流程

MyBatis的参数传递

MyBatis的缓存机制

MyBatis的插件编写

MyBatis如何进行分页

MyBatis的延迟加载

MyBatis的动态sql及其原理

MyBatis如何获取主键值

如何进行关联查询


MyBatis的核心组件

    SqlSessionFactoryBuilder(构造器):作用是根据配置信息生成SqlSessionFactory(工厂接口)

    SqlSessionFactory:(工厂接口):作用是生成SqlSession(会话)

    SqlSession:可以向数据库发送信息的,类似于request对象,或者jdbc的connection对象

    SqlMapper(映射器):java接口与xml配置文件(或者注解)构成,作用是描述映射关系,sql语句,参数等

    Configuration:解析配置文件的信息都会封装在这个对象当中,作用与整个MyBatis的生命周期

MyBatis的执行流程

 

1.根据配置文件创建SQLSessionFactory

  • 创建SqlSessionFactoryBuilder对象,通过build()方法读取配置文件信息
  • 解析配置文件中的信息,保存在configuration对象中
  • 根据configuration返回sqlSessionFactory对象,new DefaultSqlSessionFactory(config)

2.通过SessionFactory来创建sqlSession :SqlSession sqlSession = sessionFactory.openSession();

3.通过创建的sqlSession获取jdk动态代理生成mapper接口的代理对象

代码步骤
 

@Test
    public void getUserByName()throws Exception{
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession openSession = sqlSessionFactory.openSession();
        UserMapper userMapper = openSession.getMapper(UserMapper.class);
        List<UserModel> userModelList = userMapper.getUserByName("hejianfeng");
        log.info("结果:{}", userModelList);
    }

 

MyBatis的参数传递

  1.单个参数的时候可以直接传递,框架不会做特殊处理        #{参数名/任意名}:取出参数值。

  2.多个参数:mybatis会做特殊处理。多个参数会被封装成 一个map
                key:param1...paramN,或者参数的索引也可以
                 value:传入的参数值
                #{}就是从map中获取指定的key的值;

    注意:除了可以根据key值获取map中的参数外,还可以在接口中指定参数的key名称,这样可读性会更好一点,用的是@Param注解

     List<UserModel> getUserByNameAndAge(@Param("name") String name,@Param("age") int age);

  3.直接传递一个map,将参数以KV的方式传递,写sql的时候要根据key的名称获取参数就可以了

  4.传递Java对象,写sql的时候按照属性名称获取参数就好了

  总而言之,在多个参数的情况下,都相当于map的参数传递

  5.传递Collection

     传递集合参数的时候,需要用collcetion来获取集合中的参数

<select id="getUserByName"  resultType="model.UserModel">
  SELECT * FROM t_user WHERE id IN (#{collection[0]},#{collection[1]})
</select>

 

MyBatis的缓存机制

    在MyBatis中缓存分为一级缓存与二级缓存

      一级缓存

       SqlSession级别的缓存,每个SqlSession都有自己单独的一级缓存,多个SqlSession之间的一级缓存是相互隔离的,互不影响,mybatis中一级缓存是默认自动开启的

       一级缓存的工作原理是:在同一个sqlSession中执行相同的查询,会先去一级缓存中找,没有的话再去DB,获取之后再放入以及缓存

 (跟用redis的原理差不多),但是这是基于HashMap的结构。

     代码演示:

     

 @Test
    public void getUserByName()throws Exception{
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession openSession = sqlSessionFactory.openSession();
        UserMapper userMapper = openSession.getMapper(UserMapper.class);
        List<Integer> idList = new ArrayList<>();
        idList.add(1);
        idList.add(2);
        List<UserModel> userModelList = userMapper.getUserByName(idList);
        List<UserModel> userModelList2 = userMapper.getUserByName(idList);
        log.info("结果:{}", userModelList == userModelList2);//结果是true :说明两个对象相等,并且sql打印只有一次,说明只访问了一次数据库
    }

     一级缓存失效的情况:

      1.两次查询中 ,出现了修改数据的情况,一级缓存会被清空

     2.SqlSession.clearCache清理一级缓存

     3.在mapper的<select >标签中  加上flushCache="true"   ,表示该查询不使用以及缓存

    

 

二级缓存

      鉴于一级缓存的局限性,就引入了二级缓存

      mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession

      二级缓存默认是没有开启的,需要在config.xml文件中进行配置

<settings>
    <!-- 开启二级缓存 -->
    <setting name="cacheEnabled" value="true"/>
</settings>

     二级缓存的失效方式

  • 对应的mapper中执行增删改查会清空二级缓存中数据
  • select元素的flushCache属性置为true,会先清空二级缓存中的数据,然后再去db中查询数据,然后将数据再放到二级缓存中
  • select元素的useCache属性置为true,可以使这个查询跳过二级缓存,然后去查询数据

MyBatis的插件编写

MyBatis如何进行分页

MyBatis的延迟加载

MyBatis的动态sql及其原理

MyBatis如何获取主键值

如何进行关联查询

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值