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 ...
随机推荐
- 9月24日开始发布,主打安全的Librem 5 Linux手机
曾推出搭载PureOS Linux发行版本Librem笔记本系列的硬件厂商Purism,今天正式宣布了Librem 5 Linux手机的最终和官方发售日期.Librem 5于2017年10月正式发布, ...
- stm32WB 笔记
1.HAL Debug functions(调试功能) 可以在不同模式下使能或者失能调试器 This section provides functions allowing to:• Enable/D ...
- vim复制到剪切板
作者:whinc链接:https://www.zhihu.com/question/19863631/answer/89354508来源:知乎 转载文章 Vim 中的复制.删除的内容都会被存放到默认( ...
- python日志分割(转)
按文件大小分割:RotatingFileHandler 按时间分割:TimedRotatingFileHandler import logging from logging.handlers impo ...
- 使用metamask钱包
一.安装火狐浏览器metamask插件 打开火狐浏览器的附件组件,搜索metamask 点击第一个 点击“添加到Firefox” 添加成功后,浏览器右上角有一个狐狸标志 点击这个标志,打开插件 二.创 ...
- java线程基础巩固---同步代码块以及同步方法之间的区别和关系
在上一次中[http://www.cnblogs.com/webor2006/p/8040369.html]采用同步代码块的方式来实现对线程的同步,如下: 对于同步方法我想都知道,就是将同步关键字声明 ...
- pycharm 如何自动添加头注释,比如时间,作者信息等
查找路径:File->settings->Editor->File and Code Templates->Python Script #!/usr/bin/env pytho ...
- 1+X证书试题
2019年下半年Web前端开发中级理论考试 (考试时间9:00-11:30 共150分钟) 1. 本试卷共3道大题,满分100分. 一.单选题(每小题2分,共30小题,共60分) 1.在Bootstr ...
- 部署dashboard
1.获取k8s版本: 2.访问dashboard的github:https://github.com/kubernetes/dashboard/releases,然后找到对应的版本 3.然后将yaml ...
- 简易MySQL存储过程
自从那天灵感突现,搜了下MySQL存储过程的实现,我就再也不会为造测试数据这种事情烦恼了,存储过程用起来简直太方便了. DROP PROCEDURE IF EXISTS insert2pay; DEL ...