文章目录

  • MyBatis的多表操作(xml)
  • 一对一查询
  • 1. 一对一查询的模型
  • 2. 一对一查询的语句
  • 3. 创建Order和User实体
  • 4. 创建OrderMapper接口
  • 5. 配置OrderMapper.xml
  • 6. 测试结果
  • 一对多查询
  • 1. 一对多查询的模型
  • 2. 一对多查询的语句
  • 3. 修改User实体(Order实体不用修改)
  • 4. 创建UserMapper接口
  • 5. 配置UserMapper.xml
  • 6. 测试结果
  • 多对多查询
  • 1. 多对多查询的模型
  • 2. 多对多查询的语句
  • 3. 创建Role实体,修改User实体
  • 4. 添加UserMapper接口方法
  • 5. 配置UserMapper.xml
  • 6. 测试结果
  • 知识小结


MyBatis的多表操作(xml)

一对一查询

1. 一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

springboot mybatis xml多表查询 mybatis criteria多表查询_数据库

2. 一对一查询的语句

对应的sql语句:select * from orders o,user u where o.uid=u.id;

对应的查询结果:

springboot mybatis xml多表查询 mybatis criteria多表查询_java_02

3. 创建Order和User实体

User实体

public class User {
    private int id;//用户id
    private String username;//用户名
    private String password;//密码
    private Date birthday;//生日
    //省略set和get及ToString方法
}

Order实体

public class Order {
    private int id;//订单id
    private String orderTime;//订购时间
    private double total;//价格
    private User user;//代表当前订单从属哪一个客户
    //省略set和get及ToString方法
}

4. 创建OrderMapper接口

public interface OrderMapper {
    List<Order> findAll();
}

5. 配置OrderMapper.xml

<mapper namespace="com.xiafanjun.dao.OrderMapper">
    <resultMap id="orderMap" type="order">
        <!--
        column是数据库中的字段名称
        property是java封装的是实体中的属性名
        -->
        <id column="id" property="id"/>
        <result column="ordertime" property="orderTime"/>
        <result column="total" property="total"/>
        <result column="uid" property="user.id"/>
        <result column="username" property="user.username"/>
        <result column="password" property="user.password"/>
        <result column="birthday" property="user.birthday"/>
    </resultMap>
    <select id="findAll" resultMap="orderMap">
        select * from orders o,user u where o.uid=u.id
    </select>
</mapper>

其中还可以配置如下:

<resultMap id="orderMap" type="order">
    <!--
    column是数据库中的字段名称
    property是java封装的是实体中的属性名
    -->
    <id column="id" property="id"/>
    <result column="ordertime" property="orderTime"/>
    <result column="total" property="total"/>
    <!--
    property中的user是Order类中User类型的属性名
    javaType中的user是com.xiafanjun.domain.Order,这里写user是因为在核心文件里起了别名叫user
    -->
    <association property="user" javaType="user">
        <id column="uid" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="birthday" property="birthday"/>
    </association>
</resultMap>

第二种方式的可读性较强

核心配置文件如下:

<?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>
    <!--jdbc配置文件-->
    <properties resource="jdbc.properties"/>

    <!--定义别名-->
    <typeAliases>
        <typeAlias type="com.xiafanjun.domain.User" alias="user"/>
        <typeAlias type="com.xiafanjun.domain.Order" alias="order"/>
    </typeAliases>

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

    <!--配置映射-->
    <mappers>
        <mapper resource="com/xiafanjun/mapper/userMapper.xml"/>
        <mapper resource="com/xiafanjun/mapper/orderMapper.xml"/>
    </mappers>
</configuration>

6. 测试结果

public void findAll() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
    List<Order> orderList = mapper.findAll();//调用查询方法
    for(Order order:orderList){//输出
        System.out.println(order);
    }
    sqlSession.close();
}

springboot mybatis xml多表查询 mybatis criteria多表查询_mybatis_03

一对多查询

1. 一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

springboot mybatis xml多表查询 mybatis criteria多表查询_java_04

2. 一对多查询的语句

对应的sql语句:select * from user u, orders o where u.id = o.uid;

对应的查询结果:

springboot mybatis xml多表查询 mybatis criteria多表查询_java_05

3. 修改User实体(Order实体不用修改)

User实体

public class User {
    private int id;//用户id
    private String username;//用户名
    private String password;//密码
    private Date birthday;//生日
    private List<Order> orderList;//代表当前用户有哪些订单,一个用户可以对应多个订单
    //省略set和get及ToString方法
}

4. 创建UserMapper接口

