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 ...
随机推荐
- 建立一个可以不停地接收客户端新的连接,但不能处理复杂的业务的C/S网络程序
在Windows平台上主要有两个版本的Socket Api函数:WinSock 1.1和WinSock 2.2 , 2.2版本默认兼容1.1版本,1.1 winsock.h wsock32.lib w ...
- Linux之yum安装LAMP环境与管理
[1] 什么是LAMP 目前世界最流行的企业建站方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP ...
- 安装及创建python虚拟环境
有点气,是真的有点气,以为安装错误了,没想到是命令问题 参考链接: https://cloud.tencent.com/developer/article/1176291 https://www.cn ...
- windows设置自动清理log
@echo off set srcDir="D:\xx\xx\xx" set daysAgo=5 forfiles /p %srcDir% /s /m *.* /d -%daysA ...
- python 2 和python 3 中的编码对比
在 Python 中,不论是 Python2 还是 Python3 中,总体上说,字符都只有两大类: 通用的 Unicode 字符: (unicode 被编码后的)某种编码类型的字符,比如 UTF-8 ...
- cmd_memo
1. bind host or ip:port #指定域名 curl -H 'Host:www.tsuiz.com' http://10.14.54.131:8080/check.do #指定ip和端 ...
- 爱搞事情的webpack
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency g ...
- Suse环境下编译linux-2.6.24内核
Suse环境下编译linux-2.6.24内核 1.下载linux-2.6.24内核源码: https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/ ...
- 《剑指offer》算法题第九天
今日题目: 整数中1出现的次数 把数组排成最小的数 丑数 第一个只出现一次的字符位置 今天的题目相对比较难,特别是第1题和第3题很考验数学功底,下面我们一题一题来看看. 1.整数中1出现的次数 题目描 ...
- JVM(二),Java怎样实现一次编译到处运行(平台无关性)
二.Java怎样实现一次编译到处运行(平台无关性) 1.java平台无关性原理 Java源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要进行重新编译,Jav ...