首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mybatis的sql映射文件的顶级元素使用实例(超级详细)

Mybatis的sql映射文件的顶级元素使用实例(超级详细)

作者头像
jiankang666
发布于 2022-05-12 12:27:29
发布于 2022-05-12 12:27:29
48600
代码可运行
举报
文章被收录于专栏:java基础笔记java基础笔记
运行总次数:0
代码可运行

Mybatis是是一款优秀的持久层框架(持久化是程序数据在瞬时状态和持久状态间转换的过程。),在dao层大量使用,使sql语句封装在配置文件中,降低程序的耦合度。

一、优势:

1、不用再考虑公共问题,专心在业务实现上结构统一,易于学习、维护。

2、动态sql,小巧灵活,简单易学。

二、下面我们具体介绍元素的使用:

1、mapper:他的属性namespace与接口完全限定名保存一致。下图的UserDao.xml的mapper应为:文件结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<mapper namespace="com.bdqn.jiankang.mapper.UserDao">

2、select:

(1)单一表查询,只需要根据实体类的字段进行即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <select id="query" resultType="User">
    select * from user
  </select>

(2)多表查询,一个实体类里有其他实体类作为属性,这是我们无法通过一个实体类输出所有的字段,必须进行手动映射,使用ResultMap。ResultMap进行手动映射也解决了字段信息与对象属性不一致的情况,在复杂联合查询中自由控制映射结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <resultMap type="RegRum" id="reg">
        <id property="patientid" column="patientid" />
        <result property="patientname" column="patientname"></result>
        <result property="sex" column="sex" />
        <result property="cardtype" column="cardtype" />
        <result property="cardid" column="cardid" />
        <result property="socalnum" column="socalnum" />
        <result property="phone" column="phone" />
        <result property="age" column="age" />
        <result property="position" column="position" />
        <result property="status" column="status" />
        <result property="remark" column="remark" />
        <result property="date" column="date" />
        <association javaType="Doctor" property="doctor" resultMap="doctor">
        </association>
  </resultMap>

assocation是连接实体类javabean属性的,javaType指定类型,property是RugRum的实体属性,resultMap是外部引用的resultMap。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <resultMap id="doctor" type="Doctor">
        <id property="doctorid" column="doctorid"></id>
        <result property="dname" column="dname"></result>
        <result property="subroomname" column="subroomname"></result>
    </resultMap>

这是为了达到代码重用,我们也可以将该外部的代码之间写入association中。

(3)多表复杂数据联合查询如果有集合类型的数据,我们就需要用到collection了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <resultMap type="User" id="querybyname1">
        <id property="uid" column="uid" />
        <result property="uname" column="uname"></result>
        <result property="upwd" column="upwd" />
        <collection property="roles" ofType="Role">
            <id property="rid" column="rid"></id>
            <result column="rname" property="rname"></result>
            <collection property="permissions" ofType="Permission">
                <id property="pid" column="pid"></id>
                <result column="pname" property="pname"></result>
            </collection>
        </collection>
    </resultMap>

oftype的值是该属性的类型,id是数据库表中的唯一字段,将唯一字段值用id表示,而不是result,可以提高查询效率。

(4)有时我们需要根据条件进行查询,多条件组合查询,这时有两种方式:

where-if组合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <select id="querySelect" resultMap="reg">
        select * from doctor as d left join regnum as r on r.doctorid
        = d.doctorid left join subjectroom as s on s.subroomid=d.subroomid
        <where>
            <if test="patientid!=null and patientid!=''">
                and patientid=#{patientid}
            </if>
            <if test="dname != null and dname!=''">
                and dname like '%${dname}%'
            </if>
            <if test="subjectroom != null and subjectroom!=''">
                and s.subroomname like '%${subjectroom}%'
            </if>
            <if test="starttime != null and starttime!=''">
                <!-- and date &gt; #{starttime} -->
                and date <![CDATA[ <=]]> #{starttime}
            </if>
            <if test="endtime != null and endtime!=''">
                <!-- and date &lt; #{endtime} -->
                and date >= #{endtime}
            </if>
        </where>
 
    </select>

trim-if组合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <select id="querySelect2" resultMap="reg">
        select * from doctor as d left join regnum as r on r.doctorid
        = d.doctorid left join subjectroom as s on s.subroomid=d.subroomid
        <trim prefix="where" prefixOverrides="and|or">
            <if test="patientid!=null and patientid!=''">
                and patientid=#{patientid},
            </if>
            <if test="dname != null and dname!=''">
                and dname like '%${dname}%',
            </if>
            <if test="subjectroom != null and subjectroom!=''">
                and s.subroomname like '%${subjectroom}%',
            </if>
            <if test="starttime != null and starttime!=''">
                <!-- and date &gt; #{starttime} -->
                and date <![CDATA[ <=]]> #{starttime},
            </if>
            <if test="endtime != null and endtime!=''">
                <!-- and date &lt; #{endtime} -->
                and date >= #{endtime},
            </if>
        </trim>

