MyBatis的多表操作、基于xxxMapper.xml的一对一、一对多、多对多

1.一对一查询

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.一对多查询

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

3.多对多查询

在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.代码

在这里插入图片描述
pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itcast</groupId>
    <artifactId>Mybatis_day4_mutilquery</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.32</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>


    </dependencies>
    
</project>

jdbc.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root

log4j.properties:

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{
    
    ABSOLUTE} %5p %c{
    
    1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{
    
    ABSOLUTE} %5p %c{
    
    1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout

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>

    <!--通过properties标签加载外部properties文件-->
    <properties resource="jdbc.properties"></properties>
    
    <!--自定义别名-->
    <typeAliases>
        <typeAlias type="com.itheima.domain.Sys_user" alias="Sys_user"></typeAlias>
        <typeAlias type="com.itheima.domain.Order" alias="Order"></typeAlias>

    </typeAliases>


    <!--数据源环境-->
    <environments default="developement">
        <environment id="developement">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>

            </dataSource>
        </environment>
    </environments>

    <!--加载映射文件-->
    <mappers>
        <mapper resource="com.itheima.mapper/UserMapper.xml"></mapper>
        <mapper resource="com.itheima.mapper/OrderMapper.xml"></mapper>

    </mappers>

    
</configuration>

上面的代码和上次写的差不多,主要看下面的
domain:

package com.itheima.domain;

import java.util.Date;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/1 16:32
 */
public class Order {
    
    
    private int id;
    private Date ordertime;
    private double total;

    //当前订单属于哪个用户(外键在实体类得用对象或者对象集合岚表示),1.演示一对一
    private Sys_user sys_user;

    @Override
    public String toString() {
    
    
        return "Order{" +
                "id=" + id +
                ", ordertime=" + ordertime +
                ", total=" + total +
                ", sys_user=" + sys_user +
                '}';
    }

    public int getId() {
    
    
        return id;
    }

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

    public Date getOrdertime() {
    
    
        return ordertime;
    }

    public void setOrdertime(Date ordertime) {
    
    
        this.ordertime = ordertime;
    }

    public double getTotal() {
    
    
        return total;
    }

    public void setTotal(double total) {
    
    
        this.total = total;
    }

    public Sys_user getSys_user() {
    
    
        return sys_user;
    }

    public void setSys_user(Sys_user sys_user) {
    
    
        this.sys_user = sys_user;
    }
}

package com.itheima.domain;

import java.util.List;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/1/28 12:18
 */
public class Sys_user {
    
    
    private int id;
    private String username;
    private String email;
    private String password;
    private String phoneNum;

    //2.描述的是当前用户存在哪些订单,演示一对多
    private List<Order> orderList;

    //3.描述的是当前用户具备哪些角色,演示多对多
    private List<Role> roleList;

    @Override
    public String toString() {
    
    
        return "Sys_user{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +
                ", phoneNum='" + phoneNum + '\'' +
                ", orderList=" + orderList +
                ", roleList=" + roleList +
                '}';
    }

    public List<Role> getRoleList() {
    
    
        return roleList;
    }

    public void setRoleList(List<Role> roleList) {
    
    
        this.roleList = roleList;
    }

    public List<Order> getOrderList() {
    
    
        return orderList;
    }

    public void setOrderList(List<Order> 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 String getEmail() {
    
    
        return email;
    }

    public void setEmail(String email) {
    
    
        this.email = email;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }

    public String getPhoneNum() {
    
    
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
    
    
        this.phoneNum = phoneNum;
    }
}

package com.itheima.domain;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/1 18:22
 */
public class Role {
    
    
    private int id;
    private String roleName;
    private String roleDesc;

    @Override
    public String toString() {
    
    
        return "Role{" +
                "id=" + id +
                ", roleName='" + roleName + '\'' +
                ", roleDesc='" + roleDesc + '\'' +
                '}';
    }

    public int getId() {
    
    
        return id;
    }

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

    public String getRoleName() {
    
    
        return roleName;
    }

    public void setRoleName(String roleName) {
    
    
        this.roleName = roleName;
    }

    public String getRoleDesc() {
    
    
        return roleDesc;
    }

    public void setRoleDesc(String roleDesc) {
    
    
        this.roleDesc = roleDesc;
    }
}

mapper:

package com.itheima.mapper;

import com.itheima.domain.Order;

import java.util.List;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/1 16:37
 */
public interface OrderMapper {
    
    

    public List<Order> findAll();  //演示一对一,一个订单对应一个用户,全部查出来而已

}

package com.itheima.mapper;

import com.itheima.domain.Role;
import com.itheima.domain.Sys_user;

import java.util.List;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/1/30 11:06
 */
public interface UserMapper {
    
    

    public List<Sys_user> findAlluser_duodingdan();//2.演示一对多,一个用户有多个订单

    public List<Sys_user> findUserAndRoleAll();//3.演示多对多,一个用户有多个角色,一个角色哟多个用户
}


4.1映射文件(重点)

com.itheima.mapper/OrderMapper.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.itheima.mapper.OrderMapper">
    <!--1.#####################################################-->
    <!--演示一对一,一个订单对应一个用户,全部查出来而已-->
    <!--Order是在核心配置文件的别名-->
    <resultMap id="orderMap" type="Order">
        <!--手动指定数据表字段与实体属性的映射关系
        column:你用语句查出来的数据表的字段名称(还是看你写的sql,查询的sql查出来的字段名(别名也可以),column还可以用你查出来的别名 )
        property:实体的属性名称-->
        <id column="oid" property="id"></id>
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>

        <!--property:是当前实体(Order)中的属性名称(private Sys_user sys_user)
        javaType:当前实体(Order)中的属性的类型(Sys_user类型,这里要写全包名的,但Sys_user是我定义的别名啦)-->
        <association property="sys_user" javaType="Sys_user">
            <!--这里虽然写sys_user的类型,但是property还是写当前实体的uid(就是写你查询的sql查出来的字段名(别名也可以),如不是写Sys_user的字段名哦-->
            <id column="uid" property="id"></id>
            <result column="username" property="username"></result>
            <result column="email" property="email"></result>
            <result column="password" property="password"></result>
            <result column="phoneNum" property="phoneNum"></result>
        </association>
    </resultMap>

    <select id="findAll" resultMap="orderMap">
--         定义查o.id oid好区分两个相同的id而已
        SELECT *,o.id oid FROM orders o,sys_user u WHERE o.uid=u.`id`
    </select>





</mapper>

com.itheima.mapper/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="com.itheima.mapper.UserMapper">
    <!--2.演示一对多,一个用户多个订单-->
    <resultMap id="userMap" type="Sys_user">
        <id column="uid" property="id"></id>
        <result column="username" property="username"></result>
        <result column="email" property="email"></result>
        <result column="password" property="password"></result>
        <result column="phoneNum" property="phoneNum"></result>
        <!--配置集合信息,之前一对一是配置association,这里是collection
            property:还是实体的集合名称(对应Sys_user的private List<Order> orderList;)
            ofType:当前集合中的数据类型,为sqlMapConfig的别名Order-->
        <collection property="orderList" ofType="Order">
            <!--封装order的数据-->
            <id column="oid" property="id"></id>
            <result column="ordertime" property="ordertime"></result>
            <result column="total" property="total"></result>
        </collection>
    </resultMap>

    <select id="findAlluser_duodingdan" resultMap="userMap">
        SELECT *,o.`id` oid FROM sys_user u,orders o WHERE u.`id`=o.`uid`
    </select>


    <!--##########################################################################-->

    <!--3.演示多对多,一个用户有多个角色,一个角色哟多个用户-->
    <resultMap id="userRoleMap" type="Sys_user">
        <id column="userId" property="id"></id>
        <result column="username" property="username"></result>
        <result column="email" property="email"></result>
        <result column="password" property="password"></result>
        <result column="phoneNum" property="phoneNum"></result>

        <!--Sys_user的roleList信息,这里ofType不使用别名了,你可以在sqlMapConfig设置role的别名也可以-->
        <collection property="roleList" ofType="com.itheima.domain.Role">
            <id column="roleId" property="id"></id>
            <result column="roleName" property="roleName"></result>
            <result column="roleDesc" property="roleDesc"></result>
        </collection>
    </resultMap>
    <select id="findUserAndRoleAll" resultMap="userRoleMap">
        SELECT *FROM sys_user u,sys_user_role ur,sys_role r WHERE u.`id`=ur.`userId` AND r.`id`=ur.`roleId`
    </select>
</mapper>

com.itheima.service.ServiceDemo测试代码:

package com.itheima.service;


import com.itheima.domain.Order;
import com.itheima.domain.Sys_user;
import com.itheima.mapper.OrderMapper;
import com.itheima.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/1/30 11:07
 */
public class ServiceDemo {
    
    

    @Test
    //1.演示一对一,一个订单对应一个用户,全部查出来而已
    public void test1() throws IOException {
    
    

        InputStream resourceAsStream= Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession=sqlSessionFactory.openSession(true);

        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
        List<Order> orderList = mapper.findAll();
        for (Order order : orderList) {
    
    
            System.out.println(order);
        }

    }

    @Test
    //2.演示一对多,一个用户对应多个订单
    public void test2() throws IOException {
    
    

        InputStream resourceAsStream= Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession=sqlSessionFactory.openSession(true);

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<Sys_user> sys_userList = mapper.findAlluser_duodingdan();
        for (Sys_user sys_user : sys_userList) {
    
    
            System.out.println(sys_user);
        }

    }


    @Test
    //3.演示多对多,一个用户有多个角色,一个角色哟多个用户
    public void test3() throws IOException {
    
    

        InputStream resourceAsStream= Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession=sqlSessionFactory.openSession(true);

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<Sys_user> sys_userList = mapper.findUserAndRoleAll();
        for (Sys_user sys_user : sys_userList) {
    
    
            System.out.println(sys_user);
        }

    }
}

5.总结

在这里插入图片描述一对多:那么就要在一的实体类定义对象集合(多),多对多就随便在一个定义另一个的集合对象

之前在xxMapper.xml是写resultType的,现在要写resultMap了,且resultMap要自己在xml写。

在xxxMapper.xml中的resultMap配:
id代表int,
result一般代表varchar、double等
association代表一个对象
collection代表对象集合类型

column:你用语句查出来的数据表的字段名称(还是看你写的sql,查询的sql查出来的字段名(别名也可以),column还可以用你查出来的别名 )
property:实体的属性名称

下面图片是xxxMapper.xml的:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/GLOAL_COOK/article/details/113523359