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

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.多层关联式,超过三层尽量少用级联

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中查看端口被哪个进程占用、进程调用的配置文件、目录等

1.查看被占用的端口的进程&#xff0c;netstat/ss -antulp | grep :端口号 2.通过上面的命令就可以列出&#xff0c;这个端口被哪些应用程序所占用&#xff0c;然后找到对应的进程PID https://img-blog.csdnimg.cn/c375eb2bed754426b373907acaa7346e.png 3.根据PID查询进程。…

Kafka-服务端-GroupCoordinator

在每一个Broker上都会实例化一个GroupCoordinator对象&#xff0c;Kafka按照Consumer Group的名称将其分配给对应的GroupCoordinator进行管理&#xff1b; 每个GroupCoordinator只负责管理Consumer Group的一个子集&#xff0c;而非集群中全部的Consumer Group。 请注意与Kaf…

数据结构篇-03:堆实现优先级队列

本文着重在于讲解用 “堆实现优先级队列” 以及优先级队列的应用&#xff0c;在本文所举的例子中&#xff0c;可能使用优先级队列来解并不是最优解法&#xff0c;但是正如我所说的&#xff1a;本文着重在于讲解“堆实现优先级队列” 堆实现优先级队列 堆的主要应用有两个&…

OpenCV 2 - 矩阵的掩膜操作

1知识点 1-1 CV_Assert(myImage.depth() == CV_8U); 确保输入图像是无符号字符类型,若该函数括号内的表达式为false,则会抛出一个错误。 1-2 Mat.ptr(int i = 0); 获取像素矩阵的指针,索引 i 表示第几行,从0开始计行数。 1-3 const uchar* current = mylmage.ptr(row); 获得…

React 组件生命周期-概述、生命周期钩子函数 - 挂载时、生命周期钩子函数 - 更新时、生命周期钩子函数 - 卸载时

React 组件生命周期-概述 学习目标&#xff1a; 能够说出组件的生命周期一共几个阶段 组件的生命周期是指组件从被创建到挂在到页面中运行&#xff0c;在到组件不用时卸载组件 注意&#xff1a;只有类组件才有生命周期&#xff0c;函数组件没有生命周期(类组件需要实例化&…

uni-app 开发着突然忘记项目所在位置 教你快速通过HBuilder X定位到项目的位置

我经常会开发着 开发着 就忘记项目在哪了 我们可以用编辑器打开项目 然后右键项目目录 然后选择这个 使用命令行窗口打开所在目录(U) 这样 他就会快速用 本地文件夹 帮你打开这个目录了 还可以 右键项目 选择 使用命令行窗口打开所在目录(U) 下面就会帮你打开这个目录的终端…

腾讯云一键搭建幻兽帕鲁服务器教程

幻兽帕鲁&#xff08;Palworld&#xff09;是一款多人在线游戏&#xff0c;为了获得更好的游戏体验&#xff0c;许多玩家选择自行搭建游戏联机服务器&#xff0c;但是如何搭建游戏联机服务器成为一个难题&#xff0c;腾讯云提供了游戏联机服务器一键部署方案&#xff0c;让大家…

java8 映射方法(map,flatMap)

5.2 映射&#xff08;map&#xff0c;flatMap&#xff09; 一个非常常见的数据处理套路就是 从某些对象中选择信息。比如在SQL里&#xff0c;你可以从表中选择一列。Stream API也通过map和flatMap方法提供了类似的工具。 5.2.1 对流中每一个元素应用函数&#xff08;map&am…

DMA 和 零拷贝技术 到 网络大文件传输优化

文章目录 DMA 控制器的发展无 DMA 控制器 IO 过程DMA 控制器 传统文件传输性能有多糟糕&#xff1f;如何优化文件传输性能零拷贝技术mmap writesendfileSG-DMA&#xff08;The Scatter-Gather Direct Memory Access&#xff09; 零拷贝技术的应用 大文件传输应该用什么方式Pag…

