Intellij Mybatis连接Mysql数据库进行高级映射查询

这篇主要讲的是表的关联查询,一对一,一对多,多对多以及查询方式
主要的表示用户,商品,订单,订单详情
先来看model:
user.java

package com.fanyafeng.model;

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

/**
 * Author: fanyafeng
 * Data: 16/10/11 14:56
 * Email: fanyafeng@live.cn
 */
public class User {
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    private List<Orders> ordersList;

    public List<Orders> getOrdersList() {
        return ordersList;
    }

    public void setOrdersList(List<Orders> ordersList) {
        this.ordersList = ordersList;
    }

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

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

订单,可以自己分析一下,正常的户一个用户应该关联多个订单,用户的id作为唯一的标识,进行订单的查询。
order.java

package com.fanyafeng.model;

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

/**
 * Author: fanyafeng
 * Data: 16/10/13 16:00
 * Email: fanyafeng@live.cn
 */
public class Orders {
    private int id;
    private int userId;
    private String number;
    private Date createTime;
    private String note;

    private User user;

    private List<OrderDetail> orderDetailList;

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

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

    public User getUser() {
        return user;
    }

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

    public int getId() {
        return id;
    }

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

    public int getUserId() {
        return userId;
    }

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

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

    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", userId=" + userId +
                ", number='" + number + '\'' +
                ", createTime=" + createTime +
                ", note='" + note + '\'' +
                ", user=" + user +
                '}';
    }
}

一张订单会包含多个订单详情
userdetail.java

package com.fanyafeng.model;

/**
 * Author: fanyafeng
 * Data: 16/10/13 15:58
 * Email: fanyafeng@live.cn
 */
public class OrderDetail {
    private int id;
    private int ordersId;
    private int itemsId;
    private int itemsNum;

    private Items items;

    public Items getItems() {
        return items;
    }

    public void setItems(Items items) {
        this.items = items;
    }

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

    @Override
    public String toString() {
        return "OrderDetail{" +
                "id=" + id +
                ", ordersId=" + ordersId +
                ", itemsId=" + itemsId +
                ", itemsNum=" + itemsNum +
                '}';
    }
}

一个订单详情又会包含多个商品
items.java

package com.fanyafeng.model;

import java.util.Date;

