• mybatis相关知识积累


    mybatis

    Statement

    Statement对象用于将 SQL 语句发送到数据库中。

    实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL语句的包容器:

    1. Statement
    2. PreparedStatement(它从 Statement 继承而来
    3. CallableStatement(它从 PreparedStatement 继承而来)。
      它们都专用于发送特定类型的 SQL 语句

    • Statement 对象用于执行不带参数的简单 SQL语句
    • PreparedStatement 对象用于执行带或不带 IN参数的预编译 SQL语句
    • CallableStatement 对象用于执行对数据库已存储过程的调用。

    sql

    这个元素可以被用来定义可重用的 SQL 代码段,这些 SQL 代码可以被包含在其他语句中。它可以(在加载的时候)被静态地设置参数。 在不同的包含语句中可以设置不同的值到参数占位符上。比如:

    <sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
    

    这个 SQL 片段可以被包含在其他语句中,例如

    <select id="selectUsers" resultType="map">
      select
        <include refid="userColumns"><property name="alias" value="t1"/></include>,
        <include refid="userColumns"><property name="alias" value="t2"/></include>
      from some_table t1
        cross join some_table t2
    </select>
    

    属性值也可以被用在 include 元素的 refid 属性里或 include 元素的内部语句中,例如:

    <sql id="sometable">
      ${prefix}Table
    </sql>
    
    <sql id="someinclude">
      from
        <include refid="${include_target}"/>
    </sql>
    
    <select id="select" resultType="map">
      select
        field1, field2, field3
      <include refid="someinclude">
        <property name="prefix" value="Some"/>
        <property name="include_target" value="sometable"/>
      </include>
    </select>
    

    resultMap

    resultMap元素有很多子元素和一个值得深入探讨的结构。 下面是resultMap 元素的概念视图。

    结果映射(resultMap)

    • constructor-用于在实例化类时,注入结果到构造方法中
      • idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
      • arg -将被注入到构造方法的一个普通结果
    • id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
    • result – 注入到字段或 JavaBean 属性的普通结果
    • association–一个复杂类型的关联;许多结果将包装成这种类型嵌套结果映射 – 关联本身可以是一个 resultMap 元素,或者从别处引用一个
    • collection – 一个复杂类型的集合
      嵌套结果映射 – 集合本身可以是一个 resultMap 元素,或者从别处引用一个
    • discriminator – 使用结果值来决定使用哪个 resultMap
      • case – 基于某些值的结果映射
        嵌套结果映射 – case 本身可以是一个 resultMap元素,因此可以具有相同的结构和元素,或者从别处引用一个

    mybatis动态sql中的trim标签的使用
    trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码:

      1、

      select * from user 
      <trim prefix="WHERE" prefixoverride="AND |OR">
        <if test="name != null and name.length()>0"> AND name=#{name}</if>
        <if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>
      </trim>
    

      假如说name和gender的值都不为null的话打印的SQL为:select * from user where name = 'xx' and gender = 'xx'
      在红色标记的地方是不存在第一个and的,上面两个属性的意思如下:
      prefix:前缀      
      prefixoverride:去掉第一个and或者是or

      2、

      update user
      <trim prefix="set" suffixoverride="," suffix=" where id = #{id} ">
        <if test="name != null and name.length()>0"> name=#{name} , </if>
        <if test="gender != null and gender.length()>0"> gender=#{gender} ,  </if>
      </trim>
    

      假如说name和gender的值都不为null的话打印的SQL为:update user set name='xx' , gender='xx' where id='x'
      在红色标记的地方不存在逗号,而且自动加了一个set前缀和where后缀,上面三个属性的意义如下,其中prefix意义如上:
      suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)
      suffix:后缀
      

    #{},${}区别

    {}是预编译处理,${}是字符串替换。

    Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
    Mybatis在处理{}替换成变量的值。
    使用#{}可以有效的防止SQL注入,提高系统安全性。

    bind

    bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:

    <select id="selectBlogsLike" resultType="Blog">
      <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
      SELECT * FROM BLOG
      WHERE title LIKE #{pattern}
    </select>
    
  • 相关阅读:
    [极客大挑战 2019]EasySQL
    BUUCTF-[强网杯 2019]随便注-wp
    BUUCTF-[HCTF 2018]WarmUp-wp
    wp-2017ssrfme
    < 算法笔记(晴神宝典)
    < python音频库:Windows下pydub安装配置、过程出现的问题及常用API >
    < JAVA
    < 博客园自定义皮肤装饰代码
    <编译原理
    < AlexNet
  • 原文地址:https://www.cnblogs.com/lidedong/p/11095940.html
Copyright © 2020-2023  润新知