public interface UserMapper {
    List<User> findAll();
}

5. 配置UserMapper.xml

<mapper namespace="com.xiafanjun.dao.UserMapper">
    <resultMap id="userMap" type="user">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="birthday" property="birthday"/>
        <!--
		封装Order实体
        property是User类中,封装数据的集合的属性名
        ofType是集合中的数据类型
        -->
        <collection property="orderList" ofType="order">
            <id column="oid" property="id"/>
            <result column="ordertime" property="orderTime"/>
            <result column="total" property="total"/>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="userMap">
        select *,o.id oid from user u, orders o where u.id = o.uid
    </select>
</mapper>

6. 测试结果

public void findAll() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    //调用方法查询数据
    List<User> userList = mapper.findAll();
    for(User user:userList){
        //输出用户名
        System.out.println(user.getUsername());
        List<Order> orderList = user.getOrderList();
        for(Order order:orderList){
            //输出用户的所有订单
            System.out.println(order);
        }
        System.out.println("---------------------------S");
        sqlSession.close();
    }
}

springboot mybatis xml多表查询 mybatis criteria多表查询_User_06

多对多查询

1. 多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色

springboot mybatis xml多表查询 mybatis criteria多表查询_mysql_07

2. 多对多查询的语句

对应的sql语句:select * from user u,user_role ur,role r where u.id = ur.userid and ur.roleid = r.id

查询的结果如下:

springboot mybatis xml多表查询 mybatis criteria多表查询_java_08

3. 创建Role实体,修改User实体

创建Role实体

public class Role {
    private int id;//角色id
    private String roleName;//角色名称
    //省略set和get及ToString方法
}

修改User实体

public class User {
    private int id;//用户id
    private String username;//用户名
    private String password;//密码
    private Date birthday;//生日
    private List<Role> roleList;//代表当前用户具备哪些角色
    //省略set和get及ToString方法
}

4. 添加UserMapper接口方法

List<User> findAllUserAndRole();

5. 配置UserMapper.xml

<resultMap id="userAndRoleMap" type="user">
    <id column="userid" property="id"/>
    <result column="username" property="username"/>
    <result column="password" property="password"/>
    <result column="birthday" property="birthday"/>
    <!--封装Role数据-->
    <collection property="roleList" ofType="role">
        <id column="roleid" property="id"/>
        <result column="rolename" property="roleName"/>
    </collection>
</resultMap>
<select id="findAllUserAndRole" resultMap="userAndRoleMap">
    select * from user u,user_role ur,role r where u.id = ur.userid and ur.roleid = r.id
</select>

6. 测试结果

public void findAllUserAndRole() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    //调用方法查询数据
    List<User> userList = mapper.findAllUserAndRole();
    for(User user:userList){
        //输出用户名
        System.out.println(user.getUsername());
        //获取角色列表
        List<Role> roleList = user.getRoleList();
        //输出角色
        System.out.println(roleList);
        sqlSession.close();
    }
}

springboot mybatis xml多表查询 mybatis criteria多表查询_数据库_09

知识小结

MyBatis多表配置方式:

  • 一对一配置:使用做配置
<resultMap id="orderMap" type="order">
    <!--
    column是数据库中的字段名称
    property是java封装的是实体中的属性名
    -->
    <id column="id" property="id"/>
    <result column="ordertime" property="orderTime"/>
    <result column="total" property="total"/>
    <!--
    property中的user是Order类中User类型的属性名
    javaType中的user是com.xiafanjun.domain.Order,这里写user是因为在核心文件里起了别名叫user
    -->
    <association property="user" javaType="user">
        <id column="uid" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="birthday" property="birthday"/>
    </association>
</resultMap>
  • 一对多配置:使用+做配置
<resultMap id="userMap" type="user">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="birthday" property="birthday"/>
        <!--
		封装Order实体
        property是User类中,封装数据的集合的属性名
        ofType是集合中的数据类型
        -->
        <collection property="orderList" ofType="order">
            <id column="oid" property="id"/>
            <result column="ordertime" property="orderTime"/>
            <result column="total" property="total"/>
        </collection>
    </resultMap>
  • 多对多配置:使用+做配置
<resultMap id="userAndRoleMap" type="user">
    <id column="userid" property="id"/>
    <result column="username" property="username"/>
    <result column="password" property="password"/>
    <result column="birthday" property="birthday"/>
    <!--封装Role数据-->
    <collection property="roleList" ofType="role">
        <id column="roleid" property="id"/>
        <result column="rolename" property="roleName"/>
    </collection>
</resultMap>