Mybatis 使用 mapper 接口規范的 一對一, 一對多,多對多映射


首先的 是 最原始的 pojo 類來 做簡單映射

簡單 pojo 映射:

<mapper namespace="com.ghc.dao.UserDao">

    <select id="findUserById" parameterType="int" resultType="user">
        SELECT * FROM user WHERE id = #{id}
    </select>
簡單 pojo 映射文件的配置

 

 

以下都是對於原始基本的 pojo 類 進行包裝擴展后來實現 其他列的映射

一對一:

<resultMap id="findUserOrderMapper" type="com.ghc.pojo.UserOrderWrapperFirst"> <!--因為繼承自Order類,所以這些都可以看做是Order這個對象的基本屬性-->
        <id column="id" property="id"/>
        <result column="user_id" property="user_id"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>

        <!--配置映射關聯的用戶信息-->
        <!-- association: 用於映射關聯查詢單個對象的信息-->
        <!---->
        <association property="user" javaType="com.ghc.pojo.User"> <!--此處本可以寫成user 但是為了突出就不用別名了 下面都是封裝 wrapper 包裝類的user對象到一個User的bean中-->
           <id column="user_id" property="id"/> <!--唯一標識用戶的列就是主外鍵列 user_id 是 Order 的基本屬性-->
            <result column="username" property="userName"/>
            <result column="birthday" property="birthday"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>

    <select id="findUserOrder"  resultMap="findUserOrderMapper">
        select o.*,u.* from user u join orders o on u.id = o.user_id
    </select>
OneToOne

 

 

一對多:

 <resultMap id="findOneToManyMap" type="com.ghc.pojo.UserOrderWrapper">
        <id property="id" column="id"/>
        <result column="user_id" property="user_id"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <association property="user" javaType="user">
            <id column="user_id" property="id"/>
            <result column="username" property="userName"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        </association>

        <collection property="orderDetails" ofType="com.ghc.pojo.OrderDetail">
            <id column="odtid" property="id"/>
            <result column="items_id" property="itemsId"/>
            <result column="items_num" property="itemsNum"/>
            <result column="orders_id" property="ordersId"/>
        </collection>
    </resultMap>

    <select id="findOneToMany" resultMap="findOneToManyMap">
        select o.*,
        u.username,
        u.sex,
        u.address,
        odt.id as odtid,
        odt.items_id,
        odt.items_num,
        odt.orders_id
       from user u join orders o on u.id = o.user_id
                   join orderdetail odt on o.id = odt.orders_id
    </select>
OneToMany映射文件的配置

 

 

 

多對多:

關鍵還是在於 mapper.xml 文件的書寫

<resultMap id="findManyToManyMap" type="user">
        <!--主表 user 表-->
        <id column="user_id" property="id"/>
        <result column="username" property="userName"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
        <!--從表 order 表映射到 orderList-->
        <collection property="orderList" ofType="com.ghc.pojo.Orders">
            <id column="id" property="id"/>
            <result column="user_id" property="user_id"/>
            <result column="number" property="number"/>
            <result column="createtime" property="createtime"/>
            <result column="note" property="note"/>

            <!--從表 orderDetail 表映射到 orderDetailList-->
            <collection property="orderDetailList" ofType="com.ghc.pojo.OrderDetail">
                <id column="odtid" property="id"/>
                <result column="items_id" property="itemsId"/>
                <result column="items_num" property="itemsNum"/>
                <result column="orders_id" property="ordersId"/>
                <!-- 而 orderDetail 這張表的 itemid 外鍵只對應 items 表中一條數據,所以此處用association-->
                <association property="item" javaType="com.ghc.pojo.Items">
                    <id column="item_id" property="id"/>
                    <result column="name" property="name"/>
                    <result column="price" property="price"/>
                    <result column="detail" property="detail"/>
                    <result column="pic" property="pic"/>
                    <result column="createtime" property="createtime"/>
                </association>
            </collection>
        </collection>
    </resultMap>

    <select id="findManyToMany" resultMap="findManyToManyMap">
        select o.id,
       o.user_id,
       o.number,
       o.createtime,
       o.note,
        u.username,
        u.sex,
        u.address,
        odt.id as odtid,
        odt.items_id,
        odt.items_num,
        odt.orders_id,
         i.id as item_id,
        i.name,
        i.price,
        i.detail,
        i.pic,
        i.createtime
       from user u join
                       orders o on u.id = o.user_id
                   join orderdetail odt on o.id = odt.orders_id
                   join items i on odt.items_id = i.id
    </select>
ManyToMany映射文件的配置

 

上面配置文件都寫完后,就可以進行 mapper 接口 mapper.java 的編寫了

 

順便貼上 相應的 pojo (User 里 包含一個 List<Orders>  然后 Orders 里又包含一個 List<OrderDetail>  最后 OrderDetail 里包含一個 Item ) 修改后的樣子:

也就是 數據庫的 主從表之間的外鍵關系,

User ------> Order  (1:n)   

Order  -----> OrderDetail  (1:n)

OrderDetail ----> Item (1:1)

 

下面開始 貼 多對多的  pojo 部分的 代碼了 (我覺得 多對多都會了 其他的都不在話下,所以其他的沒必要貼了):

package com.ghc.pojo;

import java.util.Date;
import java.util.List;

public class User {
    private int id;
    private String userName;
    private Date birthday;
    private String sex;
    private String address;
    // 一個人有多個訂單
    private List<Orders> orderList;
    public List<Orders> getOrderList() {
        return orderList;
    }

    public void setOrderList(List<Orders> orderList) {
        this.orderList = orderList;
    }


    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;
    }
}
com.ghc.pojo.User

 

