mybatis学习使用3关联映射

mybatis关联映射

 1.1mybatis中使用一对一映射

  在每个公司中,公司里面的员工和员工编号属于一对一关系,用mybatis实现如下:

  Card.java

  

package com.rookie.bigdata.domain;

import lombok.Data;

import java.io.Serializable;

/**
 * @author
 * @date 2018/10/21
 */
@Data
public class Card implements Serializable {
    private Integer id;
    private String code;
}
View Code
Staff.java
package com.rookie.bigdata.domain;

import lombok.Data;

import java.io.Serializable;

/**
 * @author
 * @date 2018/10/21
 */
@Data
public class Staff implements Serializable {
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    //职工和公司卡是一一对应的
    private Card card;
}
View Code

  StaffMapper.java

package com.rookie.bigdata.mapper;

import com.rookie.bigdata.domain.Staff;

import java.util.List;

/**
 * @author
 * @date 2018/10/21
 */
public interface StaffMapper {

    //一对一映射查询
    Staff selectStaffById(Integer id);


}

 mybatis-config.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">
  <!--  XML 配置文件包含对 MyBatis 系统的核心设置 -->
<configuration>

<!--    <typeAliases>
        <typeAlias  alias="user" type="com.rookie.bigdata.domain.User"/>
    </typeAliases>-->
    <environments default="mysql">
    <!-- 环境配置,即连接的数据库。 -->
    <environment id="mysql">
    <!--  指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
      <transactionManager type="JDBC"/>
      <!--  dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <!-- mappers告诉了MyBatis去哪里找持久化类的映射文件 -->
  <mappers>
    <mapper resource="mapper/StaffMapper.xml"/>
  </mappers>
</configuration>

  StaffMapper.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="com.rookie.bigdata.mapper.StaffMapper">


    <select id="selectStaffById" parameterType="int"
            resultMap="staffMapper">
        SELECT * from bs_staff where id = #{id}
    </select>


    <select id="selectCardById" parameterType="int" resultType="com.rookie.bigdata.domain.Card">
        SELECT * from bs_card where id = #{id}
    </select>


    <resultMap type="com.rookie.bigdata.domain.Staff" id="staffMapper">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <result property="age" column="age"/>
        <!-- 一对一关联映射:association   -->
        <association property="card" column="card_id"
                     select="com.rookie.bigdata.mapper.StaffMapper.selectCardById"
                     javaType="com.rookie.bigdata.domain.Card"/>
    </resultMap>

</mapper>

  测试代码StaffMapperTest.java

  

package com.rookie.bigdata.mapper;

import com.rookie.bigdata.domain.Staff;
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.Before;
import org.junit.Test;

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

import static org.junit.Assert.*;

/**
 * @author
 * @date 2018/10/21
 */
public class StaffMapperTest {

    public SqlSession session;

    @Before
    public void before() throws IOException {
        // 读取mybatis-config.xml文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        // 初始化mybatis,创建SqlSessionFactory类的实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
        // 创建Session实例
        session = sqlSessionFactory.openSession();
    }
    @Test
    public void selectStaffById() throws Exception {

        StaffMapper mapper = session.getMapper(StaffMapper.class);
       Staff staff = mapper.selectStaffById(1);
        System.out.println(staff);
    }

}

 1.2mybatis中的一对多或者多对一可以参考最初的简单的应用实例

  1.3mybatis中的多对多关系映射

  例如在一个购物系统中,实际会存在如下的情况,即订单和商品是存在多对多的关系,如下代码

  表结构的sql语句如下:

  

CREATE TABLE bs_user(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(18),
loginname VARCHAR(18),
PASSWORD VARCHAR(18),
phone VARCHAR(18),
address VARCHAR(18)
);

INSERT INTO bs_user(username,loginname,PASSWORD,phone,address)
VALUES('zhangsan','zhangsan','123456','12345678912','上海');


CREATE TABLE bs_goods(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18),
price DOUBLE,
remark VARCHAR(18)
);

