MyBatis 动态代理和映射器

news2024/9/23 1:25:58

一、映射器简介

1.什么是mapper动态代理?

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

2.动态代理的规范

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

  1. 接口中的返回值 要和 sqlMapper 中的resultType 一致
  2. 接口中的入参 要和 sqlMapper 中的parameterType 一致
  3. 接口的方法名 要和 sqlMapper 中的id 一致(dao层不允许方法的重载)
  4. sqlMapper 中的namespace 指向 接口的类路径
  5. 接口要和sqlMapper 同包
  6. 接口要和sqlMapper 同名

 

 

3.如何使用动态代理

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

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
		
List<Student> sList = new ArrayList<Student>();
sList = mapper.findAllAtudent();
for(Student student:sList) {
			System.out.println(student);
}
DaoUtil.closeResource(sqlSession);

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

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

4.为什么学习映射器

半自动化的体现配置 SQL 语句,体现了半自动化和灵活性。
ORM的体现对象关系映射的实现,数据库表 和 POJO 类的映射关系。

5.映射器与接口

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

6.映射器的引入

文件路径用相对路径引入映射器:
<mapper resource=”com/codeup/dao/Mapper.xml”/>
XML用文件定位符引入映射器:
<mapper url=”file:///var/mappers/Mapper.xml”/>
包名用包名引入映射器:
<package name=”com.codeup.dao.Mapper”/>
类注册 用类名引入映射器:
<mapper class=”com.codeup.mapper.NewsMapper”/>

7.映射器的组成

映射器
SQL语句映射关系
<select><insert><delete><update><sql><parame terMap><result Map>

 二、s e l e c t 元素

语法规则: < select 属性=“值”>查询类SQL语句</select>

属性说明
id唯一标识,接口中的方法名;
parameterType入参的类型;
resultType结果的类型;
resultMap复杂的结果集映射关系;
<select id="findAllAtudent" resultType="Student"> 
	select * from student
</select>

1.输出简单类型 

 定义接口方法:

//查询所有学生

public List<Student> findAllAtudent();

在StudentMapper.xml中写对应标签和sql语句:

<select id="findAllAtudent" resultType="Student"> 
	select * from student
</select>

2.参数传递

XML 文件中:配置文件中利用 parameterType 属性设置参数类型,利用 #{}设置参数的使用及位置。

接口中:接口中,按照方法的入参方式指定参数类型和参数名称。

 

条件有 > < >= <= 可以使用转义字符进行代替:

//接口:
//查看sid大于num的学生
public List<Student> findStudentBigSid(int num);
xml文件:
<select id="findStudentBigSid" parameterType="int" resultType="student">
	select * from student where sid &lt; #{v}
</select>

3.多个参数传递

 //查询 某个班某个性别的学生 ,mybatis 只能传一个参

传递多参的方式一:javaBean对象

//传递多参的方式一:javaBean对象
    
//接口:
public List<Student> findStudentByClassAndSsex(Student s);
xml文件:
<select id = "findStudentByClassAndSsex" parameterType="Student" resultType="Student">
	select * from student where classid = #{classid} and ssex = #{ssex}
</select>

//传递多参的方式二:Map(不推荐,耦合度太高)

//传递多参的方式二:Map(不推荐,耦合度太高)
 
//接口:
public List<Student> findStudentByClassidAndSsexLimit(Map<String,Object> map);
xml文件:
<select id="findStudentByClassidAndSsexLimit" parameterType="map" resultType="Student">
	select * from student where classid = #{bj} and ssex = #{xb} limit #{wz},#{bc}
</select>

 //传递多参的方式三:param数 数从1开始 推荐

//传递多参的方式三:param数 数从1开始 推荐
 
//接口:
public List<Student> findStudentByClassidAndSsexLimitParam(int classid,String ssex,int weizhi,int buchang);
xml文件:
<select id="findStudentByClassidAndSsexLimitParam">
	select * from student where classid = #{param1} and ssex = #{param2} limit #{param3},#{param4}
</select>

//传递多参的方式四:arg数 数是从0开始 --> 和后面框架内置参数的名称

//传递多参的方式四:arg数 数是从0开始 --> 和后面框架内置参数的名称
 
