MyBatis 动态代理和映射器

一、映射器简介

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 studentleft 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 classleft join student on class.classid = student.classid</select>	
</mapper>

6.级联的缺陷

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS多目标产物构建最佳实践

背景 在Android或iOS开发时经常会有打“马甲”包的场景&#xff0c;就是一套代码打出不同主题的包&#xff0c;一个公司的产品可能针对不同用户提供不同的应用&#xff0c;比如抖音有国内版也有国外版&#xff0c;滴滴有个人版还有企业版&#xff0c;同样的在鸿蒙平台也有类似…

C++初学(9)

9.1、结构简介 虽然数组能够和存储多个元素&#xff0c;但所有元素必须相同&#xff0c;也就是说&#xff0c;同一个数组不能既存放int类型也存放float类型&#xff0c;而C的结构可以满足要求。结构是一种比数组更灵活的数据格式&#xff0c;因为同一个结构可以存储多种类型的…

QtQuick Text-文本样式

属性 Text项目的style属性可以设置文本的样式。 支持的文本样式有&#xff1a; Text.Normal&#xff08;默认&#xff09;Text.OutlineText.RaisedText.Sunken 示例 import QtQuickRow{spacing: 10padding: 10Text {font.pointSize: 40text: "Normal"}Text {font…

数据库原理之多表查询——使用Mysql进行内连接和外连接

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;Idea 目录 1.内连接 1.1隐式内连接 1.1.1定义 1.1.2举例 1.1.3优缺点 1.2显式内连接 1.2.1定义 1.2.2举例 1.2.3优缺点 2.外连接 2.1左外连接 2.1.1定义 2.1.2举例 2.…

【从零开始一步步学习VSOA开发】开发环境搭建

开发环境搭建 开发 VSOA 首先需要搭建开发环境&#xff0c;这里讲解 Windows 下 C/C 开发环境搭建方法。 下载 IDE 并申请授权码 SylixOS 的开发和部署需要 RealEvo-IDE 的支持&#xff0c;因此您需要先获取 RealEvo-IDE 的安装包和注册码。 RealEvo-IDE 分为体验版和商业版…

如何确保PLC系统安全的可靠性,这几个注意事项你需要牢记

PLC&#xff08;可编程逻辑控制器&#xff09;是现代工业自动化系统中的关键组成部分。在设计 PLC 系统时&#xff0c;安全性是至关重要的考虑因素。本文将介绍 PLC 系统设计中的一些安全注意事项&#xff0c;包括电源设计、接地设计、关键数字量输入输出设计和报警设计。 一.…

vue实现简易的全局加载动画效果

效果展示 思路 封装一个组件&#xff0c;放Img&#xff0c;伪类样式&#xff0c;固定在屏幕fixed 然后App应用这个组件&#xff0c;Z index拉最大&#xff0c;防止用户在加载动画时乱点&#xff0c; v-show绑定loading&#xff0c;该数据可以放vuex还是任一的公共状态管理变…

PDF文件点击打印无反应?是何原因造成能解决吗?

PDF无法打印怎么处理&#xff1f;在我们工作中&#xff0c;经常会遇见各种各样的文件问题&#xff0c;当我们想要将PDF文件打印出来纸质版使用&#xff0c;却不知什么原因&#xff0c;显示PDF无法打印&#xff0c;这时应该怎么处理呢&#xff1f; 一般情况下&#xff0c;PDF文件…

cesium canvas广告牌

在有些业务中&#xff0c;对场景中的广告牌样式要求比较高&#xff0c;需要动态显示一些数据&#xff0c;这个时候&#xff0c;我们可以通过将复杂背景样式制作成图片&#xff0c;通过canvas绘制图片和动态数据&#xff0c;从而达到比较好的显示效果。 1 CanvasMarker 类封装 …

学Python可少不了项目练手,这8个小项目有趣又实用,小白也能做出来_python练手项目,python教程

