Mybatis中mapper.xml的使用
详解多对多,mybatis多对多查询(xml方式和注解方式)
链接:https://blog.csdn.net/qq_42524262/article/details/98383977
链接:https://blog.csdn.net/Mr_wangr/article/details/97920802
类里面attribute和property区别
attribute为数据成员
property是get/set方法后面那个词,比如getMyName(),就是MyName。
typeAliases元素:
1,这个标签里面的typeAlias标签可以定义别名,会在映射文件中使用。如果没有定义别名,那必须使用【全限定名】。
2,其【子标签package】可以为包下所有类定义别名。
别名默认就是类名。
【自动生成主键】:
a.对于主键值可以自动增长的数据库,例如mysql 可以如下:
<insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="studId">表示主键为studId,且自动增长
b.对于主键值不能够自动增长的数据库,例如oracle,使用【序列】(SEQUENCE)来生成主键值。
create sequence my_seq;
<insert id="insertStudent" parameterType="Student">
<selectKey keyProperty="studId" resultType="int" order="BEFORE">
SELECT my_seq.nextval FROM DUAL
</selectKey>
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone})
</insert>
使用了<selectKey>子元素来生成主键值,并将值保存到Student对象的studId 属性上。
order属性:MySQLorder需要设置为after,Oracle需要设置为before
ResultMap属性:结果集映射,用来将SELECT语句的结果集映射到java对象的属性中。ResultMaps特性非常强大,你可以使用它将简单的SELECT语句映射到复杂的一对一、一对多关系的SELECT语句上。
拓展 ResultMap:
<resultMap type="Student" id="StudentResult">
<.......>
<resultMap type="Student" id="StudentWithAddressResult" extends="StudentResult">
<........>
其中id为StudentWithAddressResult的resultMap拓展了id为StudentResult的resultMap
使用【嵌套结果ResultMap】一对一
Association属性:
<resultMap type="Address" id="AddressResult">
<....>
</resultMap>
<resultMap type="Student" id="StudentWithAddressResult">
<....>
<!-- 【关联】的意思 【嵌套结果映射】-->
<association property="address" resultMap="AddressResult" />
</resultMap>
元素<association>被用来导入“有一个”(has-one)类型的关联。在上述的例子中,我们使用了<association>元素引用了另外的在同一个XML文件中定义的<resultMap>。
Collection属性:将多行结果映射成一个对象的一个集合
private List<Course> courses;
<!-- collection表一对多关系,遇到courses集合成员 -->
<collection property="courses" resultMap="CourseResult" />
使用【嵌套查询select】一对一
嵌套查询本质:
一个select语句 转化成 多条select语句去实现功能。
【先根据addr_id去查找 地址对象】
<resultMap type="Address" id="AddressResult"></....>
<select id="findAddressById" parameterType="int" resultMap="AddressResult">
select * from addresses where addr_id=#{id}
</select>
<resultMap type="Student" id="StudentWithAddress">
<........>
<association property="address" column="addr_id" select="findAddressById" />
</resultMap>
在此方式中,<association>元素的select属性被设置成了id为findAddressById的语句。这里,两个分开的SQL语句将会在数据库中分别执行,第一个调用findStudentById加载student信息,而第二个调用findAddressById来加载address信息。
addr_id列的值将会被作为输入参数传递给findAddressById语句。
总结:
嵌套结果查询 本质上是一条sql语句查询多张表;
嵌套查询 本质上是每条sql语句查询一张表,组合在一起查询多张表。
效率上,嵌套结果更快。
结论:
如果是 嵌套结果,通过 association标签中的 resultMap属性 实现;
如果是 嵌套查询,通过 association标签中的 select属性 实现
嵌套结果映射和嵌套查询 一对多 和 一对一 类似,只是运用collection属性而已
多对多的关系可以参照一对多,只是中间多了一个桥表。
不论是一对一还是一对多还是多对多,都不能在mybatis中进行级联保存、更新、删除,我们需要使用sql语句控制每一步操作(可以级联查询)
Mybatis中mapper.xml的使用的更多相关文章
- 关于Mybatis中mapper.xml的传入参数简单技巧
由于在做项目的时候,我看见同事使用的传入参数类型各式各样,感觉没规律可言,闲暇的时候我就自己搭建了项目做了一些传入参数的测试(当然其实更好的方式是看源码,但是博主能力有限,毕竟入行没多久,看起来很吃力 ...
- 逆向工程生成的mybatis中mapper文件。mapper接口,实例化成对象
逆向工程生成的mybatis中mapper文件中,*mapper文件只是接口,而不是类文件.但是却可以通过spring的容器获得实例. 例如: //1.获得mapper代理对象,从spring容器获得 ...
- maven中mapper.xml不发布的问题
在自定义的包中定义了mapper.xml然后利用mybatis的扫描包形式来动态创建mapper 开启工程报错: 说无效的绑定 原因: 发布的war中,工程包中的mapper根本就没有出现在class ...
- (转)解决mybatis的mapper.xml查询不出数据,结果一直为null问题
背景:记录mybatis使用过程中遇到的相关问题. 解决mybatis的mapper.xml查询不出数据,结果一直为null问题 解决方案: 1 修改实体类与数据库字段名相同 2 修改sql查询语句, ...
- MyBatis 中 Mapper 接口的使用原理
MyBatis 中 Mapper 接口的使用原理 MyBatis 3 推荐使用 Mapper 接口的方式来执行 xml 配置中的 SQL,用起来很方便,也很灵活.在方便之余,想了解一下这是如何实现的, ...
- mybatis进行mapper.xml测试的时候发生"必须为元素类型 “mapper” 声明属性 “namespace”
1.Caused by Caused by: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 45; 必须为元素类型 " ...
- mybatis 中的 xml 配置文件中 ‘<’、 ‘>’ 处理
mybatis 中的 xml 配置文件中 '<'. '>' 处理 1.使用转义字符将 '<'. '>' 替换掉. 描述 字符 转义字符 小于号 < < 大于号 &g ...
- 【转】Mybatis 3.1中 Mapper XML 文件 的学习详解
MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...
- Mybatis 3.1中 Mapper XML 文件 的学习详解(转载)
MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...
随机推荐
- MySQL学习(九)小结
redo-log 和 bin-log 是如何联系起来的? update 语句在更新的时候先更新内存后,写 redo-log 然后 bin-log ,其中后面一步是使用了两阶段提交, 也就是每一个更新都 ...
- Linux - 查看静态硬件信息
概述 查看系统的 信息 一些 相对静态 的信息 背景 一直想写, 但是没来得及整理 每次要用的时候, 都慌里慌张的到处找 这次把他记下来 环境 CentOS 7 下面有些方法, 可能是 centos ...
- linux 系统如何复制文件到指定目录
首先使用命令函数“cp” 即copy的缩写, 一般模式: cp filename 路径. 如file1在A目录下,我们想把file1复制到B目录下 命令为 cp file1 /home/B ...
- C#中数据类型char*,const char*和string的三者转换
C#中数据类型char*,const char*和string的三者转换: . const char* 和string 转换 () const char*转换为 string,直接赋值即可. EX: ...
- Codeforces C. Almost Equal (数学规律)
题目链接:http://codeforces.com/contest/1206/problem/C 题解 : 观察可以发现当n为偶数时,1 - 2n是不满足题意的,可以举例n = 2,n = 4试一试 ...
- hdu1874 (spfa 最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 很简单的最短路问题,刚刚学习spfa,其实很简单,思想和一维动态规划差不多,数组d[i]表示起点 ...
- Diskpart手动创建EFI、MSR引导分区
当给电脑加新硬盘时候,并且需要把新硬盘当作系统盘,有几种方法来为新硬盘创建引导分区: 可以选择用U盘刻录微软原版系统镜像,直接从U盘启动,然后直接创建分区,直接装,会自动为硬盘创建好几个引导分区. 进 ...
- 【SIKI学院】愤怒的小鸟创建过程-1
第一讲:资源导入,场景的简单搭建 1.创建一个2D工程,用到了3个场景,因此ctrl +S创建场景00-level,ctrl+N保存在你创建的文件夹中,这样一个文件就创建好了,之后继续重复此步骤创建另 ...
- Common Subsequence Gym - 102307C 公共序列
2019 ICPC Universidad Nacional de Colombia Programming Contest C D J C. Common Subsequence 题意:给出长度 ...
- 7-3 Path to Infinity(还没ac)
留坑 #include<bits/stdc++.h> using namespace std; ; ; typedef long long ll; string s,t; ,tol2=,t ...