/**
 * Author: fanyafeng
 * Data: 16/10/13 15:56
 * Email: fanyafeng@live.cn
 */
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;
    }

    @Override
    public String toString() {
        return "Items{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", detail='" + detail + '\'' +
                ", pic='" + pic + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

model并不是一次全部建好的,都是根据相应的sql语句找的对应信息再去加的相应的属性。
还有一个order的扩展类,用来说明resulttype的
orderscustom.java

package com.fanyafeng.model;

/**
 * Author: fanyafeng
 * Data: 16/10/13 16:06
 * Email: fanyafeng@live.cn
 */
public class OrdersCustom extends Orders {

    private String username;
    private String sex;
    private String address;

    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 "OrdersCustom{" +
                "username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

再来看一下定义的查询接口

package com.fanyafeng.mapper;

import com.fanyafeng.model.Orders;
import com.fanyafeng.model.OrdersCustom;
import com.fanyafeng.model.User;

import java.util.List;

/**
 * Author: fanyafeng
 * Data: 16/10/13 16:11
 * Email: fanyafeng@live.cn
 */
public interface IOrdersCustomMapper {

    public List<OrdersCustom> findUserByOrderId();

    public List<Orders> findUserByOrderIdResultMap();

    public List<Orders> findOrderAndDetailResultMap();

    public List<User> findUserAndOrderDetailResultMap();
}

查询接口所对应的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.fanyafeng.mapper.IOrdersCustomMapper">
    <!--查询订单关联用户信息-->
    <select id="findUserByOrderId" resultType="com.fanyafeng.model.OrdersCustom">
      SELECT
          orders.*, user.username, user.sex, user.address
      FROM
          orders,
          user
      WHERE
          orders.user_id = user.id;
    </select>

    <resultMap id="findUserResultMap" type="com.fanyafeng.model.Orders">
        <!--如果有多个列组成唯一标识,则配置多个id-->
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createTime"/>
        <result column="note" property="note"/>

        <!--配置映射的关联的用户信息-->
        <!--association用于映射关联查询单个对象信息
            property要将关联查询的用户信息映射到orders的那个属性-->
        <association property="user" javaType="com.fanyafeng.model.User">
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>
    <!--使用resultmap查询订单关联用户信息-->
    <select id="findUserByOrderIdResultMap" resultMap="findUserResultMap">
        SELECT
        orders.*, user.username, user.sex, user.address
        FROM
        orders,
        user
        WHERE
        orders.user_id = user.id;
    </select>

    <resultMap id="findOrderDetailResultMap" type="com.fanyafeng.model.Orders" extends="findUserResultMap">
        <!--双id进行去重-->
        <!--订单信息和用户信息可以继承-->
        <!--如果有多个列组成唯一标识,则配置多个id-->
        <!--<id column="id" property="id"/>-->
        <!--<result column="user_id" property="userId"/>-->
        <!--<result column="number" property="number"/>-->
        <!--<result column="createtime" property="createTime"/>-->
        <!--<result column="note" property="note"/>-->

        <!--配置映射的关联的用户信息-->
        <!--association用于映射关联查询单个对象信息
            property要将关联查询的用户信息映射到orders的那个属性-->
        <!--<association property="user" javaType="com.fanyafeng.model.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="orderDetailList" ofType="com.fanyafeng.model.OrderDetail">
            <id column="orderdetail_id" property="id"/>
            <result column="orders_id" property="ordersId"/>
            <result column="items_id" property="itemsId"/>
            <result column="items_num" property="itemsNum"/>
        </collection>
    </resultMap>

    <!--查询用户以及订单明细-->
    <select id="findOrderAndDetailResultMap" resultMap="findOrderDetailResultMap">
        SELECT
          orders.*, user.username, user.sex, user.address,orderdetail.items_id,orderdetail.items_num,orderdetail.orders_id
        FROM
          orders,
          user,
          orderdetail
        WHERE
          orders.user_id = user.id
        AND orderdetail.orders_id = orders.id;
    </select>


    <resultMap id="UserAndOrderDetailResultMap" type="com.fanyafeng.model.User">
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>

        <collection property="ordersList" ofType="com.fanyafeng.model.Orders">
            <id column="order_id" property="id"/>
            <result column="number" property="number"/>
            <result column="createtime" property="createTime"/>
            <result column="note" property="note"/>

            <collection property="orderDetailList" ofType="com.fanyafeng.model.OrderDetail">
                <id column="orderdetail_id" property="id"/>
                <result column="orders_id" property="ordersId"/>
                <result column="items_id" property="itemsId"/>
                <result column="items_num" property="itemsNum"/>

                <association property="items" javaType="com.fanyafeng.model.Items">
                    <id column="items_id" property="id"/>
                    <result column="createtime" property="createTime"/>
                    <result column="items_price" property="price"/>
                    <result column="items_detail" property="detail"/>
                    <result column="item_name" property="name"/>
                </association>

            </collection>


        </collection>
    </resultMap>


    <select id="findUserAndOrderDetailResultMap" resultMap="UserAndOrderDetailResultMap">
        SELECT 
          orders.*,
          user.username,
          user.sex,
          user.address,
          orderdetail.id orderdetail_id,
          orderdetail.items_id,
          orderdetail.items_num,
          orderdetail.orders_id,
          items.name items_name,
          items.detail items_detail,
          items.price items_price
      FROM
          orders,
          user,
          orderdetail,
          items
        WHERE
          orders.user_id = user.id
        AND orderdetail.orders_id = orders.id
        AND orderdetail.items_id = items.id;
    </select>

    <select id="findUserOrdersLazyLoad" resultMap="UserOrdersLazyLoadResultMap">
        SELECT * FROM user
    </select>

</mapper>

这里主要的一个是collection和association代码中都有注释,剩下的就是测试类了,回顾一下其实不难的,还有就是缓存和整合了,再来上一下测试代码:

package test.com.fanyafeng.mapper;

import com.fanyafeng.mapper.IOrdersCustomMapper;
import com.fanyafeng.model.Orders;
import com.fanyafeng.model.OrdersCustom;
import com.fanyafeng.model.User;
import com.fanyafeng.model.UserCustom;
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.util.List;

import static org.junit.Assert.*;

/**
 * Author: fanyafeng
 * Data: 16/10/13 16:23
 * Email: fanyafeng@live.cn
 */
public class IOrdersCustomMapperTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void before() throws Exception {
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("Configuration.xml"));
    }

    @Test
    public void testFindUserByOrderId() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        IOrdersCustomMapper iOrdersCustomMapper = sqlSession.getMapper(IOrdersCustomMapper.class);
//        List<OrdersCustom> userCustomList = iOrdersCustomMapper.findUserByOrderIdResultMap();
//        for (int i = 0; i < userCustomList.size(); i++) {
//            System.out.println(userCustomList.get(i).toString());
//        }

//        List<Orders> ordersList = iOrdersCustomMapper.findOrderAndDetailResultMap();
//        for (int i = 0; i < ordersList.size(); i++) {
//            System.out.println(ordersList.get(i).toString());
//        }

        List<User> userList = iOrdersCustomMapper.findUserAndOrderDetailResultMap();

        sqlSession.close();
    }


}

是不是很简单,这里我是打了断点看的,后文稍微说一下debug,因为和eclipse有点不同,但是比eclipse方便简洁,功能更强大,这里面我借助了一个mysqlbench

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MybatisX是一个用于辅助开发MyBatis的插件,它提供了一些便捷的功能来设计数据库操作语言。下面是使用MybatisX设计数据库操作语言的简要步骤: 1. 安装MybatisX插件:首先,在你使用的开发工具(如IntelliJ IDEA)中,安装并启用MybatisX插件。 2. 创建或导入数据库:确保你有一个数据库,可以使用MySQL、Oracle等任意数据库。你可以使用命令行工具或者图形化工具创建或导入数据库。 3. 配置数据源:在你的项目中,配置数据库连接信息,包括数据库URL、用户名、密码等。这通常在项目的配置文件中完成,如application.properties或application.yml。 4. 创建实体类:使用Java类来映射数据库表结构,每个实体类对应一个数据库表。确保实体类的属性与数据库表的字段一一对应。 5. 创建Mapper接口:创建一个Java接口,用于定义数据库操作的方法。每个方法对应一个SQL语句,并使用注解或XML文件进行映射。 6. 使用MybatisX生成SQL语句:在你的Mapper接口中,使用MybatisX插件提供的功能,例如自动生成SQL语句、快速定位到SQL语句等。 7. 编写业务逻辑:在你的业务代码中,调用Mapper接口中定义的方法来执行数据库操作,例如插入、查询、更新等。 8. 测试和调试:运行你的程序,测试数据库操作是否正确。如果遇到问题,可以使用MybatisX插件提供的调试功能来定位问题。 请注意,这只是一个简要的概述,具体的步骤和配置可能因项目而异。建议参考MybatisX的文档和示例代码来更详细地了解如何使用该插件进行数据库操作语言的设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值