mybatis笔记 映射配置文件

在数据变更语句 insert,update 和 delete 时,我们想要知道更新的那条语句的对应的字段(一般就是id),我们可以使用selectKey标签。

selectKey标签属性:

keyPropertyselectKey 语句结果应该被设置到的目标属性。如果生成列不止一个,可以用逗号分隔多个属性名称。
keyColumn返回结果集中生成列属性的列名。如果生成列不止一个,可以用逗号分隔多个属性名称。
resultType结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 Object 或 Map。
order可以设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它首先会生成主键,设置 keyProperty 再执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。
statementType和前面一样,MyBatis 支持 STATEMENTPREPARED 和 CALLABLE 类型的映射语句,分别代表 StatementPreparedStatement 和 CallableStatement 类型。
    <!--
        keyColumn:表示你要查询哪些字段,多个用,隔开
        keyProperty:表示将查询的字段的结果赋值给哪个属性,多个用,隔开
        resultType:查询到的结果的类型
        order:表示在在之前还是之后执行这个查询,一般是之后AFTER
        标签体里面写查询语句,一般就查自增长的id,固定语句select last_insert_id();
    -->
    <insert id="addMember" parameterType="com.angen.pojo.Member">
        insert into dlq_member values(null,#{phone},#{username},#{password})

        <selectKey
                keyColumn="id"
                keyProperty="id"
                resultType="int"
                order="AFTER">
            select last_insert_id();
        </selectKey>
    </insert>

以上配置完成后,我们可以通过执行添加方法后,然后通过pojo类的对象.getId即可获得自增id. 

 模糊查询

<select id="searchByName" resultType="com.angen.pojo.Member">
        select * from dlq_member where `username` like concat("%",#{username},"%")
</select>

或者

<select id="searchByName" resultType="com.angen.pojo.Member">
        select * from dlq_member where username like "%${value}%"
    </select>

${}和#{}的区别

${}一定要写在引号里面,#{}一定不能写在引号里面。

无论是${}还是${}里面都是写属性名

${}是直接拼接进入sql语句,而#{}是以预处理语句?占位符的方式。所以#{}可以防止sql注入


select标签里面的resultType属性是对结果集进行自动映射,结果集中的字段名对应我们的pojo类中的成员变量名。但是如果有时候不是对应的,或者我们进行联表查询的时候,结果集和pojo类中的成员变量名不一致,那么我们就需要使用select中的resultMap属性,和resultMap标签进行手动映射。

    <!--
        resultMap属性:
        id:与select标签中的resultMap对应即可,唯一标识
        type:表示对哪个pojo类进行映射
        resultMap子标签:
        id标签:表示对主键进行映射
            property:pojo类中的属性名
            column:数据库中的字段名
        result标签:表示对其他非主键进行映射
    -->
    <resultMap id="infos" type="Member">
        <id property="id" column="id" />
        <result property="username" column="username"></result>
      
    </resultMap>

动态sql

MyBatis 动态SQL - Mybatis中文手册

if标签

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE state = ‘ACTIVE’ 
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

上面这段表示:如果传过来的title是空,那么就不执行if标签里面的语句。

<select id="findByUsernameAndPhone" parameterType="Member" resultType="com.angen.pojo.Member">
        select * from member where and 1=1
        <if test="username != null and username.length > 0">
            and username=#{username}
        </if>
        <if test="phone !=null and phone.length > 0">
            and phone=#{phone}
        </if>
    </select>

上面这段,多条件if判断,可以使用where标签的形式来写,如下:

where的作用是如果where标签中的if条件有一个成立,那么才会加上where关键字,并且把第一个and自动去掉。

<select id="findByUsernameAndPhone" parameterType="Member" resultType="com.angen.pojo.Member">
        select * from member
        <where>
            <if test="username != null and username.length > 0">
                and username=#{username}
            </if>
            <if test="phone !=null and phone.length > 0">
                and phone=#{phone}
            </if>
        </where>
    </select>

根据多个id批量查询的案例

    /**
     * 根据多个id查询
     */
    List<Member> findByids(List<Integer> ids);
    <!--
        foreach 标签:
        collection要遍历的对象,如果要遍历的对象是一个集合那么就写list
        item 遍历出来的每一个元素
        index 遍历出来每一个元素的下标
        separator指定分割符,在两个字符之间添加
        open表示在拼接的语句之前
        close表示在拼接的语句之后
    -->
    <select id="findByids" parameterType="integer" resultType="com.angen.pojo.Member">
        select * from dlq_member
                <foreach collection="list" item="id" index="i" separator=","
                         open="where id in (" close=")">
                    #{id}
                </foreach>
    </select>

sql标签和include标签

    <!--
        sql标签
        可以定义sql片段,然后可以反复使用,在需要使用的地方使用include标签
    -->
    <sql id="selectAll">
        select * from dlq_member
    </sql>
    <select id="searchByName" resultType="com.angen.pojo.Member">
        <include refid="selectAll"></include>
        where username like "%${value}%"
    </select>

sql标签定义字段

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.nuris.hub.project.tongduns.mapper.QueryLogMapper">
    <resultMap id="BaseResultMap" type="QueryLog">
        <id property="logseq" column="logseq" jdbcType="INTEGER" />
        <result property="spiderid" column="spider_type_id" jdbcType="INTEGER" />
        <result property="userid" column="user_id" jdbcType="VARCHAR" />
        <result property="organid" column="organ_no" jdbcType="VARCHAR" />
        <result property="name" column="query_name" jdbcType="VARCHAR" />
        <result property="type" column="query_certtype" jdbcType="VARCHAR" />
        <result property="number" column="query_certno" jdbcType="VARCHAR" />
        <result property="querydate" column="query_date" jdbcType="VARCHAR" />
        <result property="querytime" column="query_time" jdbcType="VARCHAR" />
        <result property="queryreason" column="query_reason" jdbcType="VARCHAR" />
        <result property="querystatus" column="query_status" jdbcType="VARCHAR" />
        <result property="desc" column="log_desc" jdbcType="VARCHAR" />
        <result property="spiderAcc" column="spider_acc" jdbcType="VARCHAR" />
    </resultMap>

    <!--LOGSEQ,SPIDER_TYPE_ID,USER_ID,ORGAN_NO,QUERY_NAME,QUERY_CERTTYPE,QUERY_CERTNO,QUERY_DATE,QUERY_TIME,
    QUERY_REASON,QUERY_STATUS,LOG_DESC,SPIDER_ACC-->
    <sql id="BaseColumnList">
        <trim prefix="(" suffix=")" suffixOverrides=",">
          <if test="logseq != null and  logseq !=''">LOGSEQ,</if>
          <if test="spiderid != null and  spiderid !=''">SPIDER_TYPE_ID,</if>
          <if test="userid != null and  userid !=''">USER_ID,</if>
          <if test="organid != null and  organid !=''">ORGAN_NO,</if>
          <if test="name != null and  name !=''">QUERY_NAME,</if>
          <if test="type != null and  type !=''">QUERY_CERTTYPE,</if>
          <if test="number != null and  number !=''">QUERY_CERTNO,</if>
          <if test="querydate != null ">QUERY_DATE,</if>
          <if test="querytime != null ">QUERY_TIME,</if>
          <if test="queryreason != null and  queryreason !=''">QUERY_REASON,</if>
          <if test="querystatus != null and  querystatus !=''">QUERY_STATUS,</if>
          <if test="desc != null and  desc !=''">LOG_DESC,</if>
          <if test="spiderAcc != null and  spiderAcc !=''">SPIDER_ACC,</if>
        </trim>
    </sql>

    <!--#{logseq},#{spiderid},#{userid},#{organid},#{name},#{type},#{number},-->
    <!--#{querydate},#{querytime},#{queryreason},#{querystatus},#{desc},#{spiderAcc}-->
    <sql id="BaseColumnValueList">
        <trim prefix="values (" suffix=")" suffixOverrides=",">
          <if test="logseq != null and  logseq !=''">#{logseq},</if>
          <if test="spiderid != null and  spiderid !=''">#{spiderid},</if>
          <if test="userid != null and  userid !=''">#{userid},</if>
          <if test="organid != null and  organid !=''">#{organid},</if>
          <if test="name != null and  name !=''">#{name},</if>
          <if test="type != null and  type !=''">#{type},</if>
          <if test="number != null and  number !=''">#{number},</if>
          <if test="querydate != null ">#{querydate},</if>
          <if test="querytime != null ">#{querytime},</if>
          <if test="queryreason != null and  queryreason !=''">#{queryreason},</if>
          <if test="querystatus != null and  querystatus !=''">#{querystatus},</if>
          <if test="desc != null and  desc !=''">#{desc},</if>
          <if test="spiderAcc != null and  spiderAcc !=''">#{spiderAcc},</if>
        </trim>
    </sql>

    <sql id="TableClause">TB_CRPT_USER_QUERYLOGS</sql>

    <delete id="deleteByReportnum" parameterType="String">
        delete from <include refid="TableClause" />
    </delete>

    <insert id="insert" parameterType="QueryLog">
        <!-- 获取序列值 -->
        <selectKey keyProperty="logseq" resultType="INTEGER" order="BEFORE">
            select SEQ_USER_QUERYLOGS_LOGSEQ.nextval
            from sysibm.dual
        </selectKey>
        <!-- 插入实体类 -->
        insert into
        <include refid="TableClause" />
        <include refid="BaseColumnList" />
        <include refid="BaseColumnValueList" />

    </insert>

</mapper>

foreach标签,一般在批量添加数据的时候运用

<insert id="insertGradeInfos" parameterType="java.util.List">
        INSERT INTO TB_GR_RATINGINFO(RECODENO, REPORTID, PC010Q01, PC010Q02, PC010S01, ADD_DATE, ADD_TIME)
        VALUES
        <foreach collection="list" item="item" index="index" separator=",">
            (SEQ_ZX2_RATINGINFO_RECORDNO.nextval, #{item.reportId}, #{item.PC010Q01}, #{item.PC010Q02},
            #{item.PC010S01}, current date,current time)
        </foreach>
    </insert>


版权声明:本文为qq_42572322原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。