精华内容
下载资源
问答
  • 以顾客()和订单(多)为例: 1.创建个web项目,名字叫做oneToMany 2.导入mybatis所需包mybatis-3.4.1.jar(以自己版本为准) 3.配置myBatis配置文件: 4.创建Customer类和...

    以顾客(一)和订单(多)为例:

    1.创建一个web项目,名字叫做oneToMany


    2.导入mybatis所需的包mybatis-3.4.1.jar(以自己的版本为准)

    3.配置myBatis的配置文件:





    4.创建Customer类和Order类





    5.创建customer.xml文件和order.xml文件




    展开全文
  • Hibernate的关系映射-------多对一一对多的实现举例 此处以部门(Department)与部门员工(Employee)为例,显而易见department为一的一方,员工为多的一方。   Domain层的创建:   Department类的实例化:...

    Hibernate的关系映射-------多对一与一对多的实现举例

    此处以部门(Department)与部门员工(Employee)为例,显而易见department为一的一方,员工为多的一方。

     

    Domain层的创建:

     

    Department类的实例化:

    public class Department {

        private Integer id;

        private String name;

         privateSet<Employee> emps;

         

        publicSet<Employee> getEmps() {

           return emps;

        }

        public voidsetEmps(Set<Employee> emps) {

           this.e配置文件的编写代码:

    <!DOCTYPE hibernate-configuration PUBLIC

        "-//Hibernate/HibernateConfiguration DTD 3.0//EN"

        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

     

    <hibernate-configuration>

        <session-factory name="foo">

           <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

           <property name="connection.url">jdbc:mysql:///demo</property>

           <property name="hibernate.connection.username">root</property>

           <property name="connection.password">123</property>

           <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

           <property name="hibernate.hbm2ddl.auto">update</property>

           <property name="hibernate.show_sql">true</property>

          

           <mapping resource="com/hbsi/domain/Department.hbm.xml"/>

           <mapping resource="com/hbsi/domain/Employee.hbm.xml"/>  </session-factory>

    </hibernate-configuration>

    各个包的导入:

    mps = emps;

        }

        public Integer getId() {

           return id;

        }

        public void setId(Integer id) {

           this.id = id;

        }

        public String getName() {

           return name;

        }

        public void setName(Stringname) {

           this.name = name;

        }

       

    }

         Department映射文件的创建:

           <?xml version="1.0"?>

    <!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

     

    <hibernate-mapping package="com.hbsi.domain">

     

        <class name="Department" table="department">

           <id name="id">

               <generator class="native"/>

           </id>

           <property name="name"/>

           <set name="emps">

               <key column="depart_id"/><!-- 查找部门下所包含的员工,根据主外键查 -->

               <one-to-many class="Employee"/>   

           </set>

        </class>

    </hibernate-mapping>

    Employee的实例化:

    public class Employee {

        private Integer id;

        private String name;

        private Department depart;

       

        public Integer getId() {

           return id;

        }

        public void setId(Integer id) {

           this.id = id;

        }

        public String getName() {

           return name;

        }

        public void setName(Stringname) {

           this.name = name;

        }

        public DepartmentgetDepart() {

           return depart;

        }

        public voidsetDepart(Department depart) {

           this.depart = depart;

        }

       

    }

    Employee映射文件的创建:

                  <?xml version="1.0"?>

    <!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

     

    <hibernate-mapping package="com.hbsi.domain">

     

        <class name="Employee" table="employee">

           <id name="id">

               <generator class="native"/>

           </id>

           <property name="name"/>

           <many-to-one name="depart"column="depart_id"/>    此处多对一的列必须要与上面set标签中key中coulmn中的相同

        </class>

    </hibernate-mapping>

    配置文件的编写代码:

    <!DOCTYPE hibernate-configuration PUBLIC

        "-//Hibernate/HibernateConfiguration DTD 3.0//EN"

        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

     

    <hibernate-configuration>

        <session-factory name="foo">

           <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

           <property name="connection.url">jdbc:mysql:///demo</property>

           <property name="hibernate.connection.username">root</property>

           <property name="connection.password">123</property>

           <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

           <property name="hibernate.hbm2ddl.auto">update</property>

           <property name="hibernate.show_sql">true</property>

          

           <mapping resource="com/hbsi/domain/Department.hbm.xml"/>

           <mapping resource="com/hbsi/domain/Employee.hbm.xml"/>  </session-factory>

    </hibernate-configuration>

    各个包的导入:

     

    获取Session的工具类Util的编写:

    public final class HibernateUtil {

        private static SessionFactory sessionFactory;

        private HibernateUtil(){

          

        }

        static{

           Configuration cfg=new Configuration();

           cfg.configure();

           sessionFactory=cfg.buildSessionFactory();

        }

        public static SessionFactory getSessionFactory() {

           return sessionFactory;

        }

        public static Session getSession(){

           return sessionFactory.openSession();

        }

       

    }

     

    此处以插入方法实现一对多的测试类的编写:

     

           //插入方法的实现

        static Department add(){

           Session session=null;

           Transaction tx=null;

           try{

               session=HibernateUtil.getSession();

               tx=session.beginTransaction();

               //添加

               Department dep=new Department();

               dep.setName("departone");

              

               Employee e1=new Employee();

               e1.setName("Tom");

               e1.setDepart(dep);//指定员工在哪个部门-----对象模型,对象建立关联关系          

              

               session.save(dep);

               session.save(e1);

              

               tx.commit();

              

               return dep;

           }finally{

               if(session!=null){

                  session.close();

               }

           }

          

        }

     

     

    主函数的调用:

        public static void main(String[] args) {

           // TODO Auto-generatedmethod stub

           add();

        }

     

    然后以查找的形式实现的多对一测试类的编写:

       static Employee query(int empId){

           Session session=null;

           try{

               session=HibernateUtil.getSession();

               //查询的操作

               Employee e=(Employee) session.get(Employee.class,empId);

               System.out.println(e.getName()+" "+e.getDepart().getName());

               return e;

           }finally{

               if(session!=null){

                  session.close();

               }

           }

        }

    主函数的调用:

           public static void main(String[] args){

           query(1);

        }

    展开全文
  • association通常用来映射一对一的关系,例如,有个类User,对应的实体类如下:(getter,setter方法省略) public class User { /** * 主键 */ private String id; /** * 用户姓名 */ private String user

    本文目录

    一、association 标签(一对一)

    二、collection 标签(一对多)


    一、association 标签(一对一)

    association通常用来映射一对一的关系,例如,有个类User,对应的实体类如下:(getter,setter方法省略)

    @Data
    public class User {
        /**
         * 主键
         */
        private String id;
        /**
         * 用户姓名
         */
        private String userName;
    }

    有个类Article,对应的实体类如下:

    @Data
    public class Article {
        /**
         * 主键
         */
        private String id;
        /**
         * 文章标题
         */
        private String articleTitle;
        /**
         * 文章内容
         */
        private String articleContent;
    }

    如果我想查询一个用户的时候,也查到他写的一篇文章,那么怎样写呢?其实可以在类User中加入一个属性Article类:

    @Data
    public class User {
        /**
         * 主键
         */
        private String id;
        /**
         * 用户姓名
         */
        private String userName;
        /**
         * 类Article
         */
        private Article article;
    }

    mapper.xml 我在user类的UserMapper.xml这样配置

    <mapper namespace="com.uiot.practice.mysqltest.dao.UserMapper">
    	<resultMap type="com.uiot.practice.mysqltest.entity.Article" id="articleMap">
    		<id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
    		<result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/>
    		<!--这里把user的id传过去,com.uiot.practice.mysqltest为命名空间-->
    		<association property="article" column="id" select="com.uiot.practice.mysqltest.selectArticleByUserId" />
    	</resultMap>
    </mapper>

    同时,我的article对应的ArticleMapper.xml这样写:

    <mapper namespace="com.uiot.practice.mysqltest.dao.ArticleMapper">
        <resultMap type="com.uiot.practice.mysqltest.entity.Article" id="ArticleResultMap">
            <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
            <result column="articleTitle" property="articleTitle" jdbcType="VARCHAR" javaType="java.lang.String"/>
            <result column="articleContent" property="articleContent" jdbcType="VARCHAR" javaType="java.lang.String"/>
        </resultMap>
    
        <select id="selectArticleByUserId" parameterType="java.lang.String" resultMap="ArticleResultMap">
            select * from tb_article where userId=#{userId}
        </select>
    </mapper>

    二、collection 标签(一对多)

    一对多,collection,理解了一对一,一对多容易理解

    @Data
    public class User {
        /**
         * 主键
         */
        private String id;
        /**
         * 用户姓名
         */
        private String userName;
        /**
         * 类Article
         */
        private List<Article> articleList;
    }

    UserMapper.xml这样配置

    <mapper namespace="com.uiot.practice.mysqltest.dao.UserMapper">
    	<resultMap type="com.uiot.practice.mysqltest.entity.User" id="articleMap">
    		<id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
    		<result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/>
    		<!--这里把user的id传过去,com.uiot.practice.mysqltest为命名空间-->
    		<collection property="articleList" column="id" select="com.uiot.practice.mysqltest.selectArticleByUserId"/>
    	</resultMap>
    	<!--以下省略,类同,Mybatis会把结果封装成List类型。-->
    </mapper>

     

    完结!

    展开全文
  • 1 什么是一对一、一对多映射... 订单对用户是一对一关系 一对多 : 一个用户可以拥有多个订单 ==> 用户对订单是一对多关系 注意:在MyBatis中,如果要完成多对多关系,其实就是两个一对多映射! 接下来先讲解MyBa...

    原文链接:http://www.yiidian.com/mybatis/one-to-one.html

    1 什么是一对一、一对多映射?

    以用户和订单举例,

    一对一 : 一个订单只属于一个用户 ==> 订单对用户是一对一关系

    一对多 : 一个用户可以拥有多个订单 ==> 用户对订单是一对多关系

    注意:在MyBatis中,如果要完成多对多关系,其实就是两个一对多映射!

    接下来先讲解MyBatis的一对一映射如何实现。

    2 建立表结构

    2.1 创建用户表

    CREATE TABLE `t_user` (
       `id` int(11) DEFAULT NULL,
       `username` varchar(50) DEFAULT NULL,
       `password` varchar(50) DEFAULT NULL
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    2.2 创建订单表

    CREATE TABLE `t_order` (
       `id` int(11) DEFAULT NULL,
       `orderno` varchar(100) DEFAULT NULL,
       `amount` double DEFAULT NULL,
       `user_id` int(11) DEFAULT NULL
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    2.3 插入测试数据

    file

    file

    3 设计Pojo实体,建立关系

    3.1 用户实体类

    package com.yiidian.domain;
    
    import java.util.List;
    
    /**
     * 用户实体
     * 一点教程网 - www.yiidian.com
     */
    public class User {
        private Integer id;
        private String username;
    
        public void setOrders(List<Order> orders) {
            this.orders = orders;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }

    3.2 订单实体类

    package com.yiidian.domain;
    
    /**
     * 订单实体
     * 一点教程网 - www.yiidian.com
     */
    public class Order {
        private Integer id;
        private String orderno;
        private Double amount;
        private User user;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getOrderno() {
            return orderno;
        }
    
        public void setOrderno(String orderno) {
            this.orderno = orderno;
        }
    
        public Double getAmount() {
            return amount;
        }
    
        public void setAmount(Double amount) {
            this.amount = amount;
        }
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    }

    Order实体类,通过user属性建立跟User实体的关系。注意,这里是一个User。

    4 编写Dao接口

    4.1 UserDao接口

    package com.yiidian.dao;
    
    import com.yiidian.domain.User;
    
    import java.util.List;
    
    /**
     * 用户Dao接口
     * 一点教程网 - www.yiidian.com
     */
    public interface UserDao {
    
    }

    4.2 OrderDao接口

    package com.yiidian.dao;
    import com.yiidian.domain.Order;
    import com.yiidian.domain.User;
    import java.util.List;
    
    /**
     * 订单Dao接口
     * 一点教程网 - www.yiidian.com
     */
    public interface OrderDao {
        /**
         * 查询所有订单
         */
        public List<Order> findAllOrders();
    }

    5 编写Dao映射配置

    5.1 UserDao.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--
       namespace: 用于指定该映射文件需要映射的Dao接口
    -->
    <mapper namespace="com.yiidian.dao.UserDao">
    
    </mapper>

    5.2 OrderDao.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--
       namespace: 用于指定该映射文件需要映射的Dao接口
    -->
    <mapper namespace="com.yiidian.dao.OrderDao">
    
        <!--一对一映射-->
        <resultMap id="OrderResultMap" type="com.yiidian.domain.Order">
            <id property="id" column="oid"/>
            <result property="orderno" column="orderno"/>
            <result property="amount" column="amount"/>
            <!--关联查询订单所属的用户-->
            <association property="user" column="id" javaType="com.yiidian.domain.User">
                <id property="id" column="id"/>
                <result property="username" column="username"/>
                <result property="password" column="password"/>
            </association>
        </resultMap>
    
        <select id="findAllOrders" resultMap="OrderResultMap">
            SELECT
              o.id oid,
              o.orderno orderno,
              o.amount amount,
              u.*
            FROM t_order o
              LEFT JOIN t_user u
                ON o.user_id = u.id
        </select>
    </mapper>
    • association:用在一对一关联映射
    • property:对应Order类的user属性
    • column:对应外键字段名称
    • javaType:User类的全限定名称

    6 编写测试类

    package com.yiidian.mybatis;
    
    import com.yiidian.dao.OrderDao;
    import com.yiidian.domain.Order;
    import com.yiidian.utils.MyBatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * MyBatis测试类 - 一对一映射
     * 一点教程网 - www.yiidian.com
     */
    public class TestOne2One {
    
        /**
         * 测试一对一映射
         */
        @Test
        public void testOrderDao(){
            //1.获取SqlSession对象
            SqlSession sqlSession = MyBatisUtils.getSession();
    
            //2.创建Mapper代理对象
            OrderDao orderDao = sqlSession.getMapper(OrderDao.class);
    
            //3.调用方法
            List<Order> list = orderDao.findAllOrders();
            System.out.println(list);
            //4.关闭连接
            sqlSession.close();
        }
    
    }

    7 运行测试类

    以debug模式启动测试类,查看list变量的情况,可以看到Order对象中成功封装了User对象的数据!

    file

    file

    源码下载:https://pan.baidu.com/s/1jZrfapjqB_VHI_GLgKPo4g

    file

    欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。 如果您对我的系列教程感兴趣,也可以关注我的网站:yiidian.com

    展开全文
  • 比如department和employee是一对关系的,我在department那边设置了mappedby,最后测试结果只是不会生成第三张多余表,其他没感觉什么,网上都说让多这一段作为关系维护端,可是设置了mappedby后我还是可以在...
  • 一对多关系和多对多关系的实现 先来实现一对多关系 什么是一对多关系呢? 一对多是关系型数据中两个表之间的一种关系,该关系中第一...帖子与用户之间的关系 现有两张表,帖子表(tab_topic),用户表(tab_user)...
  • hibernate一对一关系

    2019-07-09 16:38:57
    hibernate对象与对象的关系 1.一对一关系 在实体类(表)之间建议对应关系 (举例人与身份证) ... //建立与Card表之间的联系,因为是一对一的关系所以cid是该表的外键 private Card c; //要调用...
  • 二、一对一单向关系举例(annotation 方式)。 例如:husband和wife两个表,都有id和name字段。 在数据库设计上,应为:wife作为主表,husband作为子表,husband表中需要加入wife表wifeid字段。 在类设计上,
  • 一对一的关系就如球队与球队所在地址的关系,一支球队只有一个地址,一个地址对应一个球队。 3、多对多关系 常见的是学校中班级与老师之间的关系,一个班级有多个老师上课,而每个老师又给多个班级上...
  • 今天自学hibernate的映射关系,在学习的时候发现讲课的(视频中的老师)时候老师举例是使用person人,以及card身份证,二者应该是一对一的关系,但是在视频的讲解中老师·却在一个(此处是card.hbm.xml)配置文件中...
  • mybatis多对一的级联,这里举例班级和学生的例子,一个班级有多个学生,属于一对多的关系,一个学生只属于一个班级,属于多对一的关系。 建立数据库文件CREATE TABLE f_class( c_id INT PRIMARY KEY AUTO_INCREMENT...
  • 双向一对一的关联关系 举例说明:经理Manager和部门Department是双向一对一关联关系。则Manager实体类中有Department实体对象的引用,反之亦然。 其实体属性定义如下: List_1. Manager实体类属性定义(有对...
  • 进程和程序之间可以形成一对一,一对多,多对一,多对多的关系,分别举例说明在什么情况下会形成这样的关系? 进程的定义 从不同的角度进程可以有不同的定义,比较典型的定义有: (1)进程是程序的一次执行过程。 ...
  • 目录序导语正文(1)一对一(2)一对多(3)多对多附 序 三种对象关系映射ObjectRelationshipMapping JDBC(数据库操作) student t_student studentId t_id Mybatis(半自动ORM) Teacher XML/@ ...
  • 有两张表,其中一张是学生表(student),另一张是各科成绩表(grade),各表包含字段如下: student学生信息表 ----------------------------------------------------- id varchar 学生编号 name varchar...
  • 一对多: 举例:一门课程会有多个学生学(虽然多个可能会有多门课程,但这里就当只有一门课程,或者一个省会有多个城市) 然后要在实体类中体现出来还有在实体类对应映射文件中也要映射出来 course实体类 ...
  • 1.一对多的映射关系的建立 ...首先来讲,表与表之间可以存在一对一,一对多,多对多的关系,其中1~N, M~N关系的举例说明可以用如下的图进行表示: 图示的这两种关系并不难理解,而如何在Hiberna...
  • 如何通过powerdesigner的设计,让多的关系,在数据生成对应的表结构。 举例,有个class表,个student表,和 个class_student关系: 在cdm中建好class和student。然后通过Relationship关联,点击...
  • 数据表之间关联关系分为三种:一对一、一对多、多对多。下面就逐一介绍下: 1. 一对一 Ø 一对一是将数据表“垂直切分”,其实是不常见,或不常用。也就是 A 表一条记录对应 B 表一条记录,为什么要这样...
  • 一对多就是主键与外键的关系,通过一个用户表,角色表进行举例子 角色表role:有外键,对应的是user表的主键 用户表users: from flask import Flask, render_template from flask_sqlalchemy import ...
  • 一对关系 举例:部门和员工对应关系 : 1. 正过来看,(“1”)一个部门里面可以有多个员工(“n”) 2. 反过来看一一对应:而一个员工只能对应一个部门 由于满足上面两条, 所以一对关系成立, 部门是1 员工是n 策略...
  • 今天在学习hibernate知识,在这里就扯点其他,原来经常使用orm框架是mybatis,...但是很多示意图和知识点还是比较经典和值得收藏,最近两天我会将我学习和总结hibernate,写成博文然后发布,想要学习hibern
  • Hibernate一对关系

    2019-07-09 17:25:09
    hibernate 一对关系 2.一对多(举例省份province与城市City) public class Province { private Integer pid; private String pname; //添加省份下多个城市集合 对于省份来讲城市属于可以有多个 private ...
  • 前面两篇博文里记录了Hibernate级联操作的一对多关联关系和一对多双向自身关联关系,这一篇记录的是一对一关联关系,例如一个人对应一张身份证,一对一的关系又可以分为共用主键的方式和一对多的特殊情况(使用外键...
  • 在双向多对一关联关系中如果由两端维护关联的关系会出问题。 举例: Clazz 为一端,Student为多端。多端的inverse 属性值为“false”, 也就是说此时关联关系由两端维护。那么在保存的时候,就会出现一个问题:多...
  • 顾客和联系人的关系 一个顾客可以联系多个联系人 一对多 反过来就是多对一 顾客的实体类 package cn.ycsj.domain; import java.util.HashSet; import java.util.Set; public class Customer { /* * CREATE...
  • 背景:我们在项目中经常会用到多的关系,然后我们需要通过webapi或者service取其中个的记录,这时一般的方法很难做到,我们可以通过构建fetchxml来实现这个过程。 举例: 此例中,有个市场实体和客户是多...
  • json序列化对象中存在...使用@JsonBackReference标记在有多对一或者多对多关系的属性上即可解决这个问题,举例: @JsonBackReference @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "market_id") privat
  • Mybatis多对一关系的映射与数据获取 在之前数据获取时,所针对都是对一张表操作。所映射结果也都直接是通过resultType属性映射到一个规定实体类里。但是针对同时对多个表进行级联查询。则需要进行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,601
精华内容 640
关键字:

一对一的关系举例