MyBatis 学习(五) 一对一映射 一对多映射

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36533951/article/details/79175969

案例使用两张表

一张user用户表
这里写图片描述
这里写图片描述

映射关系分析
首先,站在订单的角度考虑:
一张订单对应一个用户,这是一对一
然后,站在用户的角度考虑:
一个用户可以有多个订单,这是一对多

那么SQL语句该如何写?
还记得外联接吗,left/right join
以某张表为主,取出里面所有记录,然后每条记录与另外一张表进行连接
不管能不能匹配上条件,最终都会保留;能匹配,正确保留,不匹配,其他表的字段都置空
也就是说,以哪张表为主,哪张表的记录保留的最完整,另外一张是残缺的,因为有些字段没能和主表匹配上

一对一

以订单为主所以sql语句如下

       select o.* ,
         u.username
         from orders as o left join user as u
         on o.user_id = u.id

下面放案例源码:

写两个bean
user 、orders
在一对一中,为表示两者关系,在orders中存一个user变量 表示一对一
user

public class User {

    private int id ;
    private String username ;
    private Date birthday ;
    private String sex ;
    private String address ;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address="
                + address + "]";
    }
}

orders

public class Orders {

    private int id ;
    private int user_id ;
    private Integer number ;
    private Date createtime ;
    private String note ;
    private User user ;


    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getUser_id() {
        return user_id;
    }
    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }
    public Integer getNumber() {
        return number;
    }
    public void setNumber(Integer number) {
        this.number = number;
    }
    public Date getCreatetime() {
        return createtime;
    }
    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }
    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }
    @Override
    public String toString() {
        return "Orders [id=" + id + ", user_id=" + user_id + ", number=" + number + ", createtime=" + createtime
                + ", note=" + note + "]";
    }
}

MyBatis总配置文件
SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

   <!-- 别名 -->
   <typeAliases>
         <package name="cn.itcast.bean"/>
   </typeAliases>

   <!-- 环境配置 -->
   <environments default="development">
      <environment id="development">
         <!-- 使用jdbc事务管理 -->
         <transactionManager type="JDBC" />
         <!-- 数据库连接池 -->
         <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver" />
            <property name="url"
               value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
            <property name="username" value="root" />
            <property name="password" value="root" />
         </dataSource>
      </environment>
   </environments>

   <!-- 映射 -->
   <mappers>
      <package name="cn/itcast/dao"/>
   </mappers>

</configuration>

由于我们以订单表为主,所以为订单生产代理接口
放回List 订单不止一个所以用list

public interface OrdersDao {

//    一对一   一份订单对应一个用户
    List <Orders> findOrders () ;

}

Mapper.xml
使用resultMap完成映射关系

<?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">
<mapper namespace="cn.itcast.dao.OrdersDao">

   <resultMap type="orders" id="o">
      <!-- 在一对一或一对多查询中,resultMap的自动设值容易失效,所以最好手动设值 -->
      <id column="id" property="id"/>
      <result column="user_id" property="user_id"/>
      <result column="number" property="number"/>
      <result column="createtime" property="createtime"/>

      <!-- 一对一   javaType表示存储类型  一定要写否则报错-->
      <association property="user" javaType="user">
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
      </association>
   </resultMap>

   <select id="findOrders"  resultMap="o">
         select o.* ,
         u.username
         from orders as o left join user as u
         on o.user_id = u.id
   </select>
</mapper>

test

/**
 *
 */
package cn.itcast.bean;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import cn.itcast.dao.OrdersDao;

/**
 * @author Administrator
 *
 */
public class Demo {

    @Test
    public void one2one () throws IOException
    {
      String resource = "SqlMapConfig.xml" ;
      InputStream in = Resources.getResourceAsStream(resource) ;

      SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in) ;

      SqlSession ss =  ssf.openSession() ;

      OrdersDao od = ss.getMapper(OrdersDao.class) ;

       List <Orders> o = od.findOrders() ;