学习之路比较科学的学习方法是理解了之后把知识点进行运用&#xff0c;找一些开源的小项目做是最好的&#xff0c;站在岸上是学不会游泳的&#xff0c;光看健身视频是减不了肥的&#xff0c;不自己动手敲代码是学不会编程的。 我在找了8个比较有趣的小项目&#xff0c;技术水平…

E5092A可配置的多端口测试仪

E5092A 可配置的多端口测试仪 多达 10 个端口的全交叉测量&#xff0c;或者最多 22 个端口的测量功能。 概述 E5092A 多端口测试仪可以灵活配置&#xff0c;并可与4 端口ENA 网络分析仪&#xff08;E5070B/E5071B/E5071C/E5080A&#xff09;结合使用&#xff0c;组成频率范…

web3 solana

网址&#xff1a;HACKQUEST 学习初衷&#xff1a; 1.web3概念较为小众&#xff0c;相比于web2&#xff0c;机会较多 2.有机会remote work&#xff0c;带着笔记本到处浪&#xff0c;听着就不错 3.面对越来越卷的国内&#xff0c;有机会并有能力拥抱国外job&#xff0c;感觉是…

鸿蒙系统开发【应用接续】基本功能

应用接续 介绍 基于ArkTS扩展的声明式开发范式编程语言编写的一个分布式视频播放器&#xff0c;主要包括一个直播视频播放界面&#xff0c;实现视频播放时可以从一台设备迁移到另一台设备继续运行&#xff0c;来选择更合适的设备继续执行播放功能以及PAD视频播放时协同调用手…

《LeetCode热题100》---<5.②普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的六道题 第三道&#xff1a;轮转数组&#xff08;中等&#xff09; 第四道&#xff1a;除自身以外数组的乘积&#xff08;中等&#xff09; 第三道&#xff1a;轮转数组&#xff08;中等&#xff09; 方法一&#xff1a;使用额外的数…

vscode+cmake+msys2工具链配置

1、msys2下载编译器和cmake工具 pacman -S mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-cmaketoolchain包中包含很多不必要的工具包&#xff0c;应该可以指定具体的工具g&#xff0c;gcc&#xff0c;mingw32-make的下载&#xff0c;详细命令请自行搜索。 2、将 m…

QT 应用程序输出中文乱码

一 &#xff0c;选择文本编码 1. 点击编辑再点击Select Encoding选择编码 2 .在弹出的窗口&#xff0c;选择UTF-8再点击按编码保存即可 3. 重新编译&#xff0c;可以发现中文乱码问题解决

思维+dfs,CF 269C - Flawed Flow

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 269C - Flawed Flow 二、解题报告 1、思路分析 考虑源点相连的边的方向是确定的&#xff0c;因为流量是从源点往外流的 我们设cap[u] 为 和u相连边的容量和&#xff0c;显然入边容量要和出边容量相等&…

jvm调优参数

JVM调优是指调整JVM的参数&#xff0c;以优化Java程序的性能。以下是一些常用的JVM调优方法&#xff1a; 1.堆内存大小&#xff1a;通过-Xms和-Xmx参数设置JVM的初始堆内存和最大堆内存。堆内存太小会导致频繁GC&#xff0c;太大则可能导致内存利用率不高。 2.新生代与老年…

OS_操作系统的运行环境

2024.06.11:操作系统的运行环境学习笔记 第3节 操作系统的运行环境 3.1 操作系统引导3.2 操作系统内核3.2.1 内核资源管理3.2.2 内核基本功能 3.3 CPU的双重工作模式3.3.1 CPU处于用户态&#xff08;目态&#xff09;3.3.2 CPU处于内核态&#xff08;管态&#xff09; 3.4 特权…

鸿蒙Scroll布局,横向与纵向

注意&#xff0c;当横向scroll时&#xff0c;直接子元素的宽&#xff0c;不能100%&#xff0c; 当纵向scroll时&#xff0c;直接子元素的高&#xff0c;不能100%​​​​​​​ 1、纵向代码&#xff1a; 方法1&#xff1a;用数值计算&#xff0c;来设置中间的高度&#xff1a; …