<?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>