//接口:
public List<Student> findStudentByClassidAndSsexLimitArg(int classid,String ssex,int weizhi,int buchang);
xml文件:
<select id="findStudentByClassidAndSsexLimitArg" resultType="Student">
	select * from student where classid = #{arg0} and ssex = #{arg1} limit #{arg2},#{arg3}
</select>

三、i n s e r t 元素 

语法规则: < insert 属性=“值”>新增类SQL语句</insert>

属性说明
id唯一标识,接口中的方法名;
parameterType参数的类型;
keyProperty表示以哪个列作为属性的主键,不能和 keyColumn 同时使用;
keyColumn指明哪一列是主键,不能和 keyProperty 同时使用;
useGeneratedKeys使用 JDBC 的 getGeneratedKeys 方式来取有数据库内部生成的主键;

1.主键回填 

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

 useGeneratedKeys="true" 开启主键回填

keyProperty="sid" 回填的主键给哪个属性

//接口:
public int addStudent(Student s);
useGeneratedKeys="true" 开启主键回填
 
keyProperty="sid" 回填的主键给哪个属性
 
//xml文件:
<insert id="addStudent" parameterType="com.ape.bean.Student"
	useGeneratedKeys="true" keyProperty="sid">
	insert into student (sname,birthday,ssex,classid)
	values(#{sname},#{birthday},#{ssex},#{classid})
</insert>

2.自定义主键生成规则

 

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

order 属性: 取值 BEFORE,AFTER ;

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

1.<update>

语法规则: < update 属性=“值”>查询类SQL语句</update>

属性说明
id唯一标识,接口中的方法名;
parameterType参数的类型;

2.<delete>

语法规则: < delete 属性=“值”>查询类SQL语句</delete> 

属性说明
id唯一标识,接口中的方法名;
parameterType参数的类型;

五、r e s u l t M a p 元 素

1.为什么要使用 resultMap 元素

01 定义映射规则ORM 的特性,POJO 类和数据 库的映射关系;
02 级联操作多表存在主外键关系时,主表和 从表之间的关联操作;
03 类型转换数据库字段的类型和 POJO 类 属性的类型转换

2.resultMap 元素的结构

<constructor>:用于配置构造方法的元素

<id>:标识主键列,允许多个主键。

<result>:POJO 到 SQL 列名的映射关系。

3.使用 POJO 存储结果集

 

xml文件: 
<!-- 
 	sqlMapper 文件:执行方法和sql语句映射
  -->
<mapper namespace="com.zad.mapper.StudentMapper">
	<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" />
</mapper>
属性说明
property映射到列结果的字段或者属性,通常是指 POJO 的属性;
column对应的数据库字段;
javaTypeJava 类型,可以是基本数据类型,也可以是类完全限定名;
jdbcTypeJDBC 的类型,基本支持所有常用的数据库类型;

六、多表联查

1.什么是级联

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

一对一 :一个对象对应唯一的对象, 举例:中国公民和身份证;

一对多 :一个对象对应多个对象, 举例:班级和学生;

多对多 :多个对象对应多个对象, 举例:公司角色和公司员工

2.一对一级联步骤

  1. 验证 编写测试类验证级联关系;
  2. 级联映射 利用 元素完 成一对一级联;
  3. 创建映射器 创建对应的映射器;
  4. 创建关联POJO 一对一级联时,以对象方式存 储关联关系;

3.一对一级联映射

首先在实体类中添加级联表的对象:

public class Student {
	private int sid;
	private String sname;
	private Date birthday;
	private String ssex;
	private int classid;
	//外部属性
	private Banji bj;

 

//接口
public List<Student> findAllStudent();
//xml文件:
<mapper namespace="com.zad.mapper.StudentMapper">
	<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>
	<select id="findAllStudent" resultMap="stu_class_Map">
		select * from student
		left join class on student.classid = class.classid
	</select>	
</mapper>

4.一对多级联步骤

创建”一“方POJO 以集合的形式级联“多”方对象

创建“多”方对象 创建“多”方的 POJO 对象

创建映射器 创建对应的映射器

实现一对多级联 利用 collection 元素实现一 对多的级联

测试 编写测试文件测试一对多级联

5.一对多级联

首先在实体类中添加级联表的对象list集合:

public class Banji {
	private int classid;
	private String classname;
	// 外部属性
	private List<Student> stulist;
//接口
public List<Banji> findAllBanjiAndStu();
//xml文件:
<mapper namespace="com.zad.mapper.BanjiMapper">
<!-- 类路径 -->
	<resultMap type="Banji" id="bj_class_Map">
		<result column="classid" property="classid"/>
		<result column="classname" property="classname"/>
			
		<!-- 1对多 -->
		<collection property="stulist" 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>
	
	<select id="findAllBanjiAndStu" resultMap = "bj_class_Map">
		select * from class
		left join student on class.classid = student.classid
	</select>	
</mapper>

6.级联的缺陷

  • 性能缺陷 级联操作会降低性能, 增加程序的执行时间;
  • 复杂度缺陷 关联较多造成复杂度的 增加,不利于他人的理 解和维护

 使用建议:
1、根据实际情况增加级联关系;
2、多层关联式,建议超过三层关联时尽量少用级联; 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

H5+JS 4096小游戏

主要实现 1.使用WASD或方向按钮控制游戏 2.最高值4096&#xff0c;玩到4096视为胜利 3.随机生成2、4、8方块 4.移动方块 5.合并方块 JS代码干了什么 初始化游戏界面&#xff1a;创建游戏板和控制按钮。 定义游戏相关变量&#xff1a;如棋盘大小、棋盘状态、得分等。 初始化棋…

【MATLAB源码】机器视觉与图像识别技术实战示例文档---鱼苗面积预测计数

系列文章目录 第一篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术—视觉系统的构成(视频与图像格式转换代码及软件下载) 第二篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术(2)—图像分割基础 第三篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术…

三星半导体业务动态:3nm技术及AI/HPC销售展望

#### 第二季度财报概览 7月31日&#xff0c;三星公布了2024年第二季度的财务报告&#xff0c;显示合并营业收入为74.07万亿韩元&#xff0c;营业利润为10.44万亿韩元&#xff08;约75亿美元&#xff09;。其中&#xff0c;DS&#xff08;设备解决方案&#xff09;部门的合并营…

深入探讨 Docker 容器文件系统

引言 随着云计算和微服务架构的兴起&#xff0c;Docker 容器技术迅速成为开发和运维人员的首选工具。Docker 容器不仅提供了一种轻量级的虚拟化方式&#xff0c;还简化了应用程序的部署和管理。在众多的技术细节中&#xff0c;Docker 容器文件系统是一个至关重要的组成部分。本…

Harmony学习(三)------ArkUI(3)

1.模版字符串 let name:string 模版字符串 let age:number 18 console.log(字符串:,${name}和${age})2.字符串和数字互相转换 //字符串转数字 let str1:string 1.1 console.log(转换,Number(str1)) //output: 1.1 console.log(转换,parseInt(str1)) //output: 1 conso…

笔记:VGGnet的实现

本文为B站UP 霹雳吧啦Wz 图片分类课程学习笔记&#xff0c;用于记录学习历程和个人复习 程序共分为三部分&#xff1a;model,train,predict。model.py用于存放模型&#xff0c;train.py用于存放训练时的程序&#xff0c;predict.py用于存放预测的程序&#xff0c;vgg16Net.pth…

从技术博客到个人 IP 矩阵:全面攻略与实战示例

文章目录 摘要引言创建博客选择平台设计和布局 内容规划明确目标受众设定内容方向制定发布计划 SEO 优化关键词研究内链和外链元标签优化 社交媒体推广选择社交平台制定推广策略 可运行的 Demo 代码模块QA 环节问&#xff1a;如何增加博客的曝光度&#xff1f;问&#xff1a;如…

使用 ChatGPT 检测媒体偏见的潜力和局限性

概述 随着数字时代的到来&#xff0c;信息瞬间传遍全球&#xff0c;但其中也不乏各种偏见。媒体偏见"&#xff0c;即对某些观点的选择性报道&#xff0c;会影响人们对某一事件或问题的看法&#xff0c;并对公众舆论产生重大影响。事实上&#xff0c;许多人都认为主要媒体…

国内本地化OCSP服务的SSL证书:提升安全与效率的新选择

在数字化时代&#xff0c;网络安全成为企业运营和用户体验的重要基石。HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;作为一种安全的网络协议&#xff0c;通过SSL&#xff08;Secure Sockets Layer&#xff09;加密技术&#xff0c;保障了数据传输的机密性…

网络协议二 : 使用Cisco Packet Traceer工具模拟网络环境,集线器,网桥,交换机,路由器,MAC,IP,同一网段,子网掩码,子网划分

1. 安装 Cisco Packet Tracer baidu 网盘地址&#xff0c;感谢大神分享 安装&#xff0c;破解&#xff0c;中文化&#xff0c;都有说明&#xff0c;建议使用7.x的那个版本&#xff0c;感觉比8.x的翻译要完整一点 https://pan.baidu.com/s/18iWBOfhJJRhqgQqdNQcfMQ?pwddcch#…

【考研数学】概率论中集合间的运算图示

今天要给大家分享的笔记是&#xff1a;《概率论中的4种“集”&#xff1a;交集、并集、差集、补集》&#xff1a;

修复msvcp120.dll丢失的问题的几种简单方法,msvcp120.dll是什么

在使用电脑时&#xff0c;你可能会遭遇一个提示称“msvcp120.dll丢失”的错误信息。这个问题比较普遍&#xff0c;主要是因为你的系统中缺失了某个特定的动态链接库&#xff08;DLL&#xff09;文件。msvcp120.dll是由 Microsoft Visual C 可再发行包提供的关键文件&#xff0c…

【C++】C++11新增语法(右值引用、完美转法)

文章目录 1.C11新增常用语法1.1 统一的列表初始化1.2 initializer_list初始化1.3 声明相关1.4 继承与多态相关 2. 右值引用与移动语义2.1 左值引用与右值引用2.2 右值引用与移动语义的使用场景2.3 右值引用引用左值(move) 3. 完美转发4. 新的类功能4.1 新增两个默认成员函数4.2…

测试开发面试题,助你拿高薪offer

进入金九银十&#xff0c;很多小伙伴有被动跳槽的打算&#xff0c;所以更新一些测试开发 面试题&#xff0c;希望能帮到大家。 一 请说一下HTTP 状态码 HTTP状态码大致分为5类&#xff1a; 常见的http状态码如下: 二 python中“” 和“ is ”的区别 is 和 都可以进行对象比…

bash: llamafactory-cli: command not found解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

探索翻译新世界:2024年超越期待的翻译应用推荐

现在社会因为交通、互联网的便利&#xff0c;不同国家之间的交流变得简单起来。无论是商务合作、学术研究还是日常沟通&#xff0c;准确、快速地跨越语言障碍都显得尤为重要。今天我来介绍一些和百度翻译类似的多用途的翻译工具。 1.福昕在线翻译 链接一下>>https://fa…

《LeetCode热题100》---<4.子串篇三道>

本篇博客讲解LeetCode热题100道子串篇中的三道题 第一道&#xff1a;和为 K 的子数组 第二道&#xff1a;滑动窗口最大值 第三道&#xff1a;最小覆盖子串 第一道&#xff1a;和为 K 的子数组&#xff08;中等&#xff09; 法一&#xff1a;暴力枚举 class Solution {public in…

C语言进阶 13. 文件

C语言进阶 13. 文件 文章目录 C语言进阶 13. 文件13.1. 格式化输入输出13.2. 文件输入输出13.3. 二进制文件13.4. 按位运算13.5. 移位运算13.6. 位运算例子13.7. 位段 13.1. 格式化输入输出 格式化输入输出: printf %[flags][width][.prec][hlL]type scanf %[flags]type %[fl…

yolo格式数据集之空中及地面拍摄道路病害检测7种数据集已划分好|可以直接使用|yolov5|v6|v7|v8|v9|v10通用

yolo格式数据集之空中及地面拍摄道路病害检测7种数据集已划分好|可以直接使用|yolov5|v6|v7|v8|v9|v10通用 本数据为空中及地面拍摄道路病害检测检测数据集&#xff0c;数据集数量如下&#xff1a; 总共有:33585张 训练集&#xff1a;6798张 验证集&#xff1a;3284张 测试集&a…

视频监控国标GB28181平台EasyGBS如何更换默认的SQLite数据库?

视频流媒体安防监控国标GB28181平台EasyGBS视频能力丰富&#xff0c;部署灵活&#xff0c;既能作为业务平台使用&#xff0c;也能作为安防监控视频能力层被业务管理平台调用。国标GB28181视频EasyGBS平台可提供流媒体接入、处理、转发等服务&#xff0c;支持内网、公网的安防视…