java 基础:第九章:mybatis 数据库持久层框架Mapper XML详解

版权声明:wslixiaoliang https://blog.csdn.net/wslixiaoliang/article/details/82984132

1.简介

什么是 MyBatis ?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

2.Mapper XML 映射文件

MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。

SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

cache – 给定命名空间的缓存配置。
cache-ref – 其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句

3.元素的应用

(1)select 元素:查询

<!--1.根据关键词ID查询关键词 -->
    <select id="getKeywordById" resultMap="ResultMap" parameterType="java.util.Map" >
    SELECT
        KYWDS_ID,
        KYWDS_NM,
        CHNL_CODE,
        REGN_ID,
        TOTAL_SERCH_QUT,
        MON_SERCH_QUT,
        WEEK_SERCH_QUT,
        DAILY_SERCH_QUT,
        CRT_TIME,
        INVLD_TIME,
        OP_PRSN_ID,
        TENANT_ID
    FROM t_km_key_word_statis
    WHERE 1=1
    <if test="keywordIds !=null and keywordIds.size() > 0">
        AND KYWDS_ID IN
        <foreach item="keywordId" index="index" collection="keywordIds" open="(" separator="," close=")">
            #{keywordId}
        </foreach>
    </if>
    </select>
    <!--2.查询总条数 -->
    <select id="getTotalCount" parameterType="java.util.Map" resultType="java.lang.Integer">
    select count(*) from t_km_key_word_statis
        WHERE 1=1
        <if test="keywordName !=null and keywordName!=''">
            AND KYWDS_NM LIKE '%{keywordName}%'
        </if>
        <if test="rangeId !=null and rangeId!=''">
            AND REGN_ID = #{rangeId}
        </if>
        <if test="statusCode !=null and statusCode == 1">
            AND INVLD_TIME >= now()
        </if>
        <if test="statusCode !=null and statusCode == 2 ">
            AND INVLD_TIME &lt; now()
        </if>
        <if test="operPersonId !=null and operPersonId!=''">
            AND OP_PRSN_ID = #{operPersonId}
        </if>
    </select>
    <!--3.查询关键词是否存在 -->
    <select id="getSameKeyword" parameterType="java.util.Map" resultType="java.lang.String">
        SELECT KYWDS_NM FROM t_km_key_word_statis
        WHERE 1=1
        AND KYWDS_NM = #{keywordName}
        AND REGN_ID  = #{rangeId}
        AND CHNL_CODE  = #{channelCode}
        AND INVLD_TIME >= now()
    </select>

    <!--4.关键词维护页面:条件查询 -->
    <select id="getKeywordsByCondition" parameterType="java.util.Map" resultMap="ResultMap">
        SELECT
        KYWDS_ID,
        KYWDS_NM,
        CHNL_CODE,
        REGN_ID,
        TOTAL_SERCH_QUT,
        MON_SERCH_QUT,
        WEEK_SERCH_QUT,
        DAILY_SERCH_QUT,
        CRT_TIME,
        INVLD_TIME,
        OP_PRSN_ID,
        TENANT_ID
        FROM t_km_key_word_statis
        WHERE 1=1
        <if test="keywordName !=null and keywordName!=''">
            AND KYWDS_NM LIKE concat("%",#{keywordName},"%")
        </if>
        <if test="rangeId !=null and rangeId!=''">
            AND REGN_ID = #{rangeId}
        </if>
        <if test="statusCode !=null and statusCode == 1">
            AND INVLD_TIME >= now()
        </if>
        <if test="statusCode !=null and statusCode == 2 ">
            AND INVLD_TIME &lt; now()
        </if>
        <if test="operPersonId !=null and operPersonId!=''">
            AND OP_PRSN_ID = #{operPersonId}
        </if>
        ORDER BY CRT_TIME DESC
        LIMIT #{start}, #{limit}
    </select>

(2)insert 元素:新增

<!--5.新增关键词-->
    <insert id="addKeyword" parameterType="java.util.Map" >
    INSERT  INTO t_km_key_word_statis
        <trim prefix="(" suffix=")" suffixOverrides="," >
            <if test="keywordId != null and keywordId!=''" >
                KYWDS_ID,
            </if>
            <if test="keywordName != null and keywordName!=''" >
                KYWDS_NM,
            </if>
            <if test="rangeId != null and rangeId!=''" >
                REGN_ID,
            </if>
            <if test="createTime != null and createTime!=''" >
                CRT_TIME,
            </if>
            <if test="invildTime != null and invildTime!=''" >
                INVLD_TIME,
            </if>
            <if test="channelCode != null and channelCode!=''" >
                CHNL_CODE,
            </if>
            <if test="operPersonId != null and operPersonId!=''" >
                OP_PRSN_ID,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides="," >
            <if test="keywordId != null and keywordId!=''" >
                #{keywordId,jdbcType=BIGINT},
            </if>
            <if test="keywordName != null and keywordName!=''" >
                #{keywordName,jdbcType=VARCHAR},
            </if>
            <if test="rangeId != null and rangeId!=''" >
                #{rangeId,jdbcType=VARCHAR},
            </if>
            <if test="createTime != null and createTime!=''" >
                #{createTime,jdbcType=TIMESTAMP},
            </if>
            <if test="invildTime != null and invildTime!=''" >
                #{invildTime,jdbcType=TIMESTAMP},
            </if>
            <if test="channelCode != null and channelCode!=''" >
                #{channelCode,jdbcType=VARCHAR},
            </if>
            <if test="operPersonId != null and operPersonId!=''" >
                #{operPersonId,jdbcType=VARCHAR},
            </if>
        </trim>
    </insert>

(3)update 元素:修改

<!--6.修改/逻辑删除关键词-->
    <update id="updateKeywordsById" parameterType="java.util.Map" >
        UPDATE t_km_key_word_statis
        <set >
            <if test="invildTime != null and invildTime!=''" >
                INVLD_TIME = #{invildTime,jdbcType=TIMESTAMP},
            </if>
        </set>
        WHERE 1=1
        <if test="keywordIds !=null and keywordIds.size() > 0">
            AND KYWDS_ID IN
            <foreach item="keywordId" index="index" collection="keywordIds" open="(" separator="," close=")">
                #{keywordId}
            </foreach>
        </if>
    </update>

(4)delete 元素:删除

<!--7.物理删除关键词-->
    <delete id="removeKeywordsById" parameterType="java.util.Map" >
        DELETE FROM t_km_key_word_statis
        WHERE KYWDS_ID IN
        <foreach item="keywordId" index="index" collection="keywordIds" open="(" separator="," close=")">
            #{keywordId}
        </foreach>
    </delete>

(5)sql 元素:通用语句块

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </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>

4.结果集

<resultMap id="ResultMap" type="com.cmos.ngkm.beans.portalnew.Keyword" >
        <id column="KYWDS_ID" property="keywordId" /><!--关键词ID-->
        <result column="KYWDS_NM"  property="keywordName"/><!--关键词名称-->
        <result column="CHNL_CODE"  property="channelCode"/><!--渠道编码-->
        <result column="REGN_ID"  property="rangeId"/><!--归属省份-->
        <result column="TOTAL_SERCH_QUT"  property="totalClick"/><!--总搜索量-->
        <result column="MON_SERCH_QUT"  property="monthClick"/><!--月搜索量-->
        <result column="WEEK_SERCH_QUT"  property="weekClick"/><!--周搜索量-->
        <result column="DAILY_SERCH_QUT" property="daylyClick" /><!--日搜索量-->
        <result column="CRT_TIME" property="createTime" /><!--创建时间-->
        <result column="INVLD_TIME" property="invildTime" /><!--失效时间-->
        <result column="OP_PRSN_ID" property="operPersonId" /><!--操作人-->
        <result column="TENANT_ID" property="tenantId" /><!--租户ID-->
    </resultMap>
//Mapper XML对应返回值类型:

1. resultMap : 结果集[对象等]

若返回值为:List<Keyword> 
则结果集应为:resultMap:ResultMap

2. resultType : Integer,String ,Long

若返回值为:List<String> 
则结果集应为:resultType:java.lang.String
写成java.util.List就会报错!

猜你喜欢

转载自blog.csdn.net/wslixiaoliang/article/details/82984132