首页 > 数据库 >MyBatis SQL映射文件

MyBatis SQL映射文件

时间:2024-10-17 14:18:30浏览次数:9  
标签:语句 缓存 映射 resultMap SQL MyBatis id 属性

目录

SQL映射的XML文件

mapper元素

select

parameterType

resultMap

insert元素

update元素

delete元素

resultMap

缓存


SQL映射的XML文件

MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单

SQL映射文件的几个顶级元素(按照定义的顺序)

mapper – namespace

cache – 配置给定命名空间的缓存

cache-ref – 从其他命名空间引用缓存配置

resultMap –用来描述数据库结果集和对象的对应关系

sql – 可以重用的SQL块,也可以被其他语句引用

insert – 映射插入语句

update – 映射更新语句

delete – 映射删除语句

select – 映射查询语句

mapper元素

namespace:命名空间

namespace和子元素的id联合保证唯一,区别不同的mapper

绑定DAO接口

namespace的命名必须跟某个接口同名

接口中的方法与映射文件中SQL语句id一一对应

<mapper namespace="cn.smbms.dao.user.UserMapper">
    <select id="getUserList" …
        ……
    </select>
</mapper>

select

select是MyBatis中最常用的元素之一

select语句有很多属性可以详细配置每一条语句

id

命名空间中唯一的标识符

接口中的方法与映射文件中的SQL语句id一一对应

parameterType

传入SQL语句的参数类型

resultType

SQL语句返回值类型的完整类名或别名

parameterType

基础数据类型

  • int、String、Date等

  • 只能传入一个,通过#{参数名}即可获取传入的值

复杂数据类型

  • Java实体类、Map等

  • 通过#{属性名}或者#{map的keyName}即可获取传入值

resultMap

描述如何将结果集映射到Java对象

<resultMap type="User" id="userList">
    <result property="id" column="id"/>
    <result property="userCode" column="userCode"/> //property="userCode"表示查询出来的属性对应的值赋给实体对象的哪个属性
    //column="userCode"从数据库中查询的列名或者别名
​
    <result property="userName" column="userName"/>
    <result property="userRole" column=“userRole"/>
    <result property="userRoleName" column="roleName"/>
</resultMap>
<select id="getUserList" resultMap="userList" parameterType="User"> //resultMap="userList"一个外部resultMap的id,表示返回结果映射到哪一个resultMap上
​
    select u.*,r.roleName from smbms_user u,smbms_role r 
            where u.userName like CONCAT (‘%’,#{userName}, ‘%’)  
            and u.userRole = #{userRole} and u.userRole = r.id 
</select>

resultType :直接表示返回类型

基本数据类型

复杂数据类型

resultMap :对外部resultMap的引用

应用场景:

数据库字段信息与对象属性不一致

复杂的联合查询,自由控制映射结果

二者不能同时存在,本质上都是Map数据结构

resultMap自动映射匹配前提:字段名与属性名一致

resultMap的自动映射级别-autoMappingBehavior

PARTIAL(默认):自动匹配所有

<settings>
    <setting  name="autoMappingBehavior" value="NONE"/> //NONE禁止自动匹配
​
</settings>
属性描述
id在命名空间中唯一的标识符,可以被用来引用这条语句
parameterType将会传入这条语句的参数类的完全限定名或别名
resultType从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用resultType或resultMap,但不能同时使用
resultMap命名引用外部的resultMap
flushCache将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。默认值:false
useCache将其设置为true,将会导致本条语句的结果被缓存。默认值:true
timeout这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)
fetchSize这是暗示驱动程序每次批量返回的结果行数
statementTypeSTATEMENT,PREPARED或CALLABLE的一种。让MyBatis选择使用Statement,PreparedStatement或CallableStatement。默认值:PREPARED
resultSetTypeFORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理)

insert元素

