前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL映射文件

SQL映射文件

作者头像
xiaozhangStu
发布2023-05-04 19:25:55
3630
发布2023-05-04 19:25:55
举报
文章被收录于专栏:xiaozhangStuxiaozhangStu

SQL映射文件

SQL映射文件的顶级元素

mapper
namespace

命名空间 namespace和子元素的id联合保证唯一,区别不同的mapper 绑定DAO接口 namespace的命名必须跟某个接口同名 接口中的方法与映射文件中SQL语句id一一对应

代码语言:javascript
复制
<mapper namespace="cn.smbms.dao.user.UserMapper">
    <select id="getUserList" …
        ……
    </select>
</mapper>
cache

配置给定命名空间的缓存

cache-ref
resultMap

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

代码语言:javascript
复制
<resultMap type="User" id="userList">
<result property="id" column="id"/>
<result 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">
    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二者不能同时存在,本质上都是Map数据结构

resultMap自动映射匹配前提:字段名与属性名一致 resultMap的自动映射级别-autoMappingBehavior

collection

复杂类型集合,一对多 内部嵌套 映射一个嵌套结果集到一个列表 属性 property:映射数据库列的实体对象的属性 ofType:完整Java类名或者别名(集合所包括的类型) resultMap:引用外部resultMap 子元素 id result property:映射数据库列的实体对象的属性 column:数据库列名或者别名

代码语言:javascript
复制
<settings>
    <setting  name="autoMappingBehavior" value="NONE"/>
</settings>
​
sql

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

insert

映射插入语句

代码语言:javascript
复制
<insert  id="add" parameterType="User" >
 insert into  smbms_user (userCode,userName,userPassword) 
        values ( #{userCode},#{userName},#{userPassword})
</insert>
update

映射更新语句

代码语言:javascript
复制
<update id ="modify" parameterType="User">
update smbms_user set userCode = #{userCode},
             userName = #{userName},
              userPassword = #{userPassword}  where id = #{id}
</update>
delete

映射删除语句

代码语言:javascript
复制
<delete id ="deleteUserById" parameterType="int">
    delete from smbms_user where id = #{id}
</delete>
select

映射查询语句

id

命名空间中唯一的标识符 接口中的方法与映射文件中的SQL语句id一一对应

parameterType

传入SQL语句的参数类型

基础数据类型

int、String、Date等 只能传入一个,通过#{参数名}即可获取传入的值

复杂数据类型

Java实体类、Map等 通过#{属性名}或者#{map的keyName}即可获取传入值

resultType

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

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

小结

属性

描述

id

在命名空间中唯一的标识符,可以被用来引用这条语句

parameterType

将会传入这条语句的参数类的完全限定名或别名

resultType

从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用resultType或resultMap,但不能同时使用

resultMap

命名引用外部的resultMap

flushCache

将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。默认值:false

useCache

将其设置为true,将会导致本条语句的结果被缓存。默认值:true

timeout

这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)

fetchSize

这是暗示驱动程序每次批量返回的结果行数

statementType

STATEMENT,PREPARED或CALLABLE的一种。让MyBatis选择使用Statement,PreparedStatement或CallableStatement。默认值:PREPARED

resultSetType

FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理)

缓存(面试可能会问)

一级缓存

一级缓存也叫本地缓存,MyBatis 的一级缓存是在会话(SqlSession)层面进行缓存的。MyBatis 的一级缓存是默认开启的,不需要任何的配置。增删改会刷新二级缓存

二级缓存

不安全,一般不用

开启步骤

mybatis.xml配置文件中加入

代码语言:javascript
复制
<!--开启二级缓存-->    
    <setting name="cacheEnabled" value="true"/>   

2.在需要开启二级缓存的mapper.xml中加入caceh标签

代码语言:javascript
复制
<cache/>

3.让使用二级缓存的POJO类实现Serializable接口

代码语言:javascript
复制
public class User implements Serializable { }

4.不同的session去操作

如果我们配置了二级缓存就意味着:

(1)映射语句文件中的所有select语句将会被缓存。 (2)映射语句文件中的所有insert、update和delete语句会刷新缓存。 (3)缓存会使用默认的Least Recently Used(LRU,最近最少使用的)算法来收回。 (4)根据时间表,比如No Flush Interval,(CNFI没有刷新间隔),缓存不会以任何时间顺序来刷新。 (5)缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用 (6)缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全的被调用者修改,不干扰其他调用者或线程所做的潜在修改。

总结
  1. MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。
  2. MyBatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用二级缓存的条件比较苛刻。
  3. 在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将MyBatis的Cache接口实现,有一定的开发成本,直接使用Redis、Memcached等分布式缓存可能成本更低,安全性也更高。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SQL映射文件
    • SQL映射文件的顶级元素
      • 缓存(面试可能会问)
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档