在trim中,要注意prifix为where,同时注意第一个if条件为and或者or的时候,要用prefixOverrides去除。

3、insert实现:注意每个字段之间一一对应就行了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<insert id="addRum" parameterType="RegRum"> 
     insert into regnum(patientname,cardtype,cardid,socalnum,phone,sex,
     age,position,firstdiagnose,doctorid,status,remark,date) 
     VALUES(#{regnum.patientname},#{regnum.cardtype},#{regnum.cardid}
</insert>

4、update:可以使用set-if或者trim-if

set-if实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<update id="updateregnum">
        update regnum
        <set >
            <if test="phone!=null and phone!=''">
                phone=#{phone},
            </if>
            <if test="position!=null and position!=''">
                position=#{position},
            </if>
            <if test="firstdiagnose!=null and firstdiagnose!=''">
                firstdiagnose=#{firstdiagnose},
            </if>
            <if test="doctorid!=0">
                doctorid=#{doctorid},
            </if>
            <if test="remark!=null and remark!=''">
                remark=#{remark},
            </if>
            <if test="date!=null and date!=''">
                date=#{date},
            </if>
            <if test="age!=0">
                age=#{age},
            </if>
            <if test="status!=null and status !=''">
                status=#{status},
            </if>
            <if test="sex==0 or sex==1">
                sex=#{sex},
            </if>
        </set>
        where patientid=#{patientid}
    </update>

if的判断test必须有添加条件,否则会报错。

trim-if组合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <update id="updateregnum">
        update regnum
        <trim prefix="set" suffixOverrides="," suffix=" where patientid=#{patientid}">
            <if test="phone!=null and phone!=''">
                phone=#{phone},
            </if>
            <if test="position!=null and position!=''">
                position=#{position},
            </if>
            <if test="firstdiagnose!=null and firstdiagnose!=''">
                firstdiagnose=#{firstdiagnose},
            </if>
            <if test="doctorid!=0">
                doctorid=#{doctorid},
            </if>
            <if test="remark!=null and remark!=''">
                remark=#{remark},
            </if>
            <if test="date!=null and date!=''">
                date=#{date},
            </if>
            <if test="age!=0">
                age=#{age},
            </if>
            <if test="status!=null and status !=''">
                status=#{status},
            </if>
            <if test="sex!=0">
                sex=#{sex},
            </if>
        </trim>
    </update>

5、delete

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   <delete id="delversion" parameterType="Integer">
       delete from app_version where appid=#{appid};
   </delete>

6、foreach的实例:迭代一个集合,通常用于in条件。

(1)只传入一个参数,集合类型的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<select id="findByids2" resultType="User">
        select * from user where userid in
        <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
</select>

collection表示传入的集合名字,item的值表示集合中每一个值的别名,open以什么开头,close以什么结尾,separator表示值之间以什么分隔。

(2)传入多个参数,我们可以用map集合传入。当然也可以用@param注解。

使用map时:dao层的map值一定要是Object,否则集合类型传不进去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public Collection<User> findbymap(Map<String,Object> map);

dao.xml的#{phone}以及collection的值是map所对应的键。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <select id="findbymap" resultType="User">
        select * from user where userid in
        <foreach collection="idslist" index="index" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
 
        and phone=#{phone};
  </select>

使用@param注解的方法:dao层这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Collection<User> findByids3(@Param("ids")int [] ids,@Param("phone") String phone);

dao.xml的#{phone}以及collection的值是注解名。

以上是对Mybatis的总结

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java基础笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
深入理解Java虚拟机(高效并发)
高效并发是 JVM 系列的最后一篇,本篇主要介绍虚拟机如何实现多线程、多线程间如何共享和竞争数据以及共享和竞争数据带来的问题及解决方案。
张磊BARON
2019/07/31
4450
深入理解Java虚拟机(高效并发)
深入理解JVM(③)再谈线程安全
我们在编写程序的时候,一般是有个顺序的,就是先实现再优化,并不是所有的牛P程序都是一次就写出来的,肯定都是不断的优化完善来持续实现的。因此我们在考虑实现高并发程序的时候,要先保证并发的正确性,然后在此基础上来实现高效。所以线程安全是高并发程序首先需要保证的。
纪莫
2020/07/16
4440
深入理解JVM(③)再谈线程安全
线程安全
当一个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。 线程安全的代码都必须具备一个特征:代码本身封装了所有必要的正确性保障手段(如互斥同步等),令调用者无需关心多线程的问题,更无须自己采取任何措施来保证多线程的正确调用。
栋先生
2018/09/29
1.1K0
线程安全
JVM学习笔记——线程安全与锁优化
定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。
用户1665735
2019/02/19
4210
线程安全与锁优化
当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。
ruochen
2021/11/21
3940
Java并发知识点快速复习手册(下)
如果多个线程对同一个共享数据进行访问而不采取同步操作的话,那么操作的结果是不一致的。
蛮三刀酱
2019/03/26
5850
Java并发知识点快速复习手册(下)
Java 并发核心机制
Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。从功能上,大致可以分为:
静默虚空
2020/01/02
5100
线程安全与锁优化(《深入理解Java虚拟机》完结)
“当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。” 这个定义就很严谨而且有可操作性,它要求线程安全的代码都必须具备一个共同特征:代码本身封装了所有必要的正确性保障手段(如互斥同步等),令调用者无须关心多线程下的调用问题,更无须自己实现任何措施来保证多线程环境下的正确调用。
燃192
2023/02/28
3820
线程安全与锁优化(《深入理解Java虚拟机》完结)
多线程知识回顾
以前看过不少JDK源码,最近回顾了一下笔记,所以在这里对几个很常见到的线程类做个记录。
Java编程指南
2019/08/02
4890
多线程知识回顾
Java并发知识点快速复习手册(下)
如果多个线程对同一个共享数据进行访问而不采取同步操作的话,那么操作的结果是不一致的。
Rude3Knife的公众号
2019/08/07
4910
Java并发知识点快速复习手册(下)
Java多线程与并发-原理
MonitorJava娘胎创建的锁 管程 或 监视器锁(描述为 同步工具,或同步机制,通常被描述为同步对象)
瑞新
2020/07/07
7580
Java中的锁 Lock和synchronized
锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。
Java技术江湖
2019/09/25
5440
Java内存模型和线程安全
对于多核处理器而言,每个核都会有自己单独的高速缓存,又因为这多个处理器共享同一块主内存,为了在并行运行的情况下,包装各个缓存中缓存的结果的一致性,需要引用缓存一致性协议。
大忽悠爱学习
2023/02/10
5540
Java内存模型和线程安全
Java并发问题总结
所有变量都存储在主内存中。这里的主内存只是虚拟机内存的一部分,可以和物理主内存类比。每条线程都有自己的工作内存。工作内存可以和处理器高速缓存类比。工作内存中保存了主内存中变量的拷贝,线程所有的操作只能在工作内存中进行,不同线程不能访问对方的工作内存,只能通过更新到主内存中的方式来传递线程间的变量值。
IT小马哥
2020/03/18
4160
Java深入
java.util.concurrent.BlockingQueue 接口有以下阻塞队列的实现:
大学里的混子
2019/03/13
4470
【Java面试——并发基础、并发关键字】
CPU、内存、I/O 设备的速度是有极大差异的,为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为:
奥耶可乐冰
2024/05/31
1761
详述 synchronized 和 volatile 的实现原理以及两者的区别
因此,为了解决这个问题,我们需要保证当存在多个线程操作共享数据时,同一时刻有且只有一个线程能够操作共享数据,其他线程必须等到该线程处理完数据之后才能进行处理。在 Java 中,关键字synchronized就可以保证在同一个时刻,只有一个线程能够执行某个方法或者某个代码块,主要是对方法或者代码块中存在共享数据的操作。除此之外,synchronized另外一个重要的作用,是其可以保证一个线程的变化(主要是共享数据的变化)能够被其他线程所看到,即保证可见性。
CG国斌
2021/12/07
3800
详解java多线程锁
多线程程序是并发编程的核心,而Java多线程锁则是保证线程安全的重要手段。但是,不同类型的锁适用于不同的场景,而正确地选择锁对于程序的性能和正确性至关重要。在本文中,我们将深入探讨Java多线程锁的工作原理和最佳实践。
仙士可
2023/03/18
8910
详解java多线程锁
BATJ面试必会之并发篇
调用 Thread.sleep() 方法使线程进入限期等待状态时,常常用“使一个线程睡眠”进行描述。
乔戈里
2019/03/09
6530
深入理解java虚拟机
一个变量如何从主存拷贝到工作内存,如何从工作内存同步回主存,java内存模型定义了8中操作来完成,每种操作都是原子性的:
kinnylee
2020/10/15
6580
深入理解java虚拟机
相关推荐
深入理解Java虚拟机(高效并发)
更多 >
目录
  • 一、优势:
  • 二、下面我们具体介绍元素的使用:
    • 1、mapper:他的属性namespace与接口完全限定名保存一致。下图的UserDao.xml的mapper应为:文件结构如下:
    • 2、select:
    • 3、insert实现:注意每个字段之间一一对应就行了。
    • 4、update:可以使用set-if或者trim-if
    • 5、delete
    • 6、foreach的实例:迭代一个集合,通常用于in条件。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档