package com.ghc.pojo;

import java.util.Date;
import java.util.List;

public class Orders {
    private int id;
    private int user_id;
    private String number;
    private Date createtime;
    private String note;

    public List<OrderDetail> getOrderDetailList() {
        return orderDetailList;
    }

    public void setOrderDetailList(List<OrderDetail> orderDetailList) {
        this.orderDetailList = orderDetailList;
    }

    // 一個訂單可以有多個訂單明細
    private List<OrderDetail> orderDetailList;

    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 String getNumber() {
        return number;
    }

    public void setNumber(String 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;
    }
}
com.ghc.pojo.Orders

 

package com.ghc.pojo;

public class OrderDetail {
    private int id;
    private int ordersId;
    private int itemsId;
    private int itemsNum;

    //而一個訂單明細對應一條項目
    private  Items item;

    public Items getItem() {
        return item;
    }

    public void setItem(Items item) {
        this.item = item;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getOrdersId() {
        return ordersId;
    }

    public void setOrdersId(int ordersId) {
        this.ordersId = ordersId;
    }

    public int getItemsId() {
        return itemsId;
    }

    public void setItemsId(int itemsId) {
        this.itemsId = itemsId;
    }

    public int getItemsNum() {
        return itemsNum;
    }

    public void setItemsNum(int itemsNum) {
        this.itemsNum = itemsNum;
    }
}
com.ghc.pojo.OrderDetail
package com.ghc.pojo;

import java.util.Date;

public class Items {
    private int id;
    private String name;
    private float price;
    private String detail;
    private String pic;
    private Date createtime;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }
}
com.ghc.pojo.Items

 

 

package com.ghc.dao;

import com.ghc.pojo.User;
import com.ghc.pojo.UserOrderWrapper;
import com.ghc.pojo.UserOrderWrapperFirst;

import java.util.List;

public interface UserDao {
    User findUserById(int id) throws Exception;
    List<UserOrderWrapperFirst> findUserOrder() throws Exception;
    List<UserOrderWrapper> findOneToMany() throws Exception;
    List<User> findManyToMany() throws Exception;
}
UserDao

 

如果經常要打印輸出,建議在 pojo 中 覆寫 toString,不然就要跟下面這么苦逼的 拼 String 打印了

import com.ghc.dao.UserDao;

import com.ghc.pojo.*;
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.util.List;

public class UserDaoTest {
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void injectSqlSessionFactory() throws IOException {
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("config/SqlMappingConfig.xml"));
    }

    @Test
    public void testFindUserById() throws Exception {
        UserDao userDao = sqlSessionFactory.openSession().getMapper(UserDao.class);
        User user = userDao.findUserById(1);
        System.out.println(user.getUserName());

        List<UserOrderWrapperFirst> userOrderWrapperFirstList = userDao.findUserOrder();
        for (UserOrderWrapperFirst userOrder : userOrderWrapperFirstList) {
            String userName = userOrder.getUser().getUserName();
            int orderId = userOrder.getId();
            System.out.println(userName + " <-----> " + String.valueOf(orderId));

        }
    }

    @Test
    public void testFindOneToMany() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<UserOrderWrapper> userOrderWrappers = userDao.findOneToMany();
        for (int i = 0; i < userOrderWrappers.size(); i++) {
            UserOrderWrapper uow = userOrderWrappers.get(i);
            List<OrderDetail> orderDetails = uow.getOrderDetails();
            User user = uow.getUser();
            for (int j = 0; j < orderDetails.size(); j++) {
                System.out.print(uow.getId() + "--" + uow.getUser_id() + "--" + uow.getNumber() + "--" + uow.getCreatetime() + "--" + uow.getNote() + "--");
                System.out.print(user.getUserName() + "--" + user.getSex() + "--" + user.getAddress() + "--");
                OrderDetail odt = orderDetails.get(j);
                System.out.println(odt.getId() + "--" + odt.getItemsId() + "--" + odt.getItemsNum() + "--" + odt.getOrdersId());
            }
        }
    }

    @Test
    public void testFindManyToMany() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.findManyToMany();
        for (User user : userList) {
            List<Orders> orderList = user.getOrderList();
            for (Orders order : orderList) {
                List<OrderDetail> orderDetailList = order.getOrderDetailList();
                for (OrderDetail orderDetail : orderDetailList) {
                    Items item = orderDetail.getItem();
                    System.out.println(order.getId() + "--" + order.getUser_id() + "--" + order.getNumber() + "--" + order.getCreatetime() +
                            "--" + order.getNote() +"--" + user.getUserName() + "--" + user.getSex() + "--" +
                            user.getAddress() + "--" + orderDetail.getId() + "--" + orderDetail.getItemsId() + "--" + orderDetail.getItemsNum() + "--" +
                            orderDetail.getOrdersId() + "--" + item.getId() + "--" + item.getName() + "--" + item.getName() + "--" + item.getPrice() + "--" +
                            item.getDetail() + "--" + item.getPic() + "--" + item.getCreatetime());
                }
            }
        }
    }
}
Junit 測試Mapper 接口方法

 

測試結果 與數據庫基本一致 :

 

 

 至此, mybatis 的 所謂高級部分全部完成(動態 sql 部分另開一篇去說好了),實際項目開發的時候,單表是采用 generator 逆向工程生成 pojo,mapper.xml , mapper.java 的

但是也需要配置數據庫連接,表信息等等。。。到一個 generatorconfig.xml 這樣類似的 一個 配置文件里,然后調用生成工具的代碼進行生成。

但是懂了原理,任他怎么來都容易理解了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM