MyBatis详解(3)-- 动态代理及映射器

news2024/11/19 19:22:56

MyBatis详解(3)

      • mybatis 动态代理
        • 动态代理的规范
          • selectOne和selectList
          • namespace
      • mybatis映射器
          • 映射器的引入:
        • 映射器的组成
        • select 元素结构:
          • 单个参数传递
          • 多个参数传递
        • insert 元素结构
        • 主键回填:
          • 自定义主键生成规则
        • u p d a t e 元 素 和 d e l e t e 元 素
        • r e s u l t M a p 元 素 (结果集映射)
          • 单表映射:可以只映射,javabean映射不到的
          • 多表联查
        • 级联的缺陷
        • 使用建议

mybatis 动态代理

在接口中有方法的返回值定义,参数的定义,方法名,在sqlMapper.xml 中也对应这接口给予了赋值,这时候dao的实现类就显得多余,这是Mybatis可以帮助我们自动产生实现类,并可以调取方法得到结果,这就是Mybatis的mapper动态代理

不用创建实现类,由mybatis自动实现

动态代理的规范

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper接口开发需要遵循以下规范:

  1. Mapper.xml文件中的namespace与mapper接口的类路径相同。

  2. Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

  3. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

  4. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

使用SqlSession的方法getMapper() 让Mybatis自动生成对应接口的实现对象。

SqlSession sqlSession = DaoUtil.getSqlSession();
DeviceWorkMapper mapper = sqlSession.getMapper(DeviceWorkMapper.class);

List<DeviceWork> dList = mapper.findAllList();
dList.forEach(System.out::println);
selectOne和selectList

动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。

namespace

mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

mybatis映射器

将java的重载功能砍掉了,因为mybatis的id是唯一标识 的,不允许出现重复

半自动化的体现 :配置 SQL 语句,体现了半自动化和灵活性。

ORM的体现:对象关系映射的实现,数据库表和 POJO 类的映射关系。

映射器与接口:映射器配置文件和接口绑定:配置文件名对应接口名,id 属性值对应方法名。

映射器的引入:

1.文件路径 – 用相对路径引入映射器:

<mapper resource=”com/codeup/dao/Mapper.xml”/>

2.XML – 用文件定位符引入映射器:

<mapper url=”file:///var/mappers/Mapper.xml”/>

3.包名 – 用包名引入映射器:

<package name="com.codeup.dao.Mapper"/>

4.类注册 – 用类名引入映射器:

<mapper class="com.codeup.mapper.NewsMapper"/>
映射器的组成

在这里插入图片描述

select 元素结构:

id :唯一标识,接口中的方法名;

parameterType :入参的类型;

resultType :结果集类型;

resultMap :结果集映射关系;

单个参数传递
<select id="findStuBySid" resultType="student" parameterType="int">
 select * from student where sid = #{value}
 </select>
多个参数传递

方式1:javaBean

方式2:map集合

方式3:param1,param2,param3…

<select id="findStuBysexPage" resultType="student">
 select * from student where ssex =#{param1} limit #{param2},#{param3}

 </select>

方式4:arg0,arg1,arg2…

  <select id="findStuBysexPages" resultType="student">
 select * from student where ssex =#{arg0} limit #{arg1},#{arg2}

 </select>

xml文件使用的转义字符:最重要的 < 等于 &lt;**
在这里插入图片描述

insert 元素结构

id :唯一标识,接口中的方法名;

parameterType :参数的类型;

keyProperty :表示以哪个列作为属性的主键,不能和 keyColumn 同时使用;

keyColumn :指明哪一列是主键,不能和 keyProperty 同时使用;

useGeneratedKeys :获取有数据库内部生成的主键(默认false);

主键回填:

当主键在数据库中为自增字段时,新增成功后,回填主键。

