mybatis 关联查询和嵌套查询的简单示例

两个表:

  Customer 顾客表

create table  if not exists customer(
customer_id int primary key auto_increment,
first_name varchar(20),
last_name varchar(20),
company varchar(20),
address varchar(20),
city varchar(20),
state int ,
country varchar(20),
postal_code varchar(20),
phone varchar(11),
fax varchar(11),
email varchar(20),
support_repld int

);

Invoice 发票表
create table if not exists invoice(
invoice_id int primary key auto_increment,
invoice_date date,
billing_address varchar(20),
billing_city varchar(20),
billing_state int ,
billing_country varchar(20),
billing_postalCode varchar(20),
total decimal(10,2),
customer_id int references coustomer(customer_id)
);

1、根据两个表合理创建
2、三个类能正确创建出来,并建立友好关系

要求:1、依据发票的id查询发票的信息,请配置映射,要求Invoice与BillingInfo的实例都能正确创建出来。
   2、假定要依据客户的id,查询出客户及其关联的发票信息,请配置映射。

实体类

  Customer

package com.oukele.entity_invoice;

import java.util.List;

public class Customer {
    private int customerId;
    private String firstName;
    private String lastName;
    private String company;
    private String address;
    private String city;
    private int state;
    private String country;
    private String postalCode;
    private String phone;
    private String fax;
    private String email;
    private int supportRepId;
    private List<Invoice> invoices;

    public int getCustomerId() {
        return customerId;
    }

    public void setCustomerId(int customerId) {
        this.customerId = customerId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getAddress() {
        return address;
    }

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

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getEmail() {
        return email;
    }

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

    public int getSupportRepId() {
        return supportRepId;
    }

    public void setSupportRepId(int supportRepId) {
        this.supportRepId = supportRepId;
    }

    public List<Invoice> getInvoices() {
        return invoices;
    }

    public void setInvoices(List<Invoice> invoices) {
        this.invoices = invoices;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "customerId=" + customerId +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", company='" + company + '\'' +
                ", address='" + address + '\'' +
                ", city='" + city + '\'' +
                ", state=" + state +
                ", country='" + country + '\'' +
                ", postalCode='" + postalCode + '\'' +
                ", phone='" + phone + '\'' +
                ", fax='" + fax + '\'' +
                ", email='" + email + '\'' +
                ", supportRepId=" + supportRepId +
                ", invoices=" + invoices +
                '}';
    }
}
View Code

  BillingInfo

package com.oukele.entity_invoice;

public class BillingInfo {

    private String billingAddress;
    private String billingCity;
    private int billingState;
    private String billingCountry;
    private String billingPostalCode;

    public BillingInfo() {
    }

    public String getBillingAddress() {
        return billingAddress;
    }

    public void setBillingAddress(String billingAddress) {
        this.billingAddress = billingAddress;
    }

    public String getBillingCity() {
        return billingCity;
    }

    public void setBillingCity(String billingCity) {
        this.billingCity = billingCity;
    }

    public int getBillingState() {
        return billingState;
    }

    public void setBillingState(int billingState) {
        this.billingState = billingState;
    }

    public String getBillingCountry() {
        return billingCountry;
    }

    public void setBillingCountry(String billingCountry) {
        this.billingCountry = billingCountry;
    }

    public String getBillingPostalCode() {
        return billingPostalCode;
    }

    public void setBillingPostalCode(String billingPostalCode) {
        this.billingPostalCode = billingPostalCode;
    }

    @Override
    public String toString() {
        return "BillingInfo{" +
                "billingAddress='" + billingAddress + '\'' +
                ", billingCity='" + billingCity + '\'' +
                ", billingState=" + billingState +
                ", billingCountry='" + billingCountry + '\'' +
                ", billingPostalCode='" + billingPostalCode + '\'' +
                '}';
    }
}
View Code

 Invoice

package com.oukele.entity_invoice;

import java.util.Date;

public class Invoice {
    private int invoiceId;
    private Date invoiceDate;
    private Customer customer;
    private BillingInfo billingInfo;
    private long total;

    public Invoice() {
    }

    public int getInvoiceId() {
        return invoiceId;
    }

    public Customer getCoustomer() {
        return customer;
    }