INSERT INTO bs_goods(NAME,price,remark)
VALUES('T恤',108.9,'2018经典款');
INSERT INTO bs_goods(NAME,price,remark)
VALUES('牛仔裤',99.9,'2018经典款');
INSERT INTO bs_goods(NAME,price,remark)
VALUES('连衣裙',89.9,'2018经典款');
INSERT INTO bs_goods(NAME,price,remark)
VALUES('上衣外套',69.9,'海贼王图案');

CREATE TABLE bs_order(
id INT PRIMARY KEY AUTO_INCREMENT,
CODE VARCHAR(32),
total DOUBLE,
user_id INT,
FOREIGN KEY (user_id) REFERENCES bs_user(id)
);

INSERT INTO bs_order(CODE,total,user_id)
VALUES('6aa3fa359ff14619b77fab5990940a2d',388.6,1);

INSERT INTO bs_order(CODE,total,user_id)
VALUES('6aa3fa359ff14619b77fab5990940b3c',217.8,1);

CREATE TABLE bs_item(
order_id INT,
good_id INT,
amount INT,
PRIMARY KEY(order_id,good_id),
FOREIGN KEY (order_id) REFERENCES bs_order(id),
FOREIGN KEY (good_id) REFERENCES bs_goods(id)
);

INSERT INTO bs_item(order_id,good_id,amount)
VALUES(1,1,1);
INSERT INTO bs_item(order_id,good_id,amount)
VALUES(1,2,1);
INSERT INTO bs_item(order_id,good_id,amount)
VALUES(1,3,2);

INSERT INTO bs_item(order_id,good_id,amount)
VALUES(2,4,2);
INSERT INTO bs_item(order_id,good_id,amount)
VALUES(2,1,1);

实体类代码如下

package com.rookie.bigdata.domain;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @author
 * @date 2018/10/21
 */
@Data
public class Good implements Serializable {
    private Integer id;        // 商品id,主键
    private String name;    // 商品名称
    private Double price;    // 商品价格
    private String remark;    // 商品描述

    //商品和订单属于多对多关系
    private List<Order> orders;
}


package com.rookie.bigdata.domain;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @author
 * @date 2018/10/21
 */
@Data
public class Order implements Serializable {

    private Integer id;  // 订单id,主键
    private String code;  // 订单编号
    private Double total; // 订单总金额

    private User user;

    private List<Good> goods;
}

package com.rookie.bigdata.domain;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @author
 * @date 2018/10/21
 */
@Data
public class User implements Serializable {
    private Integer id;  // 用户id,主键
    private String username;  // 用户名
    private String loginname; // 登录名
    private String password;  // 密码
    private String phone;    // 联系电话
    private String address;  // 收货地址

    //用户和订单属于一对多关系
    private List<Order> orders;

}
View Code

 mapper类如下:

package com.rookie.bigdata.mapper;

import com.rookie.bigdata.domain.Order;

/**
 * @author
 * @date 2018/10/21
 */
public interface OrderMapper {


    Order selectOrderById(int id);

}


package com.rookie.bigdata.mapper;

import com.rookie.bigdata.domain.User;

/**
 * @author
 * @date 2018/10/21
 */
public interface UserMapper {

    User selectUserById(int id);
}

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="com.rookie.bigdata.mapper.GoodMapper">
  
  <select id="selectGoodByOrderId" parameterType="int"
  resultType="com.rookie.bigdata.domain.Good">
      SELECT * FROM bs_goods WHERE id IN (
        SELECT good_id FROM bs_item WHERE order_id = #{id}
    ) 
  </select>
  

</mapper>
-----------------------------------------------------------------------------