      for ( Orders or : o ){
          System.out.println(or);
          if (or.getUser()!=null)
          {
              System.out.println("    " + or.getUser());
          }
          System.out.println();
      }

    }
}


结果
Orders [id=3, user_id=1, number=1000010, createtime=Wed Feb 04 13:22:35 CST 2015, note=null]
   User [id=1, username=王五, birthday=null, sex=null, address=null]

Orders [id=4, user_id=1, number=1000011, createtime=Tue Feb 03 13:22:41 CST 2015, note=null]
   User [id=1, username=王五, birthday=null, sex=null, address=null]

Orders [id=5, user_id=10, number=1000012, createtime=Thu Feb 12 16:13:23 CST 2015, note=null]
   User [id=10, username=张三, birthday=null, sex=null, address=null]

Orders [id=6, user_id=30, number=44444, createtime=Fri Jan 26 18:07:52 CST 2018, note=null]
   User [id=30, username=哈哈, birthday=null, sex=null, address=null]

一对多

   select
      o.id ,
      o.user_id ,
      o.number ,
      o.createtime,
      u.username
         from  user as u  inner join  orders as o
         on o.user_id = u.id

一个用户可以有多个订单
在userbean中加上一个list集合存放orders,生成getset方法

   private List<Orders> list ;


   public List<Orders> getList() {
      return list;
   }
   public void setList(List<Orders> list) {
      this.list = list;
   }

这次是以user表为主,我们为user表生成代理接口
返回list 一个user代表一个用户一个用户里面包含多个订单 ,用户不止一个,所以用list

/**
 *
 */
package cn.itcast.dao;

import java.util.List;

import cn.itcast.bean.User;

/**
 * @author Administrator
 *
 */
public interface UserDao {

    List <User> findUser() ;
}

mapper.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">
<mapper namespace="cn.itcast.dao.UserDao">

   <resultMap type="user" id="u">
      <!-- 在一对一或一对多查询中,resultMap的自动设值容易失效,所以最好手动设值 -->
      <id column="user_id" property="id"/>
      <result column="username" property="username"/>

      <!-- 一对多   javaType表示存储类型  一定要写否则报错 ofType 里面存放集合的泛型类型-->
      <collection property="list" javaType="List" ofType="orders">
         <id column="id" property="id"/>
         <result column="user_id" property="user_id"/>
         <result column="number" property="number"/>
         <result column="createtime" property="createtime"/>
      </collection>
   </resultMap>

   <select id="findUser"  resultMap="u">
         select
      o.id ,
      o.user_id ,
      o.number ,
      o.createtime,
      u.username
         from  user as u  inner join  orders as o
         on o.user_id = u.id
   </select>
</mapper>

test

@Test
   public void one2many () throws IOException
   {
     String resource = "SqlMapConfig.xml" ;
      InputStream in = Resources.getResourceAsStream(resource) ;

      SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in) ;

      SqlSession ss =  ssf.openSession() ;

      UserDao ud = ss.getMapper(UserDao.class) ;

      List <User> list = ud.findUser() ;

      for ( User u : list )
      {
        System.out.println(u);
        List<Orders> or = u.getList() ;
        for ( Orders o : or )
        {
           System.out.println(" " +o);
        }
      }
   }

结果
User [id=1, username=王五, birthday=null, sex=null, address=null]
 Orders [id=3, user_id=1, number=1000010, createtime=Wed Feb 04 13:22:35 CST 2015, note=null]
 Orders [id=4, user_id=1, number=1000011, createtime=Tue Feb 03 13:22:41 CST 2015, note=null]
User [id=10, username=张三, birthday=null, sex=null, address=null]
 Orders [id=5, user_id=10, number=1000012, createtime=Thu Feb 12 16:13:23 CST 2015, note=null]
User [id=30, username=哈哈, birthday=null, sex=null, address=null]
 Orders [id=6, user_id=30, number=44444, createtime=Fri Jan 26 18:07:52 CST 2018, note=null]

猜你喜欢

转载自blog.csdn.net/qq_36533951/article/details/79175969