zoukankan      html  css  js  c++  java
  • mybatis映射文件属性详解和动态SQL

    mybatis映射文件属性详解和动态SQL笔记

    <SELECT>

    id = ""  唯一标识
    parameterType = "" 表示传入SQL语句的参数类的全限定名或者别名,它是一个可选属性,因为
    mybatis可以根据TypeHandler 推断出具体传入的参数.默认值为unset(依赖于驱动)
    resultType = "" 从SQL中返回的参数类型的全限定名或者别名.如果是集合类型,那么返回的应该
    就是集合可以包含的类型,返回时可以使用resultType 或 resultMap
    resultMap = "" 表示外部resultMap的命名引用.返回时可以使用resultMap或者resultType
    flushCache 表示在调用sql语句后 是否需要MyBatis 清空之前查询的本地缓存和二级缓存.值
    为布尔值 默认为false.如果设置为true,任何时候只要SQL语句被调用,都会清空本地缓存和
    二级缓存.
    useCache 用于控制二级缓存的开启和关闭.其值为布尔值 默认为true 表示查询结果存入二级缓存
    timeout 用于设置超时时间 单位秒 超出时抛出异常
    fetchSize 获取记录的总条数设定 其默认值为unset
    statementType 用于设置mybatis使用哪个JDBC的Statement工作,其值为 STATEMENT PREPARED(默认)
    和CALLABLE,分别对应JDBC中的Statement PreparedStatement和CallableStatement
    resultSetType = "" 指定结果集的类型 可设置为 FORWARD_ONLY SCROLL_SENSITIVE或SCROLL_INSENSITIVE
    默认值依赖于驱动

    <insert>

     keyProperty="id" (仅在insert和update有用) 此属性作用将插入或更新操作时的返回值赋值给实体类的某个属性,
    通常会设置主键,如果为联合主键多个值之间用逗号隔开
    keyColumn = "" (仅在insert和update有用) 此属性用于设置第几列是主键,当主键列不是表中的第一列时需要设置.
    联合主键时,逗号隔开
    useGeneratedKeys = "" (仅在insert和update有用) 此属性会使Mybatis使用JDBC的getGeneratedKeys()
    方法来获取数据库内部产生的主键,如MySql和sqlServer自动递增的字段,默认为false.
    主键不支持自动增长或者 数据库中没有设置为自定增长
    <selectKey keyProperty="id" resultType="Integer" order="BEFORE" >
    select if(max(id) is null , 1, max(id) +1) as newId from 表名
    </selectKey>
    order="" 属性可以被设置为BEFORE或AFTER。如果设置为BEFORE,那么它会首先执行<selectKey>元素中的配置来设置
    主键,然后执行插入语句;如果设置为AFTER,那么它会先执行插入语句,然后执行<selectKey>元素中的配置内容

    <update>

    update 和 delete属性一致  与insert一样执行完后返回一条记录整数

    <resultMap>

    <resultMap id="resultMap" type="com.example.mybatisplus.pojo.User">
    <constructor>
    <idArg column="id" javaType="Integer"/>
    <arg column="name" javaType="String"/>
    <arg column="age" javaType="Integer"/>
    </constructor>
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
    <result property="createTime" column="create_time"/>
    <association property="id"/>
    <collection property="id" />
    <discriminator column="" javaType="">
    <case value="1" resultMap="" resultType=""/>
    <case value="0" resultMap="" resultType=""/>
    </discriminator>
    </resultMap>

    <resultMap> 元素表示结果映射集,是MyBatis中最重要也是最强大的元素。它的主要作用是定义映射规则、级联的更新以及
    定义类型转化器等。
    id = "" 唯一标识
    type = "" 需要映射的实体
    子元素<constructor>用于配置构造方法(当一个POJO中未定义无参的构造方法时,就可以使用<constructor>元素进行配置)
    子元素 <id/> 用于表示哪个列是主键
    子元素<result/>用于表示POJO和数据表中普通列的映射关系 属性property="id" 表示实体类属性名,column 表示数据表列名
    <association>和<collection>用于处理多表时的关联关系
    <discriminator>元素主要用于处理一个单独的数据库查询返回很多不同数据类型结果集的情况。
    column="" 设置要进行鉴别比较值的列名。
    javaType="" 指定列的类型,保证使用相同的Java类型来比较值。
    <case value="">
    value:该值为discriminator标签column属性用来匹配的值。
    resultMap:当column的值和value的值匹配时,可以配置使用resultMap指定的映射,resultMap优先级高于resultType。
    resultType:当column的值和value的值匹配时,用于配置使用resultType指定的映射
    </case>
    </discriminator>

    动态SQL

      <if test="name != null and name != '' ">
    like concat('%', #{xxx}, '%')
    </if>
    问题? 如果想要更新某一个对象,就需要发送所有的字段给持久化对象,然而实际应用中,大多数情况下都是更新的某一个或几个字段。
    如果更新的每一条数据都要将其所有的属性都更新一遍,那么其执行效率是非常差的。
    方案: 使用了<set>和<if>元素相结合的方式来组装update语句。其中<set>元素会动态前置SET关键字,同时也会消除SQL语句中最后一个多余的逗号;
    <if>元素用于判断相应的字段是否传入值,如果传入的更新字段非空,就将此字段进行动态SQL组装,并更新此字段,否则此字段不执行更新。
    <set>
    <if test="name != null and name != '' ">
    name = #{xxx},
    </if>
    <if test="age != null and age != '' ">
    age = #{xxx},
    </if>
    </set>

    in
    <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
    #{item}
    </foreach>
    · item:配置的是循环中当前的元素。
    · index:配置的是当前元素在集合的位置下标。
    collection:配置的list是传递过来的参数类型(首字母小写),它可以是一个array、list(或collection)、Map集合的键、
    POJO包装类中数组或集合类型的属性名等。
    · open和close:配置的是以什么符号将这些集合元素包装起来。
    · separator:配置的是各个元素的间隔符。
    like concat('%', #{xxx}, '%') concat在oracle中无效 此时需要使用<bind>元素拼接
    <select>
    <bind name = "pattern_name" value = " '%'+ name +'%' "/>
    select * from user
    where name like #{pattern_name}
    </select>
    value = " '%'+ name +'%' " name 可以写_parameter.getName()也可以直接使用传入的字段属性名 既name



    个人网址 http://threenut.cn/
  • 相关阅读:
    理解JAVA常量池
    java存储位置经典例子
    java通过句柄访问对象
    常用排序算法小结
    String,StringBuffer与StringBuilder的区别
    BGP
    BGP
    python编码问题实例
    从一段代码学习二叉树
    二叉树学习笔记--先序遍历
  • 原文地址:https://www.cnblogs.com/july7/p/14705325.html
Copyright © 2011-2022 走看看