<?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="com.rookie.bigdata.mapper.OrderMapper">

    <resultMap type="com.rookie.bigdata.domain.Order" id="orderResultMap">
        <id property="id" column="oid"/>
          <result property="code" column="code"/>
          <result property="total" column="total"/>
        <!-- 多对一关联映射:association   -->
        <association property="user" javaType="com.rookie.bigdata.domain.User">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="loginname" column="loginname"/>
            <result property="password" column="password"/>
            <result property="phone" column="phone"/>
            <result property="address" column="address"/>
        </association>
        <!-- 多对多映射的关键:collection   -->
        <collection property="goods" javaType="ArrayList"
      column="oid" ofType="com.rookie.bigdata.domain.User"
      select="com.rookie.bigdata.mapper.GoodMapper.selectGoodByOrderId"
      fetchType="lazy">
          <id property="id" column="id"/>
          <result property="name" column="name"/>
          <result property="price" column="price"/>
          <result property="remark" column="remark"/>
      </collection>
    </resultMap>
    

  <select id="selectOrderById" parameterType="int" resultMap="orderResultMap">
      SELECT u.*,o.id AS oid,CODE,total,user_id
       FROM bs_user u,bs_order o
      WHERE u.id = o.user_id
       AND o.id = #{id}
  </select>
  
  <!-- 根据userid查询订单 -->
  <select id="selectOrderByUserId" parameterType="int" resultType="com.rookie.bigdata.domain.Order">
      SELECT * FROM bs_order WHERE user_id = #{id}
  </select>
  

</mapper>
-------------------------------------------------------------------------

<?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="com.rookie.bigdata.mapper.UserMapper">

    <resultMap type="com.rookie.bigdata.domain.User" id="userResultMap">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="loginname" column="loginname"/>
        <result property="password" column="password"/>
        <result property="phone" column="phone"/>
        <result property="address" column="address"/>
        <!-- 一对多关联映射:collection   -->
        <collection property="orders" javaType="ArrayList"
                    column="id" ofType="com.rookie.bigdata.domain.User"
                    select="com.rookie.bigdata.mapper.OrderMapper.selectOrderByUserId"
                    fetchType="lazy">
            <id property="id" column="id"/>
            <result property="code" column="code"/>
            <result property="total" column="total"/>
        </collection>
    </resultMap>

    <select id="selectUserById" parameterType="int" resultMap="userResultMap">
        SELECT * FROM bs_user  WHERE id = #{id}
    </select>

</mapper>

测试代码如下:

package com.rookie.bigdata.mapper;

import com.rookie.bigdata.domain.Order;
import com.rookie.bigdata.domain.User;
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.Before;
import org.junit.Test;

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

import static org.junit.Assert.*;

/**
 * @author
 * @date 2018/10/21
 */
public class OrderMapperTest {

    public SqlSession session;

    @Before
    public void before() throws IOException {
        // 读取mybatis-config.xml文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        // 初始化mybatis,创建SqlSessionFactory类的实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
        // 创建Session实例
        session = sqlSessionFactory.openSession();
    }

    @Test
    public void selectOrderById() throws Exception {

        OrderMapper mapper = session.getMapper(OrderMapper.class);
        Order order = mapper.selectOrderById(2);
        System.out.println(order);
        User user = order.getUser();
        System.out.println(user);
        List<Order> orders = user.getOrders();
        System.out.println(orders);
    }

}

-------------------------------------------------------------------------

package com.rookie.bigdata.mapper;

import com.rookie.bigdata.domain.Order;
import com.rookie.bigdata.domain.User;
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.Before;
import org.junit.Test;

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

import static org.junit.Assert.*;

/**
 * @author
 * @date 2018/10/21
 */
public class UserMapperTest {
    public SqlSession session;

    @Before
    public void before() throws IOException {
        // 读取mybatis-config.xml文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        // 初始化mybatis,创建SqlSessionFactory类的实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
        // 创建Session实例
        session = sqlSessionFactory.openSession();
    }
    @Test
    public void selectUserById() throws Exception {
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = mapper.selectUserById(1);
        System.out.println(user);
        List<Order> orders = user.getOrders();
        for (Order order : orders) {
            System.out.println(order);
        }
    }

}

猜你喜欢

转载自www.cnblogs.com/haizhilangzi/p/9826174.html