<insert id="addStudent" parameterType="student" keyProperty="sid" useGeneratedKeys="true">
 insert into student(sname,birthday,ssex,classid)
 values(#{sname},#{birthday},#{ssex},#{classid})
 </insert>
自定义主键生成规则

< selectKey >用来预先设定主键值。自定义主键生成规则时,可以使用该标签;

order 属性:

取值 BEFORE,AFTER ;
在这里插入图片描述

u p d a t e 元 素 和 d e l e t e 元 素

id :唯一标识,接口中的方法名;

parameterType :参数的类型;

<update id="updateStudent" parameterType="student">
 update student set sname =#{sname},birthday=#{birthday},ssex=#{ssex},classid=#{classid}
 where sid = #{sid}
 </update>

 <delete id="deleteStudent" parameterType="Student">
 delete from student where sid=#{value}
 </delete>
r e s u l t M a p 元 素 (结果集映射)

表名和字段名不一致使用

<resultMap>
    <constructor> 用于配置构造方法的元素。
        <idArg />
        <arg />
    </constructor>
    <id /> 标识主键列,允许多个主键。
    <result /> POJO 到 SQL 列名的映射关系。
    <association />
    <collection />
    <discriminator>
        <case />
    </discriminator>
</resultMap>

result标签的属性:

property :映射到列结果的字段或者属性,通常是指 POJO 的属性;

column :对应的数据库字段;

javaType :Java 类型,可以是基本数据类型,也可以是类完全限定名;

jdbcType :JDBC 的类型,基本支持所有常用的数据库类型;

单表映射:可以只映射,javabean映射不到的
<resultMap type="Student" id="Stu_Class_map">
    <result column="sid" property="sid"/>
    <result column="sname" property="sname"/>
    <result column="birthday" property="birthday"/>
    <result column="ssex" property="ssex"/>
    <result column="classid" property="classid"/>
</resultMap>
多表联查

级联(cascade),是指多个对象之间的映射关系,建立数据之间的级联关系提高管理效率

  1. 一对一:一个对象对应唯一的对象,
  2. 一对多:一个对象对应多个对象,
  3. 多对一:多个对象对应一个对象,
  4. 多对多:多个对象对应多个对象

一对一:association

<resultMap type="Student" id="Stu_Class_map">
    <result column="sid" property="sid"/>
    <result column="sname" property="sname"/>
    <result column="birthday" property="birthday"/>
    <result column="ssex" property="ssex"/>
    <result column="classid" property="classid"/>

    <!-- 一对一 -->
    <association property="bj">	
        <result column="classid" property="classid"/>
        <result column="classname" property="classname"/>	
    </association>
</resultMap>

一对多:collection ofType(collection对象的类型)

<resultMap type="ClassStu" id="class_stu_map">	
        <result column="classid" property="classid"/>
        <result column="classname" property="classname"/>
        	<!-- 一对多 -->
            <collection property="cList" ofType="Student">
                <result column="sid" property="sid"/>
                <result column="sname" property="sname"/>
                <result column="birthday" property="birthday"/>
                <result column="ssex" property="ssex"/>
                <result column="classid" property="classid"/>	
            </collection>
    </resultMap>
级联的缺陷

1.性能缺陷:级联操作会降低性能,增加程序的执行时间;

2.复杂度缺陷:关联较多造成复杂度的增加,不利于他人的理解和维护;

使用建议

1.根据实际情况增加级联关系
2.多层关联式,超过三层尽量少用级联

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1417249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS 双色拼接按钮效果

<template><view class="sss"><button> <!-- 按钮 --><view class="span"> 按钮 </view> <!-- 按钮文本 --></button></view></template><script></script><style>body {b…

JUC-ReentrantLock,ReentrantReadWriteLock,StampedLock

1. 概述 前面介绍过了synchronized关键字作用的锁升级过程 无锁->偏向锁->轻量锁->重锁 下面再介绍实现Lock接口的锁的升级过程 无锁->独占锁&#xff08;ReentrantLock&#xff0c;Synchronized&#xff09;->读写锁(ReentranReadWriteLock)->邮戳锁(Stamp…

app逆向-apktool逆向工具安装使用

文章目录 一、前言二、安装三、执行 一、前言 apktool是一个能够解析和分析安卓应用文件&#xff08;APK&#xff09;的工具&#xff0c;帮助了解应用程序的内部结构和功能。 二、安装 window版本 下载地址&#xff1a;版本2.9.3&#xff0c;并将下载的 jar 重命名为apktoo…

【缓存周总结】Redis缓存的使用以及数据安全的处理

前言 Redis非关系型数据库已经是很常见的工具了&#xff0c;项目中用到的也很多&#xff0c;这篇文章系统的分析下使用过程中可能会遇到的问题 一、缓存 缓存是数据交换的缓冲区&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 我们项目中引用的Redis目的就是…

SPI:JDK 与 SpringBoot

浅谈Java SPI原理与其在JDBC、Flink中的应用 API&#xff1a;由被调方提供的实现了某个完整功能的接口&#xff0c;主调方直接调用该接口来享用该功能&#xff0c;而无需关注该接口的具体实现。比如使用 JDK 的 InputStream#read 从文件系统中读取数据。 SPI&#xff1a;被调方…

DOM 型 XSS 攻击演示(附链接)

一、介绍 DOM&#xff08;Document Object Model&#xff09;型 XSS&#xff08;Cross-Site Scripting&#xff09;攻击是一种 Web 应用程序中的安全漏洞&#xff0c;其特点是攻击者成功地注入了恶意脚本&#xff0c;这些脚本在用户的浏览器中执行&#xff0c;从而导致恶意行为…

DETR解读,将Transformer带入CV

论文出处 [2005.12872] End-to-End Object Detection with Transformers (arxiv.org) 一个前置知识 匈牙利算法&#xff1a;来源于二部图匹配&#xff0c;计算最小或最大匹配 算法操作&#xff1a;在n*n的矩阵中 减去行列最小值&#xff0c;更新矩阵&#xff08;此时行或者…

C# RichTextBox常用属性、方法学习1

1 字体 Font font1 new Font("宋体", 18); richTextBox1.Font font1; Font font2 new Font("宋体", 10, FontStyle.Underline); richTextBox1.SelectionFont font2; 定义字体&#xff0c;可以带2个参数&#…

代码随想录刷题笔记-Day13

1. 二叉树的层序遍历 102. 二叉树的层序遍历https://leetcode.cn/problems/binary-tree-level-order-traversal/层次遍历依靠队列的先进先出特点实现。 解题思路 层序遍历的本质就是对每一个pop出来的处理节点&#xff0c;处理后把他的左右节点放进去。 对于每一层来说&…

菱形打印和十进制ip转二进制

1.菱形打印 用for循环 #!/bin/bashread -p "请输入菱形的大小&#xff1a;" num #打印向上的等腰三角形 for ((i1;i<num;i)) dofor ((jnum-1;j>i;j--))doecho -n " " #打印的是前面的空格donefor ((k1;k<2*i-1;k))doecho -n "*" #打印…

【stm32】hal库学习笔记-FSMC连接TFT_LCD

【stm32】hal库学习笔记-FSMC连接TFT LCD 触摸屏结构与原理 LCD模块接口原理图 LCD 接口连接在 FSMC 总线上面&#xff0c;图中的 T_MISO/T_MOSI/T_PEN/T_SCK/T_CS 连接在 MCU 的 PB2/PF11/PB1/PB0/PC13 上&#xff0c;这些信号用来实现对液晶触摸屏的控制&#xff08;支持电阻…

QT tcp与udp网络通信以及定时器的使用 (7)

QT tcp与udp网络通信以及定时器的使用 文章目录 QT tcp与udp网络通信以及定时器的使用1、QT网络与通信简单介绍2、QT TCP通信1、 服务器的流程2、 客户端的流程3、服务器的编写4、客户端的编写 3、QT UDP通信1、客户端流程2、客户端编写3、UDP广播4、UDP组播 4、定时器的用法1、…

leetcode刷题日志-146LRU缓存

思路&#xff1a;使用hashmap储存key&#xff0c;vaule&#xff0c;使用双向链表以快速查到尾结点&#xff08;待逐出的节点&#xff09;&#xff0c;链表的题一定要在纸上画一下&#xff0c;不然连着连着就不知道连在哪里去了 class LRUCache {public class ListNode {int ke…

【js基础】日期对象的使用,查找、增加、克隆、删除DOM节点,M端事件

文章目录 前言一、日期对象日期对象的作用1.1 实例化1.2 日期对象的方法1.3 时间的格式化1.4 时间戳的使用时间戳是什么js的时间戳 二、DOM的增删改查什么叫做DOM节点2.1 DOM的查找2.2 增加节点2.3 克隆节点和删除节点 三、M端事件3.1 M端是什么&#xff1f; 总结 前言 在 Jav…

你的MiniFilter安全吗?

简介 筛选器管理器 (FltMgr.sys)是Windows系统提供的内核模式驱动程序, 用于实现和公开文件系统筛选器驱动程序中通常所需的功能; 第三方文件系统筛选器开发人员可以使用FltMgr的功能可以更加简单的编写文件过滤驱动, 这种驱动我们通常称为MiniFilter, 下面是MiniFilter的基本…

STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标

目录 1、准备材料 2、实验目标 3、模拟鼠标实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.0、工程基本配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.0、配置Project Manager页面 3.2.1、设初始化调用流程 3.2.2、外设中…

优选6款前端动画特效分享(附在线演示)

优选6款前端动画特效 其中有CSS动画、canvas动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 翻页时钟特效 基于react实现的一款翻页时钟特效 切换时间特效跟比赛切换分数牌相似 以下效果图只能体现…

Gitlab7.14 中文版安装教程

Gitlab7.14 中文版安装教程 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-01-28csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注 …

T05垃圾收集算法与垃圾收集器ParNew CMS

垃圾收集算法与垃圾收集器ParNew & CMS 垃圾收集算法 #### f 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法。根据对象存活周期不同将内存分为几块&#xff0c;一般将java堆分为新生代和老年代&#xff0c;然后根据各个年代的特点选择不同的垃圾收集算法。 在新…

MySQL-窗口函数 简单易懂

窗口函数 考查知识点&#xff1a; • 如何用窗口函数解决排名问题、Top N问题、前百分之N问题、累计问题、每组内比较问题、连续问题。 什么是窗口函数 窗口函数也叫作OLAP&#xff08;Online Analytical Processing&#xff0c;联机分析处理&#xff09;函数&#xff0c;可…