第二百九十二回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何混合选择多个图片和视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1…

OpenGL/C++_学习笔记(四)空间概念与摄像头

汇总页 上一篇: OpenGL/C_学习笔记&#xff08;三&#xff09; 绘制第一个图形 OpenGL/C_学习笔记&#xff08;四&#xff09;空间概念与摄像头 空间概念与摄像头前置科技树: 线性代数空间概念流程简述各空间相关概念详述 空间概念与摄像头 前置科技树: 线性代数 矩阵/向量定…

毕业设计过程学习

传统的目标检测算法主要通过人工设计与纹理、颜色和形状相关的特征来进行目标区域特征的提取。随着深度学习和人工智能技术的飞速发展&#xff0c;目标检测技术也取得了很大的成就。早期基于深度学习的目标检测算法的研究方向仍然是将目标定位任务和图像分类任务分离开来的&…

1 月 27日算法练习-贪心

文章目录 扫地机器人分糖果最小战斗力差距谈判纪念品分组 扫地机器人 思路&#xff1a; 最优机器人清理方法&#xff1a;机器人清理方法先扫左边&#xff0c;有时间再扫右边。最短时间&#xff1a;通过枚举&#xff0c;从 1 开始&#xff0c;清理面积会越大直到全部面积的清理…

深入理解C语言(3):自定义类型详解

文章主题&#xff1a;结构体类型详解&#x1f30f;所属专栏&#xff1a;深入理解C语言&#x1f4d4;作者简介&#xff1a;更新有关深入理解C语言知识的博主一枚&#xff0c;记录分享自己对C语言的深入解读。&#x1f606;个人主页&#xff1a;[₽]的个人主页&#x1f3c4;&…

事务:分布式事务与本地事务的区别

分布式事务章节 分布式事务&#xff1a;2PC与3PC的区别-CSDN博客 分布式事务&#xff1a;X/Open DTP分布式事务处理模型与分布式事务处理XA规范-CSDN博客 事务简介 事务(Transaction)是操作数据库中某个数据项的一个程序执行单元(unit)。事务是由一组操作构成的可靠的独立的…

[SWPUCTF 2018]SimplePHP1

打开环境 有查看文件跟上传文件&#xff0c;查看文件里面显示没有文件url貌似可以文件读取 上传文件里面可以上传文件。 先看一下可不可以文件读取 /etc/passwd不能读取&#xff0c;源码提示flag在f1ag.php 看看能不能读取当前的文件&#xff0c; 先把代码摘下来 file.php …

LPC系列一个定时器不同频率

1.背景 最近研究的LPC804里只有一个ctimer&#xff0c;很多时候用的捉襟见肘的&#xff0c;官方给了一份双匹配的参考例程&#xff0c;不过实际用处不大。不过我花了一晚上的时间&#xff0c;终于研究出来将一个定时器拆成四个定时器用的办法了。这个方法适用于用回调函数的LP…

Fastbee物联网项目新手快速入门

一&#xff0c;前提条件 后端环境准备如下&#xff1a; 正式环境推荐硬件资源最低要求4c8G&#xff0c;硬盘40G。JDK 1.8.0_2xx (需要小版本号大于200) 。Maven3.6.3。&#xff08;IDEA启动时使用IDEA默认自带的版本即可&#xff09;。 启动fastbee之前&#xff0c;请先确定…

go语言(十七)----json

1、结构体转json package mainimport ("encoding/json""fmt" )type Movie struct{Title string json:"title"Year int json:"year"Price int json:"rmb"Actors []string json:"actors" }func main() {movie : Mo…

《A++ 敏捷开发》- 6 估算软件规模

为什么要估规模 规模可以帮我们&#xff1a; 依据历史数据策划&#xff0c;例如估算工作量、工期。归一(Normalize)不同项目作比较。知道现在水平。 依据历史数据策划先把项目分成组件&#xff0c;参考以往类似的组件所花工作量&#xff0c;估算整个项目的总工作量。规模大小…