Mybatis案例(关于数据库关系一对多,多对多关系,在mapper中应该怎样去配置)

(1)新建一个maven项目,引入mybatis依赖

(2)配置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">

<configuration>
    <typeAliases>
        <package name="edu.nf.ch03.entity"/>
    </typeAliases>

    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/UsersMapper.xml"/>
        <mapper resource="mapper/IdCardMapper.xml"/>
    </mappers>
</configuration>

(3)实体类

Addres:

package edu.nf.ch03.entity;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lance
 * @date 2018/9/13
 */
public class Address {

    private Integer aid;
    private String address;

    /**
     * 多对多关联用户
     */
    //private List<Users> users = new ArrayList<>();

    public Integer getAid() {
        return aid;
    }

    public void setAid(Integer aid) {
        this.aid = aid;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

IdCard实体类:

package edu.nf.ch03.entity;

/**
 * @author lance
 * @date 2018/9/13
 */
public class IdCard {

    private Integer id;
    private String cardNum;
    /**
     * 关联用户
     */
    private Users user;

    public Integer getId() {
        return id;
    }

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

    public String getCardNum() {
        return cardNum;
    }

    public void setCardNum(String cardNum) {
        this.cardNum = cardNum;
    }

    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }
}

Tel实体类:

package edu.nf.ch03.entity;

/**
 * @author lance
 * @date 2018/9/13
 */
public class Tel {

    private Integer tid;
    private String tel;

    public Integer getTid() {
        return tid;
    }

    public void setTid(Integer tid) {
        this.tid = tid;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }
}

Users实体类:

package edu.nf.ch03.entity;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lance
 * @date 2018/9/13
 */
public class Users {

    private Integer uid;
    private String userName;
    /**
     * 关联身份证
     */
    private IdCard card;

    /**
     * 一对多关联联系方式
     * @return
     */
    private List<Tel> tels = new ArrayList<>();

    /**
     * 多对多关联地址
     */
    private List<Address> addrs = new ArrayList<>();

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public IdCard getCard() {
        return card;
    }

    public void setCard(IdCard card) {
        this.card = card;
    }

    public List<Tel> getTels() {
        return tels;
    }

    public void setTels(List<Tel> tels) {
        this.tels = tels;
    }

    public List<Address> getAddrs() {
        return addrs;
    }

    public void setAddrs(List<Address> addrs) {
        this.addrs = addrs;
    }
}

(4)接口实现类:

package edu.nf.ch03.dao.impl;

import edu.nf.ch03.commons.MyBatisUtil;
import edu.nf.ch03.dao.UserDao;
import edu.nf.ch03.entity.Users;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

/**
 * @author lance
 * @date 2018/9/13
 */
public class UserDaoImpl implements UserDao {

    @Override
    public Users findUserById(int uid) {
        SqlSession session = MyBatisUtil.getSession();
        Users user = null;
        try {
            UserDao dao = session.getMapper(UserDao.class);
            user = dao.findUserById(uid);
        } finally {
            session.close();
        }
        return user;
    }

    @Override
    public List<Users> listUsers() {
        SqlSession session = MyBatisUtil.getSession();
        List<Users> list = null;
        try {
            UserDao dao = session.getMapper(UserDao.class);
            list = dao.listUsers();
        } finally {
            session.close();
        }
        return list;
    }
}

(5)UserMapper.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="edu.nf.ch03.dao.UserDao">

    <!-- userMap -->
    <resultMap id="userMap" type="users">
        <id property="uid" column="u_id"/>
        <result property="userName" column="u_name"/>
        <!-- 一对一关联身份证, 一对一或者多对一使用association,
        property指定实体中关联对象的字段名
        ,resultMap属性指定其他resultMap的id-->
        <association property="card" resultMap="cardMap"/>
        <!-- 一对多关联电话, 一对多或者多对多使用collection,
        property和resultMap属性同上-->
        <collection property="tels" resultMap="telMap"/>
        <!-- 多对多关联地址-->
        <collection property="addrs" resultMap="addrMap"/>
    </resultMap>

    <!-- cardMap -->
    <resultMap id="cardMap" type="idCard">
        <id property="id" column="c_id"/>
        <result property="cardNum" column="c_number"/>
    </resultMap>

    <!-- telMap-->
    <resultMap id="telMap" type="tel">
        <id property="tid" column="t_id"/>
        <result property="tel" column="t_number"/>
    </resultMap>

    <!-- addrMap -->
    <resultMap id="addrMap" type="address">
        <id property="aid" column="a_id"/>
        <result property="address" column="address"/>
    </resultMap>

    <!-- 关联查询 -->
    <select id="findUserById" resultMap="userMap">
        select u.u_id, u.u_name, c.c_number, t.t_number, a.address
        from user_info u
        join card_info c on u.u_id = c.u_id
        join tel_info t on u.u_id = t.u_id
        join user_addr ua on u.u_id = ua.u_id
        join addr_info a on a.a_id = ua.a_id
        where u.u_id = #{uid}
    </select>
</mapper>

(6)测试:

package edu.nf.ch03.test;

import edu.nf.ch03.dao.impl.UserDaoImpl;
import edu.nf.ch03.entity.Address;
import edu.nf.ch03.entity.Tel;
import edu.nf.ch03.entity.Users;
import org.junit.Test;

/**
 * @author lance
 * @date 2018/9/13
 */
public class UserDaoTest {

    @Test
    public void testFindUserById(){
        Users user = new UserDaoImpl().findUserById(1);
        //用户名
        System.out.println(user.getUserName());
        //身份证
        System.out.println(user.getCard().getCardNum());
        //联系方式
        for (Tel tel : user.getTels()) {
            System.out.println(tel.getTel());
        }
        //住址
        for (Address addr : user.getAddrs()) {
            System.out.println(addr.getAddress());
        }

    }
}
原文地址:https://www.cnblogs.com/gepuginy/p/9642836.html