<insert  id="add" parameterType="User" >
 insert into  smbms_user (userCode,userName,userPassword) 
        values ( #{userCode},#{userName},#{userPassword})
</insert>
   
注意:insert、update、delete元素均没有resultType属性

update元素

<update id ="modify" parameterType="User">
update smbms_user set userCode = #{userCode},
             userName = #{userName},
              userPassword = #{userPassword}  where id = #{id}
</update>

delete元素

<delete id ="deleteUserById" parameterType="int">
    delete from smbms_user where id = #{id}
</delete>

resultMap

resultMap属性

id:resultMap的唯一标识

type:Java实体类

resultMap子元素

id

一般对应数据库中该行的主键id,设置此项可提高MyBatis性能

result

映射到JavaBean的某个“简单类型”属性

association

映射到JavaBean的某个“复杂类型”属性,比如JavaBean类

collection

映射到JavaBean的某个“复杂类型”属性,比如集合

association

复杂的类型关联,一对一

内部嵌套

  • 映射一个嵌套JavaBean属性

属性

  • property:映射数据库列的实体对象的属性

  • javaType:完整Java类名或者别名

  • resultMap:引用外部resultMap

子元素

  • id

  • result

property:映射数据库列的实体对象的属性

column:数据库列名或者别名

collection

复杂类型集合,一对多

内部嵌套

  • 映射一个嵌套结果集到一个列表

属性

  • property:映射数据库列的实体对象的属性

  • ofType:完整Java类名或者别名(集合所包括的类型)

  • resultMap:引用外部resultMap

子元素

  • id

  • result

property:映射数据库列的实体对象的属性

column:数据库列名或者别名

resultMap自动映射(autoMappingBehavior)的三个匹配级别

NONE

禁止自动匹配

PARTIAL(默认)

自动匹配所有属性,内部嵌套除外

FULL

自动匹配所有

缓存

MyBatis 提供了两种级别的缓存机制:

一级缓存(也称为本地缓存或会话缓存)和二级缓存(也称为全局缓存)。

这两种缓存有助于减少数据库访问次数,从而提高应用程序的性能。

MyBatis缓存

一级缓存

  • 一级缓存是默认开启的,并且作用域是SqlSession级别。这意味着在同一个SqlSession中执行两次相同的查询时,第二次查询将直接从缓存中获取结果,而不是再次查询数据库。

  • 特性

    • 默认开启。

    • 作用于同一个SqlSession内。

    • 当执行增删改操作或者手动清空缓存时,一级缓存会被清除。

    • 缓存的数据以键值对的形式存储在内存中,其中键通常是缓存块的ID,而值则是查询的结果对象。

  • 使用场景

    • 在同一个事务内多次查询相同的数据。

    • 对性能要求较高,但数据不需要频繁更新的应用场景。

二级缓存

  • 二级缓存是基于命名空间(namespace)级别的缓存,它的作用范围比一级缓存更广。如果多个SqlSession之间需要共享某些查询结果,那么可以启用二级缓存。

  • 特性

    • 需要手动配置才能开启。

    • 作用于同一个命名空间内的所有SqlSession。

    • 可以通过设置<cache>标签来开启,并且可以自定义缓存策略。

    • 当执行增删改操作时,默认情况下不会自动清空二级缓存,除非显式地配置了刷新策略。

  • 配置

    • 在映射文件中添加<cache/>标签来开启二级缓存。

    • 可以通过<cache-ref namespace="otherNamespace"/>来引用其他命名空间的缓存配置。

  • 使用场景

    • 数据不经常发生变化,但是读取频繁的情况。

    • 多个用户可能同时请求相同的数据。

注意事项:

  • 一级缓存是SqlSession级别的,当SqlSession关闭后,该缓存也就失效了。

  • 二级缓存可以跨SqlSession共享,但如果涉及到大量并发写操作,则可能会导致缓存数据的一致性问题。

  • 如果你的应用中存在高并发写操作,应该谨慎使用二级缓存,或者采取适当的缓存更新策略。

  • MyBatis的缓存机制虽然强大,但在实际使用中还需要结合具体的业务场景进行合理配置。对于特别复杂的缓存需求,可能需要考虑集成第三方缓存解决方案如Redis、Ehcache等。

二级缓存的配置

MyBatis的全局cache配置

在Mapper XML文件中设置缓存,默认情况下是没有开启缓存的

在Mapper XML文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置cache

标签:语句,缓存,映射,resultMap,SQL,MyBatis,id,属性
From: https://blog.csdn.net/TuSi_Cat/article/details/143017757

相关文章

  • flink同步MySQL数据的时候出现内存溢出
    flink同步MySQL数据的时候出现内存溢出背景:需要将1000w的某类型数据同步到别的数据源里面,使用公司的大数据平台可以很快处理完毕,而且使用的内存只有很少很少量(公司的大数据平台的底层是flink,但是连接器使用的是chunjun开源产品),由于我个人想使用flink原生的连接器来尝试一下,所......
  • 【图书介绍】《Spring+Spring MVC+MyBatis从零开始学(视频教学版)(第3版)》
    本书重点基于版本Spring 6.1.10、Spring MVC 6.1.10、MyBatis 3.5.16。详解SSM框架各组件用法及其整合方法,实战新闻发布管理系统、图书管理系统开发。配套示例源码、PPT课件、教学大纲、习题答案、教学视频。内容简介本书全面讲解使用流行轻量级框架SSM(Spring+Spring......
  • 【MYSQL学习】MySQL连接查询:复杂连接的5大绝招你GET到了吗?
    ......
  • MyBatis 动态 SQL 详解
    1.什么是动态SQL?在使用MyBatis进行数据库查询时,可能会遇到一些需要根据条件动态生成SQL语句的情况。MyBatis提供了强大的动态SQL支持,通过标签和条件语句,可以让SQL语句根据不同的输入参数动态生成。这大大提高了代码的灵活性,避免了拼接SQL语句的繁琐和出错风险。......
  • 【MYSQL学习】MySQL索引:删除索引的5大绝招你GET到了吗?
    ......
  • mySql数据库备份与恢复
    MySQL数据库的备份和恢复是保证数据安全的重要操作。以下是关于MySQL数据库备份与恢复的详细步骤和说明。一、MySQL数据库备份1.使用 mysqldumpmysqldump 是MySQL提供的一个实用工具,用于备份数据库。备份单个数据库:mysqldump-uusername-pdbname>backup.sql......
  • SQL语句——日期题目总结
    第一题:查询本周考试的学生成绩。 DATA_ADD()语法:date就是要操作的日期,INTERVAL就是要间隔的日期expr可以写数字,unit用来写单位,比如DATE_ADD(CURDATE(),INTERVAL7DAY)就是当前日期加上一星期。CURDATE()就是当前日期,格式:DATE_ADD(date,INTERVALexprunit)代码解释:就......
  • MySQL的server层和存储引擎层是如何交互的(处理SQL)
    假设表结构createtabletest(aintnotnull,bintnotnull,cintnotnull,primarykey(a),uniquekeyidx_b(b))Engine=InnoDB;select*fromtestwhereb<2andc<3;MySQL服务层会将SQL解析,将where条件交给存储引擎层。存储引擎层拿到where条件后,发现正好......
  • sql-labs靶场第十五关测试报告
    目录一、测试环境1、系统环境2、使用工具/软件二、测试目的三、操作过程1、寻找注入点2、注入数据库①寻找注入方法②爆库,查看数据库名称③爆表,查看security库的所有表④爆列,查看users表的所有列⑤成功获取用户名和密码信息3、sqlmap注入方法①爆库②爆表③爆......
  • 力扣刷题_SQL50题
    高频SQL50题(基础版)-学习计划-力扣(LeetCode)全球极客挚爱的技术成长平台602.好友申请II:谁有最多的好友题目:编写解决方案,找出拥有最多的好友的人和他拥有的好友数目。生成的测试用例保证拥有最多好友数目的只有1个人。CreatetableIfNotExistsRequestAccepte......