• 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>
  • 相关阅读:
    iOS代码段整理
    Git命令行
    Vue开发系列四- 网络请求库vue-resource的使用
    Vue开发系列三 调试
    Vue开发系列三-打包
    Vue开发系列二 熟悉项目结构
    错误及经验记录
    cocopods sh 项目运行权限问题
    关于添加UITextField添加输入内容判定导致九宫格键盘无法使用问题
    catagory添加属性
  • 原文地址:https://www.cnblogs.com/pzx-java/p/8985870.html
Copyright © 2020-2023  润新知