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 ...
随机推荐
- NFS +inotify+rsync 实现数据的远程挂载与实时增量备份
NFS 网络文件系统 功能: 用户可以像访问自己的本地文件系统一样使用网络中的远端系统上的文件 原理: 用户进程-->RPC服务(portman)-->tcp/ip协议栈-->远端主 ...
- Satellite-Hacking 攻击卫星/卫星安全
虽说卫星安全这种东西也是高富帅才玩得起的领域,但是了解了解总是没坏处.参考了一些资料,如果想详细了解可以戳进去看看.看了这么多资料,总结一下吧. Why? 卫星存在安全问题主要有一下俩原因,首先是成本 ...
- Linux——grep binary file
原创声明:本文系博主原创文章,转载或引用请注明出处. grep命令是linux下常用的文本查找命令.当grep检索的文件是二进制文件时,grep命令会提示: $grep pattern filenam ...
- 阿里云端安装mysql
首先查看系统版本,是64位的centos7 file /sbin/init 安装指南如下 https://www.cnblogs.com/thinkingandworkinghard/p/671125 ...
- MyBatis---join 查询
在实际业务中,经常能碰到多表关联查询 下面的Demo,讲举例join查询在MyBatis中的实现 User 类: package com.zy.domain; import java.io.Seria ...
- zzzphp V1.6.0 按照功能分析漏洞
0 基础支撑功能 0.1 路由功能 0.2 模版解析 * zzzphp V1.6.0 的代码执行漏洞,模版解析功能的问题 程序解析模版时,将模版中的部分内容匹配出来直接传递给了eval,且没有经过过滤 ...
- Nginx概念
这篇文章只是单纯的介绍nginx以及一些相关概念,有的概念在实际应用中不会用到,不理解也没有关系,这不影响我们学习nginx. Nginx是什么 如果你知道http协议和httpd是什么,那你就会容易 ...
- java poi 生成多个sheet
我的需求是:在一个表格中生成多个sheet,每个sheet的名称动态指定,每个sheet内的内容动态指定.生成的文件名动态指定. 工具类: package test; import java.io.O ...
- 【agc002f】Leftmost Ball
题目大意 有n种颜色,每种k个球.将这些球任意排列,将每种颜色中最前面的一个求涂成白色(就是n+1种颜色),求最终的排列的方案的个数. 解题思路 考虑如何计算不会算重, 按颜色顺序,每次往排列插入k个 ...
- 题解 最长上升序列2 — LIS2
最长上升序列2 - LIS2 Description 已知一个 1 ∼ N 的排列的最长上升子序列长度为 K ,求合法的排列个数. Input 输入一行二个整数 N , K ( K ≤ N ≤ 15) ...