详解多对多,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的使用的更多相关文章

  1. 关于Mybatis中mapper.xml的传入参数简单技巧

    由于在做项目的时候,我看见同事使用的传入参数类型各式各样,感觉没规律可言,闲暇的时候我就自己搭建了项目做了一些传入参数的测试(当然其实更好的方式是看源码,但是博主能力有限,毕竟入行没多久,看起来很吃力 ...

  2. 逆向工程生成的mybatis中mapper文件。mapper接口,实例化成对象

    逆向工程生成的mybatis中mapper文件中,*mapper文件只是接口,而不是类文件.但是却可以通过spring的容器获得实例. 例如: //1.获得mapper代理对象,从spring容器获得 ...

  3. maven中mapper.xml不发布的问题

    在自定义的包中定义了mapper.xml然后利用mybatis的扫描包形式来动态创建mapper 开启工程报错: 说无效的绑定 原因: 发布的war中,工程包中的mapper根本就没有出现在class ...

  4. (转)解决mybatis的mapper.xml查询不出数据,结果一直为null问题

    背景:记录mybatis使用过程中遇到的相关问题. 解决mybatis的mapper.xml查询不出数据,结果一直为null问题 解决方案: 1 修改实体类与数据库字段名相同 2 修改sql查询语句, ...

  5. MyBatis 中 Mapper 接口的使用原理

    MyBatis 中 Mapper 接口的使用原理 MyBatis 3 推荐使用 Mapper 接口的方式来执行 xml 配置中的 SQL,用起来很方便,也很灵活.在方便之余,想了解一下这是如何实现的, ...

  6. mybatis进行mapper.xml测试的时候发生"必须为元素类型 “mapper” 声明属性 “namespace”

    1.Caused by Caused by: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 45; 必须为元素类型 " ...

  7. mybatis 中的 xml 配置文件中 ‘<’、 ‘>’ 处理

    mybatis 中的 xml 配置文件中 '<'. '>' 处理 1.使用转义字符将 '<'. '>' 替换掉. 描述 字符 转义字符 小于号 < < 大于号 &g ...

  8. 【转】Mybatis 3.1中 Mapper XML 文件 的学习详解

    MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...

  9. Mybatis 3.1中 Mapper XML 文件 的学习详解(转载)

    MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...

随机推荐

  1. beego orm 多对多插入和查询操作

    // User 用户表 type User struct { ID int UserName string Password string Articles []*Article `orm:" ...

  2. Centos7 FRPS

    #下载Sever端 wget https://github.com/fatedier/frp/releases/download/v0.16.1/frp_0.16.1_linux_amd64.tar. ...

  3. EAC3 enhanced channel coupling

    Enhanced channel coupling是一种spatial coding 技术,在传统的channel coupling的基础上添加了phase compensation, de-corr ...

  4. C# RichTextBox实现背景透明

    这几天在做一个文本编辑器,要将RichTextBox的背景透明,但是发现C#的RichTextBox是不支持将背景设置为Transparent(透明). 网上找了好多方法,但都不行. 后来自己想了个办 ...

  5. js面向过程 分页功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Jarvis OJ - 软件密码破解-1 -Writeup

    Jarvis OJ - 软件密码破解-1 -Writeup 转载请标明出处http://www.cnblogs.com/WangAoBo/p/7243801.html 记录这道题主要是想记录一下动态调 ...

  7. 关于Sublime如何配置C++环境的问题

    前言 传说sublime是全球最好的编辑器,可是只是编辑器啊!!!如果要运行,对于我们这些蒟蒻来说,不得不去使用DEV_C++.我们总是幻想能让sublime变成一个轻量级IDE,那该多好啊!!! 那 ...

  8. Codeforces Round #624 (Div. 3) F

    题意: 给出n的质点,带着初位置和速度: 如果中途两点可以相遇dis(i,j)=0: 如果不可以相遇,mindis(i,j): 求n个点的两两质点最小dis(i,j)之和 思路: 因为当初位置x和速度 ...

  9. vue简单计数器

    //App.vue <template> <div id="app"> <!-- <img src="./assets/logo.pn ...

  10. Docker - 命令 - docker container

    概述 整理 docker 容器的命令 1. 分类(25个) 查看 ls diff logs inspect port stats top 生命周期 pause prune create kill re ...