Mybatis(四)多表操作

数据库如下:

一、创建数据库所对应的bean类

public class User {
    private Integer uId;
    private String username;
    private String sex;
    private String address;

    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 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;
    }

    @Override
    public String toString() {
        return "User{" +
                "uId=" + uId +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
public class Order {

    private Integer oId;
    private Integer number;
    private String orderName;
    private Integer userId;

    private User user;

    public Integer getoId() {
        return oId;
    }

    public void setoId(Integer oId) {
        this.oId = oId;
    }

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public User getUser() {
        return user;
    }

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

    @Override
    public String toString() {
        return "Order{" +
                "oId=" + oId +
                ", number=" + number +
                ", orderName='" + orderName + '\'' +
                ", userId=" + userId +
                ", user=" + user +
                '}';
    }
}

二、核心配置文件sqlMapConfig.xml

  (1)、jdbc.properties与sqlMapperConfig.xml文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/school?characterEncoding=utf-8
jdbc.username=root
jdbc.password=dyhroot
<?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 resource="jdbc.properties"/>

    <!--别名的应用,一定要特别注意标签是有顺序的,不然会报异常-->
    <typeAliases>
        <!--这样写就是该文件中所有的"dyh.bean.User" 都用User代替了-->
        <!--这样写有一个弊端,就是除了用户之外还有其他实体类,比如Order、Customer…… 那就要写n别名了,所以不推荐使用-->
        <!--<typeAlias type="dyh.bean.User" alias="User"/>-->

        <!--推荐使用包的形式-->
        <package name="dyh.bean"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <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>

    <!-- Mapper的位置  Mapper.xml 写Sql语句的文件的位置 -->
    <mappers>
        <mapper resource="orderMapper/OrderMapper.xml"/>
        <!--使用mapper接口类路径
        如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
        注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。-->

        <!--<package name="userMapper"/>-->

        <!--注册指定包下的所有mapper接口
        如:<package name="cn.itcast.mybatis.mapper"/>
        注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。-->

        <!--注意:但是这两种引入sql映射文件的办法,用IDEA的maven工程,这样写有问题,还没找到原因,有可能是不可以这么书写-->
    </mappers>

</configuration>

三、代理接口OrderMapper与对应的映射文件OrderMapper.xml

public interface OrderMapper {
    //一对一关联查询,以订单为中心关联用户
    public List<Order> selectOrders();
}
<?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="dyh.mapper.OrderMapper">

    <!--一对一关联查询,以订单为中心关联用户
    public List<Order> selectOrders();-->

    <resultMap id="order" type="Order">
        <!--orders表操作,数据库字段user_id 与 Order类中的属性userId 不一致,其他字段不可省略-->
        <result property="userId" column="user_id"/>
        <result property="orderName" column="orderName"/>
        <result property="oId" column="oId"/>
        <result property="number" column="number"/>

        <association property="user" javaType="User">
            <id property="uId" column="uId"/>
            <result property="username" column="username"/>
            <result property="sex" column="sex"/>
            <result property="address" column="address"/>
        </association>

    </resultMap>

    <select id="selectOrders" resultMap="order">
      SELECT
      o.orderName,
      o.number,
      o.user_id,
      o.oId,
      u.uId,
      u.username,
      u.sex,
      u.address
      FROM
      orders o
      LEFT JOIN
      users u
      ON
      o.user_id = u.uId;
    </select>
</mapper>

四、测试

package dyh.test;

import dyh.bean.Order;
import dyh.mapper.OrderMapper;
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.InputStream;
import java.util.List;

public class MybatisTest {

    @Test
    public void testMapper() throws Exception {
        //加载核心配置文件
        String resource = "sqlMapConfig.xml";
        InputStream in = Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //创建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //SqlSEssion帮我生成一个实现类  (给接口)
        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);

        List<Order> orders = orderMapper.selectOrders();
        for (Order order : orders) {
            System.out.println(order);
        }
    }
}

测试结果:

 

 

其他:

  一对多关联(步骤同上)

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;

//一个用户对应多张订单
    private List<Orders> ordersList;

 

     //一对多关联
    public List<User> selectUserList(); -->
    <resultMap type="User" id="user">
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
        <!-- 一对多 -->
        <collection property="ordersList" ofType="Orders">
            <id column="id" property="id"/>
            <result column="number" property="number"/>
        </collection>
    </resultMap>
    <select id="selectUserList" resultMap="user">
        SELECT 
         o.id,
        o.user_id, 
        o.number,
         o.createtime,
         u.username 
         FROM user u
         left join orders o 
         on o.user_id = u.id
    </select>

 

posted @ 2018-12-18 20:15  杜大帅-Rebirth  阅读(540)  评论(0编辑  收藏  举报