MyBatis高频问题-自动映射与缓存解析

目录

如何配置自动映射?

手动映射

ID自动回填

[#和区别及sql注入攻击](#和区别及sql注入攻击)

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

级联association&collection


采用MyBatis方式访问数据库的步骤和优缺点及与hibernate对比

使用MyBatis的4个步骤:

① 引入MyBatis的Maven依赖

② 在mybatis-config.xml配置文件中配置数据库数据源

③ 编写UserMapper.xml配置文件,编写SQL和配置User与tb_user表的映射关系

④ 编写数据操作接口UserMapper.java文件

优点:

① 可以配置动态SQL,可以对SQL进行优化,并通过配置来决定SQL的映射规则。

② 具有自动映射功能,在注意命名规则的基础上,无需再写映射规则。

③ 提供接口编程的映射器,只需要一个接口和映射文件便可以运行,代码耦合度低。

缺点:

① SQL语句的编写工作量较大,尤其是字段多、关联表多时更是如此,对开发人员编写SQL语句的功底有一定要求。

② SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

使用Hibernate的3个步骤:

① 引入Hibernate的Maven依赖

② 在hibernate.cfg.xml配置文件中配置数据库数据源

③ 编写User.hbm.xml配置文件,配置User与tb_user表的映射关系

优点:

① 将映射规则分离到XML/注解中,减少了代码的耦合度

② 无需管理数据库连接,只需配置相应的XML配置文件

③ 会话只需要操作Session对象即可,关闭资源也只需要关闭Session即可

缺点:

① 全表映射不便利,更新时需要发送所有字段

② 无法根据不同的条件组装不同的SQL

③ 对于多表关联和复杂SQL查询支持较差

④ HQL性能较差,无法优化SQL

如何配置自动映射?

  • 自动映射配置autoMappingBehavior包含三个值:
  1. NONE:取消自动映射。
  2. PARTIAL:只会自动映射,没有定义嵌套结果集映射的结果集(默认值)。
  3. FULL:会自动映射任意复杂的结果集(无论是否嵌套)。
  • 自动映射配置mybatis-config.xml
html 复制代码
<settings>

    <settingname="autoMappingBehavior"value="PARTIAL"/>

    <settingname="mapUnderscoreToCamelCase"value="true"/>

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

手动映射

手动映射操作步骤:

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

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

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

html 复制代码
<resultMap id="messageVOResultMap" type="vo.MessageVO">
  <id column="id" property="idVo"/>
  <result column="msg_id" property="msgIdVo"/>
  <result column="status" property="statusVo"/>
  <result column="content" property="contentVo"/>
  <result column="deleted" property="deletedVo"/>
  <result column="create_time" property="createTimeVo"/>
  <result column="update_time" property="updateTimeVo"/>
</resultMap>

<select id="getMessageVOById" parameterType="long" resultMap="messageVOResultMap">select 
  <include refid="allColumns"/> from tb_message where id = #{id}
</select>

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表示。

下篇讲延迟加载,分页,动态sql 及源码解析吧😍

MyBatis高频问题-延迟加载与分页插件-CSDN博客

​MyBatis关键源码解析​-CSDN博客

相关推荐
半夏陌离11 小时前
SQL 进阶指南:视图的创建与使用(视图语法 / 作用 / 权限控制)
java·数据库·mybatis
BillKu14 小时前
Spring Boot中MyBatis的定义与使用
spring boot·mybatis
lozhyf15 小时前
固定资产管理系统(vue+Springboot+mybatis)
vue.js·spring boot·mybatis
热烈勒温17 小时前
Mybatis入门、操作数据、配置xml映射、数据封装
xml·mybatis
javadaydayup1 天前
为什么 MyBatis Mapper 接口能像普通 Bean 一样被 @Autowired?
后端·mybatis
小趴菜不能喝2 天前
Spring boot3.x整合mybatis-plus踩坑记录
java·spring boot·mybatis
焯7592 天前
若依微服务遇到的配置问题
java·mybatis·ruoyi
颜如玉3 天前
MybatisPlus Sql Inject魔法🪄
后端·mybatis·源码
叫我阿柒啊3 天前
从全栈开发到微服务架构:一位Java工程师的实战经验分享
java·ci/cd·kafka·mybatis·vue3·springboot·fullstack