MyBatis中SQL映射文件

Posted 一宿君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis中SQL映射文件相关的知识,希望对你有一定的参考价值。

学习目标

  • 列举下SQL映射文件的几个顶级元素?
  • resultType和resultMap的区别是什么?
  • MyBatis多参数如何处理?有几种方法?
  • mapper元素的namespace属性的作用是什么?
  • 不同的SQL映射文件,元素的id必须不同吗?
  • association和collection元素的理解?

MyBatis基本要素(回顾)

1 核心对象

  • SqlSessionFactoryBuilder
  • SqlSessionFactory
  • SqlSession
  • 通过SqlSession实例直接运行映射的SQL语句
  • 基于mapper接口接口的方式执行SQL语句
    在这里插入图片描述

2 系统核心配置文件

  • properties
  • typeAliases
  • environments
  • mappers

3 SQL映射文件

  • 掌握通过SQL映射文件进行增删改查
  • 掌握参数的作用
  • 掌握resultMap的作用
  • 了解Cache的使用
  • SQL映射文件中几个顶级元素(按照定义的顺序)
    • mapper-namespace(命名空间,在mybatis中,映射文件中的namespace是用于绑定Dao接口的,即面向接口编程。当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句。)
    • cache 配置给定命名空间的缓存
    • cache-ref 从其他命名空间中引入缓存配置
    • resultMap 用来描述数据库结果集和对象的字段对应关系(即使类中属性和数据库表只字段不一致时,可以使用映射)
    • sql 可以重用的SQL块,也可以被其他语句引用
    • insert 映射插入语句
    • update 映射更新语句
    • delete 映射删除语句
    • select 映射查询语句

3.1 mapper

namespace:命名空间

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

    小贴士:
    如果namespace处写了mapper文件对应的DAO接口,但是实际却没有创建对应的DAO接口,这时候调用mapper映射文件,执行相应SQL也不会报错,只不过执行id的方法略有不同,MyBatis内部机制在编译执行SQL代码前,先找到对应mapperDao接口,如果没有,则会创建临时的接口,以供执行SQL语句使用。演示如下:
    在这里插入图片描述
    在这里插入图片描述

  • 如果创建了对应的实体类mapper接口,执行SQL,调用id方法执行如下:

    在这里插入图片描述
    在这里插入图片描述

3.2 select

  • select是MyBatis中最常见的元素之一
  • select语句有很多属性可以详细配置每一条语句
  • id

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

  • parameterType

    传入SQL语句的参数类型
    基础数据类型:

    • int、String、Date
    • 只能传入一个参数,通过 #{参数名} 即可获取传入的值
    • 只能传入一个参数,通过 ${value} 即可获取传入的值,但是此种方法会有注入式攻击,不安全(不推荐使用)
  • #{} 表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止注入。#{}可以接收简单类型或pojo属性值。如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。(推荐使用)
  • ${} 表示拼接SQL串,通过可以将parameterType传入的内容拼接在SQL中,且不进行jdbc转换,可以接收简单类型转换或pojo属性值,如果parameterType传输单个简单类型值,花括号中只能是value。(不推荐使用)

    复杂数据类型:

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

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

#{}和${}的区别演示

  • #{}可防止注入式攻击——${}会有注入式攻击
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 然后我们所说的注入式攻击如下所示:

    在这里插入图片描述
  • 我们将上述选中的SQL语句赋值到oracle可视化操作工PL/SQL中,显示如下:

    在这里插入图片描述

以上是关于MyBatis中SQL映射文件的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis SQL映射文件

MyBatis学习-映射文件标签篇

SSM - Mybatis SQL映射文件

MyBatis中SQL映射文件

MyBatis学习 之 二SQL语句映射文件resultMap

mybatis 的 sql 映射文件增删改查的学习