MyBatis之自动映射与缓存问题及解析

 更新时间:2025年09月05日 15:18:53   作者:ByteBlossom  
文章主要介绍了MyBatis的配置与操作,包括自动映射(autoMappingBehavior)的设置(NONE、PARTIAL、FULL)、手动映射的步骤(使用<resultMap>标签)、SQL注入攻击的原理、缓存机制及其影响(一级缓存和二级缓存的作用、缓存失效的情况)

如何配置自动映射?

自动映射配置autoMappingBehavior包含三个值:

  • NONE:取消自动映射。
  • PARTIAL:只会自动映射,没有定义嵌套结果集映射的结果集(默认值)。
  • FULL:会自动映射任意复杂的结果集(无论是否嵌套)。

自动映射配置mybatis-config.xml

<settings>
<settingname="autoMappingBehavior"value="PARTIAL"/>
<settingname="mapUnderscoreToCamelCase"value="true"/>
</settings>
  • 【解释】必须配置mapUnderscoreToCamelCase=true,否则失效。
  • 自动映射结果返回用resultType;手动映射返回结果用resultMap

手动映射

手动映射操作步骤:

①使用<resultMap>标签配置映射关系

②将<select>标签中使用resultMap作为结果集类型

  • 自动映射配置演示——mybatis-config.xml<resultMap

ID自动回填

useGeneratedKeys="true",keyProperty="id"指定主键赋值的字段名

接口定义用int类型接收

#和$区别及sql注入攻击

  • #{}:参数占位符,即:预编译;在预处理时,会把参数用占位符"?"代替变成:selectfromuserwherename:?;
  • ${}:字符串替换符,即:SOL拼接;只是简单的字符串替换,在动态解析时变成:select*fromuserwherename='muse';
  • SOL注入:即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查认语句的结尾上添加额外的SOL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

缓存机制。二级缓存怎么读取

  • 【开启一级缓存】默认是开启的,即:同一个SqlSession对象调用同一个Mapper的方法,如果没有声明需要刷新,并且缓存没超时的情况下,一般只执行一次SQL,其他的 DQL(查询语句)SqlSession都只会取出当前缓存的数据。
  • 【开启二级缓存】在xxxMapper.xml中添加<cache/>标签或者在对应的Dao类上面增加@CacheNamespace(blocking=true)注解以开启二级缓存。并且执行sqlSession.commit()使得二级缓存生效,其中,POJOJO必须实现Serializable接口。

二级缓存也叫做全局缓存,基于namespace级别的缓存。使用的是mapper的作用域,不同的sqlSession只要访问的同一个mapper.xml文件,则共享二级缓存作用域。范围是SqlSessionFactory。需要在全局配置文件中设置<settingname="cacheEnabled"value="true"/>,然后在具体的mapper.xml中添加<cache/>即可。

查询流程:查询时先到二级缓存查,如果没有再去一级localCache查,再没有则查询数据库,再放缓存一份,再返回客户端。下次再查询的时候直接从缓存返回,不再访问数据库,如果数据库中发生commit()操作,则清空缓存。

1、如果在mapper映射文件中的CRUD标签中加入flushCache="true",会导致一二级缓存机制都消失

2、也可以在测试类中直接手动清理缓存。

3、也可以在全局配置文件设置<settingsname="localCacheScope"value="STATEMENT"/>这样会使一级缓存失效,二级缓存不受影响。

  • foreach
  • concatbind
  • mybatisgenerator

源码

  • 底层还是JDBC去执行
  • 获取mapper动态代理(JDK动态代理)
  • 执行invoke方法,获取一个被缓存到的mapperMathod

级联association&collection

  • mybatis中的标签association主要用于解决“hasone”类型的关系,它表示一个对象至多有一个关联对象(一对一或多对一)。比如一般情况下,每个消息都对应一个消息详情,消息和消息详情之间的关系就可以使用association表示。
  • mybatis中的标签collection主要用于解决“hasmany”类型的关系,它表示一个对象有多个关联对象。比如一般情况下,每个人都有多个联系方式,人和联系方式之间的关系就可以使用collection表示。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot2.x+ShardingSphere实现分库分表的示例代码

    Springboot2.x+ShardingSphere实现分库分表的示例代码

    这篇文章主要介绍了Springboot2.x+ShardingSphere实现分库分表的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • spring boot微服务自定义starter原理详解

    spring boot微服务自定义starter原理详解

    这篇文章主要介绍了spring boot微服务自定义starter原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java数据结构实现折半查找的算法过程解析

    Java数据结构实现折半查找的算法过程解析

    这篇文章主要介绍了Java数据结构实现折半查找的算法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 使用java判断输入年份是否为闰年完整代码

    使用java判断输入年份是否为闰年完整代码

    闰年的引入确保了我们的日历与地球运行轨道的对齐,使得时间的计算更加准确,在编程中判断给定年份是否为闰年是一项常见的任务,这篇文章主要给大家介绍了关于使用java判断输入年份是否为闰年的相关资料,需要的朋友可以参考下
    2023-10-10
  • SpringBoot使用PageHelper插件实现Mybatis分页效果

    SpringBoot使用PageHelper插件实现Mybatis分页效果

    这篇文章主要介绍了SpringBoot使用PageHelper插件实现Mybatis分页效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作有一定的参考借鉴价值,需要的朋友可以参考下
    2024-02-02
  • Java基础之创建虚拟机对象的过程详细总结

    Java基础之创建虚拟机对象的过程详细总结

    本文基于虚拟机HotSpot和常用的内存区域Java堆深入对象分配、布局和访问的全过程,文中有非常详细的图文解说,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • java实现文件复制、剪切文件和删除示例

    java实现文件复制、剪切文件和删除示例

    这篇文章主要介绍了java实现文件复制、剪切文件和删除示例,需要的朋友可以参考下
    2014-04-04
  • Spring 事务事件监控及实现原理解析

    Spring 事务事件监控及实现原理解析

    本文首先会使用实例进行讲解Spring事务事件是如何使用的,然后会讲解这种使用方式的实现原理。感兴趣的朋友跟随小编一起看看吧
    2018-09-09
  • Java判断字符串中是否包含中文方法

    Java判断字符串中是否包含中文方法

    这篇文章主要介绍了Java判断字符串中是否包含中文方法,使用Matcher类解决了这个问题,需要的朋友可以参考下
    2014-06-06
  • 三步轻松搭建springMVC框架

    三步轻松搭建springMVC框架

    这篇文章主要教大家三步轻松搭建springMVC框架,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论