    public void setCoustomer(Customer customer) {
        this.customer = customer;
    }

    public void setInvoiceId(int invoiceId) {
        this.invoiceId = invoiceId;
    }

    public Date getInvoiceDate() {
        return invoiceDate;
    }

    public void setInvoiceDate(Date invoiceDate) {
        this.invoiceDate = invoiceDate;
    }

    public BillingInfo getBillingInfo() {
        return billingInfo;
    }

    public void setBillingInfo(BillingInfo billingInfo) {
        this.billingInfo = billingInfo;
    }

    public long getTotal() {
        return total;
    }

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

    @Override
    public String toString() {
        return "Invoice{" +
                "invoiceId=" + invoiceId +
                ", invoiceDate=" + invoiceDate +
                ", customer=" + customer +
                ", billingInfo=" + billingInfo +
                ", total=" + total +
                '}';
    }
}
View Code

mybatis配置文件

<?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 resource="jdbc.properties"></properties>

    <settings>
        <!--<setting name="autoMappingBehavior " value="FULL"/>-->
        <!--配置驼峰映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--设置别名,简化映射xml的完全限制名的使用-->
    <typeAliases>
        <!--手动-->
        <!--<typeAlias alias="Lnvoice" type="com.oukele.entity.LnvoiceEntity"/>-->
        <!--自动-->
        <package name="com.oukele.entity_invoice"/> <!-- 可以使用 @Alias 注解 -->
        <package name="com.oukele.entity"/>
    </typeAliases>

<!--数据源-->
    <environments default="development">
        <environment id="development">
            <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>
<!--映射文件-->
    <mappers>
        <mapper resource="mapper/EntityMapper2.xml"/>
    </mappers>

</configuration>
View Code

接口方法

映射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.oukele.dao.IEntity2">

    <!-- start 关联查询-->
    <!-- 得到属于Invoice的数据-->
    <select id="getInvoiceById" resultMap="rmInvoice">
       select i.*,c.* from invoice i left join customer c on i.customer_id=c.customer_id  where i.invoice_id=#{id}
    </select>

    <!-- 得到属于Customer的数据 -->
    <select id="getCustomerById" resultMap="rmCustomer">
         select i.*,c.* from invoice i left join customer c on i.customer_id=c.customer_id  where i.customer_id=#{id}
    </select>

    <!--填充Customer类的数据 -->
    <resultMap id="rmCustomer" autoMapping="true" type="Customer">
        <!--使用递归关系     Customer类中的 invoices 要输出要删除,不然会造成递归死循环  -->
        <collection property="invoices" ofType="Invoice" resultMap="rmInvoice" autoMapping="true" javaType="java.util.ArrayList"/>
     </resultMap>

    <!--填充 Invoice类 的数据 -->
    <resultMap id="rmInvoice" autoMapping="true" type="Invoice">
        <association property="billingInfo" autoMapping="true" javaType="BillingInfo"/>
        <association property="customer" autoMapping="true" resultMap="rmCustomer" javaType="Customer"/>
    </resultMap>
    <!--end 关联查询-->

    <!-- start 嵌套查询-->
    <select id="getInvoiceById" parameterType="int" resultMap="rmInvoice">
       select * from invoice  where invoice_id=#{id}
    </select>

    <select id="getBillingInfoById" parameterType="int" resultType="BillingInfo" >
       select
            billing_address,
            billing_city,
            billing_country,
            billing_postalCode,
            billing_state
        from invoice where invoice_id=#{id}
    </select>

    <select id="getCustomerById" resultType="Customer" parameterType="int">
        select c.*,i.* from customer c left  join invoice i on c.customer_id=i.customer_id where i.invoice_id=#{id}
    </select>

    <resultMap id="rmInvoice" autoMapping="true" type="Invoice">
        <association property="billingInfo" autoMapping="true"  column="invoice_id" select="getBillingInfoById"></association>
        <collection property="customer" ofType="Customer" column="invoice_id" select="getCustomerById"></collection>
    </resultMap>
    <!--end 嵌套查询-->

</mapper>
View Code

 

posted @ 2018-10-18 19:47  追梦滴小蜗牛  阅读(4803)  评论(0编辑  收藏  举报