问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

映射一对多还是多对一?

发布网友 发布时间:2022-05-02 06:18

我来回答

2个回答

懂视网 时间:2022-05-02 10:39

当数据库中表与表之间有关联时,在对数据库进行操作时,就不只是针对某一张表了,需要联表查询

MyBatis中如何实现联表查询

1、首先新建两张表

学生表(student

  • ID:stu_id
  • 姓名:stu_name
  • 年龄:stu_age
  • 性别:stu_gender
  • 所在班级:g_id
  • 班级表(grade

  • ID:g_id
  • 班级名称:g_name
  • 学生表和班级表通过 g_id 进行关联,一个班级对应多个学生

    技术分享

    2、创建相应的实体类和mapper接口

    (1)创建 Student 类和 Grade 类(包名:com.bwlu.bean

    技术分享技术分享

    (2)创建 StudentMapper 接口和 GradeMapper 接口和相应的 XML 文件(使用逆向生成可直接生成)

     StudentMapper.java 接口

    Student selectByPrimaryKey(Integer stuId);//按主键查询一条记录

     StudentMapper.xml

    <mapper namespace="com.bwlu.mapper.StudentMapper" >
     <resultMap id="BaseResultMap" type="com.bwlu.bean.Student" >
     <id column="stu_id" property="stuId" jdbcType="INTEGER" />
     <result column="stu_name" property="stuName" jdbcType="VARCHAR" />
     <result column="stu_age" property="stuAge" jdbcType="INTEGER" />
     <result column="stu_gender" property="stuGender" jdbcType="INTEGER" />
     <result column="g_id" property="gId" jdbcType="INTEGER" />
     </resultMap>
     <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
     select stu_id, stu_name, stu_age, stu_gender, g_id from student 
     where stu_id = #{stuId,jdbcType=INTEGER}
     </select>
    </mapper>

     GradeMapper.java

    Grade selectByPrimaryKey(Integer gId);//按主键查询一条记录

     GradeMapper.xml

    <mapper namespace="com.bwlu.mapper.GradeMapper" >
     <resultMap id="BaseResultMap" type="com.bwlu.bean.Grade" >
     <id column="g_id" property="gId" jdbcType="INTEGER" />
     <result column="g_name" property="gName" jdbcType="VARCHAR" />
     </resultMap>
     <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
     select g_id, g_name from grade
     where g_id = #{gId,jdbcType=INTEGER}
     </select>
    </mapper>

    3、在sql映射文件中写映射sql语句【联合查询:级联属性封装结果集】

    3.1第一种 

    (1)在 Student.java 中将 g_id 属性换成班级类型(Grade),并添加相应的getter和setter方法

    //private Integer g_id;
    private Grade grade;
    public Grade getGrade() {
     return grade;
    }
    public void setGrade(Grade grade) {
     this.grade = grade;
    }

    (2)在 xml 中封装结果集,并编写相应的 sql 语句

    <resultMap id="BaseResultMap" type="com.bwlu.bean.Student" >
     <id column="stu_id" property="stuId" jdbcType="INTEGER" />
     <result column="stu_name" property="stuName" jdbcType="VARCHAR" />
     <result column="stu_age" property="stuAge" jdbcType="INTEGER" />
     <result column="stu_gender" property="stuGender" jdbcType="INTEGER" />
     <result column="g_id" property="grade.gId" jdbcType="INTEGER" />
     <result column="g_name" property="grade.gName" jdbcType="VARCHAR" />
    </resultMap>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
     select stu_id, stu_name, stu_age, stu_gender, g.g_id, g_name
     from student s,grade g
     where s.g_id = g.g_id AND stu_id = #{stuId,jdbcType=INTEGER}
    </select>

    (3)测试

    @Autowired
    private StudentMapper studentMapper;
    @Test
    public void testAssociation() {
     Student student = studentMapper.selectByPrimaryKey(6);
     System.out.println(student);//Student [stuId=6, stuName=lixiang, stuAge=22, stuGender=1, grade=Grade [gId=3, gName=软件(3)班]]
    }

    3.2第二种

    (1)在 Student.java 中将 g_id 属性换成班级类型(Grade),并添加相应的getter和setter方法,同 3.1 的(1)

    (2)使用association来定义关联对象的规则【比较正规的,推荐的方式】

    <resultMap id="BaseResultMap" type="com.bwlu.bean.Student" >
     <id column="stu_id" property="stuId" jdbcType="INTEGER" />
     <result column="stu_name" property="stuName" jdbcType="VARCHAR" />
     <result column="stu_age" property="stuAge" jdbcType="INTEGER" />
     <result column="stu_gender" property="stuGender" jdbcType="INTEGER" />
     <!-- association可以指定联合的javaBean对象
     property="grade":指定哪个属性是联合的对象
     javaType:指定这个属性对象的类型【不能省略】-->
     <association property="grade" javaType="com.bwlu.bean.Grade">
     <id column="g_id" property="gId" jdbcType="INTEGER"/>
     <result column="g_name" property="gName" jdbcType="VARCHAR"/>
     </association>
    </resultMap>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
     select stu_id, stu_name, stu_age, stu_gender, g.g_id, g_name
     from student s,grade g
     where s.g_id = g.g_id AND stu_id = #{stuId,jdbcType=INTEGER}
    </select>

    (3)测试(同 3.1 的(3),结果也一样)

     3.3第三种

    (1)在 Student.java 中将 g_id 属性换成班级类型(Grade),并添加相应的getter和setter方法,同 3.1 的(1)

    (2)使用Association进行分步查询【上述结果相当于使用嵌套结果集的形式】

    <resultMap id="BaseResultMap" type="com.bwlu.bean.Student" >
     <id column="stu_id" property="stuId" jdbcType="INTEGER" />
     <result column="stu_name" property="stuName" jdbcType="VARCHAR" />
     <result column="stu_age" property="stuAge" jdbcType="INTEGER" />
     <result column="stu_gender" property="stuGender" jdbcType="INTEGER" />
     <!-- 使用association进行分步查询 
     1.先按照学生id查询学生信息
     2.根据查询学生信息中g_id值去班级表查出班级信息
     3.将班级信息设置到学生中:
     association定义关联对象的封装规则
     select:表明当前属性是调用指定的方法查出的结果
     column:指定将哪一列的值传给这个方法
     流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性。-->
     <association property="grade" select="getGradeById" column="g_id"></association>
    </resultMap>
    <select id="getGradeById"resultType="com.bwlu.bean.Grade" parameterType="java.lang.Integer" >
     select g_id, g_name from grade 
     where g_id = #{gId,jdbcType=INTEGER}
    </select>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
     select stu_id, stu_name, stu_age, stu_gender, g_id
     from student
     where stu_id = #{stuId,jdbcType=INTEGER}
    </select>

     注:使用 resultType 返回值类型进行接收,必须使用驼峰式命名,使数据库中的字段和实体类中的字段对应。

     (3)测试(同 3.1 的(3),结果也一样)

     (2)中也可以指定为 GradeMapper 下的方法。

    <association property="grade" select="com.bwlu.mapper.GradeMapper.selectByPrimaryKey" column="g_id"></association>

    懒加载机制【按需加载,也叫懒加载】
    在 3.3 分步查询中,每次查询 Student 对象的时候,都将关联 Grade 的对象查询出来了。

    使用延迟加载,可以在需要 班级 信息的时候,再去查询,不需要的时候就不用查询。

    在 MyBatis 的全局配置文件中,加入两个配置

    <settings>
     <!-- 驼峰式命名 -->
     <setting name="mapUnderscoreToCamelCase" value="true"/>
     <!-- 开启懒加载机制 ,默认值为true-->
     <setting name="lazyLoadingEnabled" value="true"/>
     <!-- 开启的话,每个属性都会直接全部加载出来;禁用的话,只会按需加载出来 -->
     <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

    这样,当我们查询 Student 对象的时候,如果只输出学生姓名,就不会执行查询班级信息的 sql 语句,当需要班级信息的时候才会执行。

     

    上述是在多端(学生)查询一端(班级)的信息,用 association,当我们在一端查询多端信息的时候,需要使用 collection,查出的是一个集合

     

    未完

     

    SQL映射文件-----MySQL关系映射【1对1,1对多,多对多】

    标签:color   name   arch   val   tun   返回值   ssm   针对   arc   

    热心网友 时间:2022-05-02 07:47

    映射只能一对一或多对一。

    映射为两个元素的集之间元素相互“对应”的关系,为名词。映射,或者射影,在数学及相关的领域经常等同于函数。 基于此,部分映射就相当于部分函数,而完全映射相当于完全函数。

    映射的不同分类是根据映射的结果进行的,从下面的三个角度进行:

    1、根据结果的几何性质分类:满射(到上)与非满射(内的)

    2、根据结果的分析性质分类:单射(一一的)与非单射

    3、同时考虑几何与分析性质:满的单射(一一对应)。

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 做梦梦到了蛇,它在门外,我很害怕,但是他没伤害我,会有什么事情发生吗? 梦见一条大蛇,特别特别的大,只是感到害怕.但蛇也没伤害自己.有何寓意呢 梦到蛇,我很怕,跑哪儿都有蛇,但是它好像没有伤害我。 为什么我从小老是梦见蛇呢?而且是最怕蛇。但是梦里它从来没有伤害过我? 我梦到蛇了,蛇出来还吓我一跳,但是没有伤害我,是怎么回事? 请问大家有哪些好的养生之道 大寒养生运动有哪些建议 为什么复制的图片在淘宝上打不开 网速很快 但是淘宝描述里面图片打不开 淘宝打开也很慢 淘宝网 部分图片无法显示 怎么刷新都没用 怎么回事 淘宝网面上我的上传图片打不开显示网络保护是什么原因 为什么我打开淘宝网页会出现网页上有错误,然后图都打不开? 小米手机用英语怎么说 淘宝网页图片都打不开。。。 小米2s手机下载的uc浏览器可以自动翻译网页吗? 淘宝网中的支付宝图片打不开 为什么我的淘宝网页打不开图片??? 淘宝等网页大部分图片打不开 淘宝网的图片打不开 雷霆精英怎样免费领取皮肤 老是梦见同样的蛇,又没有伤害我,但就是莫名的害怕。别的类型的蛇又不会怕。 电脑里的某部分文字都显示不了,全是框框。是哪里出了问题? 电脑怎么了,有些字体无法显示出来 放开那三国2甘宁属性分析 我家电脑很多字体显示不出来怎么办 放开那三国2吴国阵营前期推荐武将搭配详解 最美的风景在路上 “最好的风景在路上”的下一句是什么? 放开那三国2吴国前期哪些武将值得培养 广西哪所高校有心理咨询专业 电脑软件有些字体不显示 放开那三国2手游甘宁怎么样? T-ROC探歌——这是我们共同的爱好,是我们爱情路上最美的经历 和爱车缤越一起出发,最美的风景在路上 电脑上有些字显示不出来。全是小方框....十万火急。。。。。。 放开那三国2吴国阵容推荐 吴国选什么阵容 广西南宁哪个大学、学院学比较好的心理学?广西有哪所比较好的学心理学的学院或大学? 广西有哪个学校开设心理学专业(本科) 为什么我的电脑有些窗口字体较大,且内容显示不全 放开那三国2吴国阵容搭配技巧详解