MyBatis Mapper Demo

<?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.critc.teachDemo.dao.TeachDemoDao">
    <!--缓存策略与commonDao一致,可配置多种缓存策略针对不同的业务进行选择-->
    <!-- 引用缓存:namespace:指定和哪个名称空间下的缓存一样 -->
    <cache-ref namespace="com.critc.plat.common.dao.baseCommonDao"/>

    <!--由于Emp字段与数据库中列名并不完全匹配,使用resultMap的方式进行指定,真正开发的时候将这部分写在文件开始处-->
    <resultMap type="com.critc.teachDemo.model.Emp" id="EmpT1">
        <id column="empno" property="empNo"/>
        <result column="ename" property="empName"/>
        <result column="deptno" property="deptNo"/>
    </resultMap>
    <resultMap type="com.critc.teachDemo.model.Emp" id="EmpT2">
        <id column="empno" property="empNo"/>
        <result column="ename" property="empName"/>
        <result column="dname" property="deptName"/>
    </resultMap>
    <!--一个实体类中包含另一个实体类,级联方式定义resultMap-->
    <resultMap type="com.critc.teachDemo.model.EmpPlus" id="EmpPlus">
        <id column="empno" property="empNo"/>
        <result column="ename" property="empName"/>
        <result column="deptno" property="deptNo"/>
        <!-- association定义关联对象的封装规则
            select:表明当前属性是调用select指定的方法查出的结果,也可以指定其他mapper文件中的方法,我这里写的是当前mapper文件中的方法
                   因为使用接口式编程所以dao层接口中方法与mapper中的方法是动态代理的关系,所以使用其他mapper中的方法即指定其他dao层接口中的方法
            column:指定将哪一列的值传给这个方法
            流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性
         -->
        <association property="deptPojo"
                     select="getDeptById"
                     column="deptno">
        </association>
    </resultMap>
    <!--一个实体类中包含另一个实体类,非级联方式定义resultMap-->
    <resultMap type="com.critc.teachDemo.model.EmpPlus" id="EmpPlus2">
        <id column="empno" property="empNo"/>
        <result column="ename" property="empName"/>
        <result column="deptno" property="deptNo"/>
        <result column="deptPojo_deptNo" property="com.critc.teachDemo.model.Dept.deptNo"/>
        <result column="deptPojo_dName" property="com.critc.teachDemo.model.Dept.dName"/>
    </resultMap>
    <!--一个实体类中有一个相关联一个集合-->
    <!--嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则  -->
    <resultMap type="com.critc.teachDemo.model.DeptPlus" id="DeptPlus">
        <id column="deptno" property="deptNo"/>
        <result column="dname" property="dName"/>
        <!--
            collection定义关联集合类型的属性的封装规则
            ofType:指定集合里面元素的类型
        -->
        <collection property="emps" ofType="com.critc.teachDemo.model.Emp">
            <!-- 定义这个集合中元素的封装规则 -->
            <id column="empno" property="empNo"/>
            <result column="ename" property="empName"/>
        </collection>
    </resultMap>

    <!--使用SQL标签抽取sql语句的公共部分
        抽取可重用的sql片段。方便后面引用
        1、sql抽取:经常将要查询的列名,或者插入用的列名抽取出来方便引用
        2、include来引用已经抽取的sql:
        3、include还可以自定义一些property,sql标签内部就能使用自定义的属性
        include-property:取值的正确方式${prop},
        #{不能使用这种方式}
    -->
    <sql id="selectEmp">
        select empno empno,ename empName,deptno deptno from emp
    </sql>
    <sql id="addEmp">
        insert into emp(empno,ename) values
    </sql>
    <!--
        namespace:名称空间;指定为接口的全类名
        id:唯一标识
        resultType:返回值类型
    -->
    <select id="getBaseInfo" resultType="com.critc.teachDemo.model.Emp">
        select ename empName from emp where empno='7369'
    </select>

    <!-- #{id}:从传递过来的参数中取出id值-->
    <!--当是单个参数时-->
    <!--注意这里指定的是resultMap-->
    <select id="getEmpByNo" resultMap="EmpT1">
        <include refid="selectEmp"></include>
        where empno=#{id}
    </select>

    <!--返回值是一个集合时-->
    <select id="getNewEmpList" resultMap="EmpT1">
        select * from emp 
    </select>

    <!--当是多个参数且参数不为对象时-->
    <select id="getEmpByNoAndName" resultMap="EmpT1">
        select * from emp
        <!--注意where标签,正式开发过程中where条件全使用where标签进行包裹-->
        <where>
            empno=#{empNo} and ename = #{empName}
        </where>
    </select>

    <!--使用对象传入多个参数,同时返回一个集合-->
    <!--当是多个参数且参数不为对象时-->
    <select id="getEmpList" resultMap="EmpT1">
        select * from emp
        <!--注意where标签,正式开发过程中where条件全使用where标签进行包裹-->
        <where>
            <!-- test:判断表达式(OGNL)
                 从参数中取值进行判断
                 遇见特殊符号应该去写转义字符:
                 &&:
            -->
            <if test="empNo!=null">
                empNo=#{empNo} and
            </if>
            ename like concat(concat('%',#{empName}),'%')
        </where>
    </select>

    <!--传入一个集合,实例in查询-->
    <select id="getEmpListByIn" resultMap="EmpT1">
        <include refid="selectEmp"></include>
        <where>
            <!--
                collection:指定要遍历的集合:
                list类型的参数会特殊处理封装在map中,map的key就叫list
                item:将当前遍历出的元素赋值给指定的变量
                separator:每个元素之间的分隔符
                open:遍历出所有结果拼接一个开始的字符
                close:遍历出所有结果拼接一个结束的字符
                index:索引。遍历list的时候是index就是索引,item就是当前值
    #{变量名}就能取出变量的值也就是当前遍历出的元素
        -->
            <foreach collection="ulist" item="emp" separator=","
                     open=" empNo in(" close=")">
                #{emp.empNo}
            </foreach>
        </where>
    </select>

    <!--一个实体类中包含另一个实体类,级联方式-->
    <select id="getEmpPlus" resultMap="EmpPlus">
        select empno empno,ename empName,emp.deptno deptno from emp
        <trim prefix="where" suffixOverrides="and">
            <if test="empNo!=null">
                empNo=#{empNo} and
            </if>
            <if test="empName!=null">
                ename=#{empName} and
            </if>
        </trim>
    </select>
    <select id="getDeptById" resultType="com.critc.teachDemo.model.Dept">
      select deptno,dname from dept where deptNo=#{deptno}
    </select>
    <!--一个实体类中包含另一个实体类,非级联方式-->
    <select id="getEmpPlus2" resultMap="EmpPlus2">
        select empno empno,ename empName,emp.deptno deptno,dept.deptno deptPojo_deptNo,dept.dname deptPojo_dname from
        emp,dept
        <trim prefix="where" suffixOverrides="and">
            emp.deptno=dept.deptno and
            <if test="empNo!=null">
                empNo=#{empNo} and
            </if>
            <if test="empName!=null">
                ename=#{empName} and
            </if>
        </trim>
    </select>

    <!--一个实体类中有一个实体集合-->
    <select id="getDeptPlus" resultMap="DeptPlus">
        SELECT d.deptno deptNo,d.dname dName,
        e.empno empNo,e.ename empName
        FROM dept d
        LEFT JOIN emp e
        ON d.deptno=e.deptno
        WHERE d.deptno=#{deptNo}
    </select>

    <!-- parameterType:参数类型,可以省略,
         keyProperty;指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性
    -->
    <insert id="addEmp" parameterType="com.critc.teachDemo.model.Emp">
        <include refid="addEmp"></include>
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="empNo!=null">
                #{empNo},
            </if>
            <if test="empName!=null">
               #{empName},
            </if>
        </trim>
    </insert>

    <!--批量新增,方式1-->
    <!--Oracle中使用begin end包裹SQL语句完成多条SQL执行-->
    <insert id="addEmps">
        <foreach collection="emps" item="emp" open="begin" close="end;">
            <include refid="addEmp"></include>
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="emp.empNo!=null">
                    #{emp.empNo},
                </if>
                <if test="emp.empName!=null">
                    #{emp.empName},
                </if>
            </trim>
            ;
        </foreach>
    </insert>
    <!--批量新增,方式2-->
    <insert id="addEmps2">
        insert into emp(empno,ename)
        <trim prefix="(" suffix=")">
        <foreach collection="emps" item="emp" separator="union"
                 open="select empNo,ename from("
                 close=")">
            select #{emp.empNo} empNo,#{emp.empName} ename from dual
        </foreach>
        </trim>
    </insert>

    <!--修改一条信息-->
    <update id="updateEmp">
        update emp
        set ename=#{empName}
        where empno=#{empNo}
    </update>

    <!--删除一条信息-->
    <delete id="deleteEmpByNo">
        delete from emp where empno=#{empNo}
    </delete>

    <!--联表查询-->
    <!--起好别名就可以不用resltMap直接用resultType指定实体就可以-->
    <select id="getEmpAndDeptInfo" resultMap="EmpT2">
        select e.empno ,e.ename ,d.dname  from emp e,dept d
        where e.deptno=d.deptno and empno=#{empNo}
    </select>


    <select id="getAllEmps" resultMap="EmpT2">
        select e.empno ,e.ename ,d.dname  from emp e,dept d
        where e.deptno=d.deptno
    </select>
    
    <insert id="addTestDate" parameterType="com.critc.teachDemo.model.TestDate" >
            insert into testdate (onlyYMD,onlyHMS,allType) 
                values (#{onlyYMD,jdbcType=DATE},#{onlyHMS},#{allType})  
    </insert>
    
    <select id="getTestDate" resultType="com.critc.teachDemo.model.TestDate">
        select onlyYMD,onlyHMS,allType from testdate
    </select>
    
</mapper>
原文地址:https://www.cnblogs.com/pzx-java/p/8985870.html