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>
MyBatis Mapper Demo的更多相关文章
- MyBatis使用DEMO及cache的使用心得
下面是一个简单的MyBatis使用DEMO. 整体结构 整体代码大致如下: POM依赖 需要引用两个jar包,一个是mybatis,另一个是mysql-connector-java,如果是maven工 ...
- 初识 tk.mybatis.mapper
在博客园发表Mybatis Dynamic Query后,一位园友问我知不知道通用mapper,仔细去找了一下,还真的有啊,比较好的就是abel533写的tk.mybatis.mapper. 本次例子 ...
- intellij idea 插件开发--快速定位到mybatis mapper文件中的sql
intellij idea 提供了openApi,通过openApi我们可以自己开发插件,提高工作效率.这边直接贴个链接,可以搭个入门的demo:http://www.jianshu.com/p/24 ...
- MyBatis的demo
把以前写的关于mybatis的demo放在这边,以便查看. 目录结构: package com.test.mybatis.util; import java.io.IOException; impor ...
- 初识 tk.mybatis.mapper 通用mapper
在博客园发表Mybatis Dynamic Query后,一位园友问我知不知道通用mapper,仔细去找了一下,还真的有啊,比较好的就是abel533写的tk.mybatis.mapper. 本次例子 ...
- MyBatis Mapper.xml文件中 $和#的区别
MyBatis Mapper.xml文件中 $和#的区别 网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramN ...
- MyBatis mapper文件中的变量引用方式#{}与${}的差别
MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...
- mybatis mapper.xml 配置文件问题(有的错误xml是不报的) 导致服务无法启动 。
转载自 开源编程 一舟mybatsi xml编译报错,tomcat启动一直循环,导致内存溢出,启动失败 mapper.xml怎么知道有没有编译错误,哪个位置有错误 这应该是mybatis的一个bug, ...
- mybatis mapper association collection
1.Question Description: sometimes, POJO bean contains another bean or collection as property, it's s ...
随机推荐
- Java SE 核心 II【Collection 集合框架】
Collection集合框架 在实际开发中,需要将使用的对象存储于特定数据结构的容器中.而 JDK 提供了这样的容器——集合框架,集合框架中包含了一系列不同数据结构(线性表.查找表)的实现类.集合的引 ...
- Linux----Ubuntu虚拟机(VMWare)学习
1.在安装虚拟机系统完成后,如果忘记密码则 https://jingyan.baidu.com/article/c843ea0b9e851077931e4aea.html 2.如何拖动桌面软件移动 长 ...
- CentOS7 xrdp 安装和设置
1) 安装 $ sudo yum install xrdp $ sudo yum install tigervnc $ sudo yum install tigervnc-server 2) 设置密码 ...
- Tourist's Notes CodeForces - 538C (贪心)
A tourist hiked along the mountain range. The hike lasted for n days, during each day the tourist no ...
- 开源框架相关面试问题-butterknife注解框架面试问题讲解
butterknife使用简介: 它的出现主要是为了解决咱们在android开发中会写大量的findViewById().setOnClickListener()这样的索然无味的代码,其实它就是一个依 ...
- 在xshell中安装python3.6
首先下载python安装包 wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz 然后解压 tar Jxvf Python- ...
- Maven Pom.xml文件简单介绍
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- TXNLP 01-09
一般涉及生成文本都是比较难的.
- 【学习备份】ajax添加小例子
实现目的:保存模板编号.模板名称到数据库 1.js引用 <script src="../../../../../../../js/jquery-1.10.2.min.js"& ...
- JavaScript 中 console 的用法 -------------------引用
1.在调试 JS 代码时,很多人倾向于使用 alert() 或者 console.log() 方法来输出信息,正如某些 Java 程序员喜欢在调试代码时使用System.out.println() 输 ...