• mybatis-xml映射器


    XML映射器

    要使用XML文件需要在pom.xml里面的build中配置映射路径,不然编译后xml到不了classpath中,在springboot中,还需要在启动类或者配置类上加上注解@MapperScan("com.example.springstudy.mapper")//根据项目的mapper位置填写。

    <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                    <excludes>
                        <exclude>**/*.yml</exclude>
                    </excludes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
            </resources>
    

    SQL映射文件的几个顶级元素

    cache – 该命名空间的缓存配置。
    cache-ref – 引用其它命名空间的缓存配置。
    resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
    sql – 可被其它语句引用的可重用语句块。
    insert – 映射插入语句。
    update – 映射更新语句。
    delete – 映射删除语句。
    select – 映射查询语句。

    1.select

    select 元素允许你配置很多属性来配置每条语句的行为细节。

    <select
      id="selectPerson"//在命名空间中唯一的标识符,可以被用来引用这条语句。(语句名)
      parameterType="int"//将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
      resultType="hashmap"//期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。
      resultMap="personResultMap"//对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。  
      flushCache="false"//将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。
      useCache="true"//将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
      timeout="10"//这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
      fetchSize="256"//这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。
      statementType="PREPARED"//可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
      resultSetType="FORWARD_ONLY">//FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。
    

    2.insert, update 和 delete

    <insert
      id="insertAuthor"//在命名空间中唯一的标识符,可以被用来引用这条语句。
      parameterType="domain.blog.Author"//将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
      flushCache="true"//将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:(对 insert、update 和 delete 语句)true。
      statementType="PREPARED"//可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
      keyProperty=""//(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。
      keyColumn=""//(仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。
      useGeneratedKeys=""//(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
      timeout="20">//这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
    
    <update
      id="updateAuthor"
      parameterType="domain.blog.Author"
      flushCache="true"
      statementType="PREPARED"
      timeout="20">
    
    <delete
      id="deleteAuthor"
      parameterType="domain.blog.Author"
      flushCache="true"
      statementType="PREPARED"
      timeout="20">
    

    字符串替换

    默认情况下,使用 #{} 参数语法时,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数(就像使用 ? 一样)。 这样做更安全,更迅速,通常也是首选做法。
    不过有时你就是想直接在 SQL 语句中直接插入一个不转义的字符串。 比如 ORDER BY 子句,这时候你可以:

    ORDER BY ${columnName}
    

    这样,MyBatis 就不会修改或转义该字符串了。
    当 SQL 语句中的元数据(如表名或列名)是动态生成的时候,字符串替换将会非常有用。
    举个例子,如果你想 select 一个表任意一列的数据时,不需要这样写:

    @Select("select * from user where id = #{id}")
    User findById(@Param("id") long id);
    
    @Select("select * from user where name = #{name}")
    User findByName(@Param("name") String name);
    
    @Select("select * from user where email = #{email}")
    User findByEmail(@Param("email") String email);
    

    而是可以只写这样一个方法:

    @Select("select * from user where ${column} = #{value}")
    User findByColumn(@Param("column") String column, @Param("value") String value);
    

    其中 ${column} 会被直接替换,而 #{value} 会使用 ? 预处理。 这样,就能完成同样的任务:

    User userOfId1 = userMapper.findByColumn("id", 1L);
    User userOfNameKid = userMapper.findByColumn("name", "kid");
    User userOfEmail = userMapper.findByColumn("email", "noone@nowhere.com");
    

    这种方式也同样适用于替换表名的情况。

    提示:用这种方式接受用户的输入,并用作语句参数是不安全的,会导致潜在的 SQL 注入攻击。因此,要么不允许用户输入这些字段,要么自行转义并检验这些参数。

    mybatis中<![CDATA[]]>的作用

    在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]>来解决。
    <![CDATA[ ]]> 是什么,这是XML语法。在CDATA内部的所有内容都会被解析器忽略。
    如果文本包含了很多的"<"字符 <=和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。
    但是有个问题那就是 <if test=""> </if> <where> </where> <choose> </choose> <trim> </trim> 等这些标签都不会被解析,所以我们只把有特殊字符的语句放在 <![CDATA[ ]]> 尽量缩小 <![CDATA[ ]]> 的范围。

    <select id="selectTable" resultType="com.test.selectDTO">
        select * from table
        where filed1 <![CDATA[<>]]> 0
        <if test="field2!=null and field2.size()>0">
          AND field2 >= field2
        </if>
    </select>
    
    所有博客均为自己学习的笔记。如有错误敬请理解。
  • 相关阅读:
    CSS之边界塌陷
    不用for loop循环一个读取一个文件
    CSS之毗邻选择器与普通兄弟选择器的区别
    python 一行代码
    Regex Golf 练习记录
    c实现双向链表
    c实现单向链表
    c++实现 String 类
    js获取指定小时日期格式化
    git clone Timed out 解决
  • 原文地址:https://www.cnblogs.com/tangtang-benben/p/14516199.html
Copyright © 2020-2023  润新知