1. 程式人生 > >ssm框架學習---mybatis中處理一對一對應關係

ssm框架學習---mybatis中處理一對一對應關係

1,對於一對一對應關係,有兩種方式來實現

(1)一種是使用resultType,這個有一個要求就是查詢出來的列和返回的java物件的列的名稱需要對應,這裡我們想要實現依據訂單來查詢對應訂單的下單使用者的資訊的查詢,因此需要們自己建立pojo,首先給出客戶,訂單,商品的定義類如下:

package com.ajin.mybatis.model;

/**
 * Created by ajin on 16-12-19.
 */
public class Customer {
    private int cno;
    private String cname;
    private String csex;
    private String cphone;

    public int getCno() {
        return cno;
    }

    public void setCno(int cno) {
        this.cno = cno;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public String getCsex() {
        return csex;
    }

    public void setCsex(String csex) {
        this.csex = csex;
    }

    public String getCphone() {
        return cphone;
    }

    public void setCphone(String cphone) {
        this.cphone = cphone;
    }

    public String getCaddress() {
        return caddress;
    }

    public void setCaddress(String caddress) {
        this.caddress = caddress;
    }

    private String caddress;

}
package com.ajin.mybatis.model;

/**
 * Created by ajin on 16-12-19.
 */
public class Orders {
    private int ono;
    private String otime;
    private int cno;
    private int gno;

    public int getOno() {
        return ono;
    }

    public void setOno(int ono) {
        this.ono = ono;
    }

    public String getOtime() {
        return otime;
    }

    public void setOtime(String otime) {
        this.otime = otime;
    }

    public int getCno() {
        return cno;
    }

    public void setCno(int cno) {
        this.cno = cno;
    }

    public int getGno() {
        return gno;
    }

    public void setGno(int gno) {
        this.gno = gno;
    }

    @Override
    public String toString() {
        return "Orders{" +
                "ono=" + ono +
                ", otime='" + otime + '\'' +
                ", cno=" + cno +
                ", gno=" + gno +
                '}';
    }
}
package com.ajin.mybatis.model;

/**
 * Created by ajin on 16-12-19.
 */
public class Goods {
    private int gno;
    private String gname;

    public int getGno() {
        return gno;
    }

    public void setGno(int gno) {
        this.gno = gno;
    }

    public String getGname() {
        return gname;
    }

    public void setGname(String gname) {
        this.gname = gname;
    }

    public String getGtype() {
        return gtype;
    }

    public void setGtype(String gtype) {
        this.gtype = gtype;
    }

    public float getGprice() {
        return gprice;
    }

    public void setGprice(float gprice) {
        this.gprice = gprice;
    }

    private String gtype;
    private float gprice;

}
下面我們主查詢是訂單,並附屬查詢使用者的姓名和電話,因此定義自己的pojo如下:繼承Orders類
package com.ajin.mybatis.model;

/**
 * Created by ajin on 16-12-19.
 */
public class OrdersCustomer extends Orders {
    private String cname;

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public String getCphone() {
        return cphone;
    }

    public void setCphone(String cphone) {
        this.cphone = cphone;
    }

    private String cphone;

    @Override
    public String toString() {
        return "OrdersCustomer{" +
                "ono='" + this.getOno() + '\'' +
                "otime='" + this.getOtime() + '\'' +
                "cno='" + this.getCno() + '\'' +
                "gno='" + this.getGno() + '\'' +
                "cname='" + cname + '\'' +
                ", cphone='" + cphone + '\'' +
                '}';
    }
}
然後寫我們的mapper.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.ajin.mybatis.mapper.OrdersCustomerMapper">
    <!--一對一查詢,查詢訂單的時候,附帶查出訂單的使用者資訊
      1.首先編寫輸入引數型別,比如依據訂單的編號
      2.返回型別:單獨的model依據上面的要求肯定不能滿足,需要自己定義pojo
      (1)第一種方式:使用resultType 在定義pojo時,要看以那個為主,這樣可以選擇繼承一個類,然後再把其它的屬性加入
                    因為resultType要求在使用的時候查詢出來的屬性名和pojo的物件屬性名稱對應
    -->
    <select id="selectOrdersCustomerById" parameterType="int" resultType="com.ajin.mybatis.model.OrdersCustomer">
        select orders.*,customer.cname,customer.cphone from orders,customer
        where orders.cno =customer.cno
            and orders.ono =#{value}
    </select>

</mapper>
它所對應的mapper介面定義如下:
package com.ajin.mybatis.mapper;

import com.ajin.mybatis.model.OrdersCustomer;

/**
 * Created by ajin on 16-12-19.
 */
public interface OrdersCustomerMapper {
    public OrdersCustomer selectOrdersCustomerById(int id);
}
然後將我們的mapper.xml檔案加到mybatis的配置檔案中,最後測試程式碼如下:
package com.ajin.mybatis.mapper;

import com.ajin.mybatis.model.OrdersCustomer;
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.io.InputStream;

import static org.junit.Assert.*;

/**
 * Created by ajin on 16-12-19.
 */
public class OrdersCustomerMapperTest {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception {
        String resource = "config/SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }


    @Test
    public void selectOrdersCustomerById() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            OrdersCustomerMapper ordersCustomerMapper = sqlSession.getMapper(OrdersCustomerMapper.class);
            OrdersCustomer ordersCustomer=ordersCustomerMapper.selectOrdersCustomerById(2);
            System.out.println(ordersCustomer);
        }finally {

        }
    }

}

(2)第二種方式,使用resultMap,這種方式就是需要定義resultMap,並適用與需要延遲載入的情況

主要就是resultmap的編寫如下:

<?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.ajin.mybatis.mapper.OrdersCustomerMapper">
    <!--一對一查詢,查詢訂單的時候,附帶查出訂單的使用者資訊
      1.首先編寫輸入引數型別,比如依據訂單的編號
      2.返回型別:單獨的model依據上面的要求肯定不能滿足,需要自己定義pojo
      (1)第一種方式:使用resultType 在定義pojo時,要看以那個為主,這樣可以選擇繼承一個類,然後再把其它的屬性加入
                    因為resultType要求在使用的時候查詢出來的屬性名和pojo的物件屬性名稱對應
    -->
    <!--<select id="selectOrdersCustomerById" parameterType="int" resultType="com.ajin.mybatis.model.OrdersCustomer">-->
        <!--select orders.*,customer.cname,customer.cphone from orders,customer-->
        <!--where orders.cno =customer.cno-->
            <!--and orders.ono =#{value}-->
    <!--</select>-->
    <!--(2)第二種方式:使用resultMap,自己定義resultMap-->
    <resultMap id="selectOrdersCustomerMap" type="com.ajin.mybatis.model.OrdersCustomerMap">
        <!-- 配置orders的id和一般屬性-->
        <id column="ono" property="ono"></id>
        <result column="otime" property="otime"></result>
        <result column="gno" property="gno"></result>
        <result column="cno" property="cno"></result>
        <!-- 配置關聯的Customer的屬性,將下面查詢出來的Customer的屬性對映到orderCustomermap裡面的customer屬性中-->
        <association property="customer" javaType="com.ajin.mybatis.model.Customer">
            <id column="cno" property="cno"></id>
            <result column="cname" property="cname"></result>
            <result column="cphone" property="cphone"></result>
        </association>
    </resultMap>
    <select id="selectOrdersCustomerMapById" parameterType="int" resultMap="selectOrdersCustomerMap">
        select orders.*,customer.cname,customer.cphone from orders,customer
        where orders.cno =customer.cno
        and orders.ono =#{value}
    </select>


</mapper>
返回型別定義如下:
package com.ajin.mybatis.model;

/**
 * Created by ajin on 16-12-19.
 */
public class OrdersCustomerMap extends Orders {
    private Customer customer;

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
}
對應的介面和測試如下:
package com.ajin.mybatis.mapper;

import com.ajin.mybatis.model.OrdersCustomerMap;
import com.ajin.mybatis.model.OrdersCustomer;

/**
 * Created by ajin on 16-12-19.
 */
public interface OrdersCustomerMapper {
    public OrdersCustomer selectOrdersCustomerById(int id);
    public OrdersCustomerMap selectOrdersCustomerMapById(int id);
}
@Test
    public void selectOrdersCustomerMapById() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            OrdersCustomerMapper ordersCustomerMapper = sqlSession.getMapper(OrdersCustomerMapper.class);
            OrdersCustomerMap ordersCustomer=ordersCustomerMapper.selectOrdersCustomerMapById(5);
            System.out.println(ordersCustomer);
        }finally {
            sqlSession.close();
        }
    }

一對一對應關係resultmap中,主要使用到了association這個標籤,


相關推薦

ssm框架學習---mybatis處理一對一對應關係

1,對於一對一對應關係,有兩種方式來實現 (1)一種是使用resultType,這個有一個要求就是查詢出來的列和返回的java物件的列的名稱需要對應,這裡我們想要實現依據訂單來查詢對應訂單的下單使用者的資訊的查詢,因此需要們自己建立pojo,首先給出客戶,訂單,商品的定義類

ssm框架學習---mybatis快取

快取的目的:將部分資料快取到記憶體中,提高系統的效能 一級快取:它是sqlsession級別的,每個sqlsession物件內部都有一個hashmap用來存放查詢的資料,mybatis中預設時開啟的 (1)當執行查詢時,首先如果是第一次查詢,會從資料庫中查詢並將結果快取到一

ssm框架學習---mybatis延遲載入實現

在處理查詢結果中,如果需要延遲載入,即屬於對查詢結果有要求的那種,需要使用resultMap來實現,並結合association或者collection, 引入延遲載入的目的:單表或者簡單聯合查詢速度較快,通過延遲載入可以按需載入,減輕資料庫的壓力。 假設需求時查詢訂單時延

ssm框架學習---mybatis動態sql的if片段

1.if判斷,比如多個條件查詢中,如果某個條件不為空,才將查詢內容拼接上去 首先還是編寫mapper.xml檔案如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PU

SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映和多表查詢

SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映(多表查詢) 問題情境:比如有張表,使用者和使用者詳情,這兩張表裡面沒長表都有一個id欄位,這兩個表的id欄位都是對應的。 實體類裡面分別對應兩個實體類,user和userdetail,還有一個很重要的實

ssm框架學習---開發使用springMVC接收引數的問題

首先說下什麼是引數繫結:從客戶端的請求key-value,經過引數繫結,將資料繫結到controller的方法形參上 過程:客戶端請求----處理器介面卡呼叫springmvc提供的引數繫結組建將key/value資料轉化成controller方法的形參上(引數繫結組建,現

ssm框架學習---mybatis學習檔案結構和程式碼示例

準備工作:mybatis的jar包,資料庫的驅動包,日誌log4j和單元測試的包 開發模式:(1)基於原始dao開發,需要編寫dao介面和dao介面的實現類                     (2)基於mapper開發,只需編寫dao介面,但是需要遵守一定規範(對映檔

JavaWeb學習之路——SSM框架Mybatis(二)

1.簡介: 框架: 是整個或部分系統的可重用設計,表現為一組抽象構件及構件例項間互動的方法;另一種定義認為,框架是可被應用開發者定製的應用骨架。前者是從應用方面而後者是從目的方面給出的定義。它是一個半成品,一個框架是在一個給定的問題領域內,一個應用程式的一部分設計與實現。

JavaWeb學習之路——SSM框架Mybatis(三)

前提:JavaWeb學習之路——SSM框架之Mybatis(二) 1.目錄結構 2.目錄解釋: src下: pojo包:寫java檔案 serverlet包:寫serverlet檔案 service包:寫介面和它的實現類 mapper包:用來配置資料

SSM框架學習筆記_[Spring+SpringMVC+Mybatis]_前言_目錄

前言 本筆記用於記錄本人(Steven)的SSM框架學習歷程,僅用作學習、交流,不用於商業用途,侵權必究。 雖然現在流行前後臺分離,一般用SpringBoot + Vue,但後端裡面一些基本的知識點還是來源於SSM等基本框架。 由於前期本筆記是用word記錄的,後來發現錯誤更正、保持版本等一致比較麻煩,因此打

SSM框架——使用MyBatis Generator自動創建代碼【轉】

jar包 mage blank 使用 log hub java == date 最近要開發個小工具,所以又自學了下SSM框架,以下是參考網文 通過自己實踐修改,親測通過。     這兩天需要用到MyBatis的代碼自動生成的功能,由於MyBatis屬於一種半自動的ORM

Mybatis處理sql的大於號小於號

字符替換 mybatis str tab amp 不能 [ ] pos table 因為xml格式中,不能隨便出現"<"、“>”等符號,所以在sql中這一類的符號要進行特殊處理 第一種方法:使用轉義字符替換特殊的符號   例如 SELECT * FROM j

SSM框架——使用MyBatis Generator自動創建代碼

csdn shu tle title gmv nbsp post log targe SSM框架——使用MyBatis Generator自動創建代碼 這是通過命令行, 不用ide插件. 若在IDEA中通過插件generator, 還可以參

SSM框架的sql參數註入(#和$的區別)

沒有 result ddr 其他 防止 date_time ${} ext post 1 <select id="findUsersByUserName2" resultType="java.util.Map" parameterType="Params">

接口測試學習——Jmeter處理json

inf 使用 分析 spa 不用 不能 添加 www. 返回 我們在做http接口測試的時候,返回的數據都是json串,Jmeter中本身是不支持直接處理json串的,如果要獲取到返回結果中指定的值,必須要要通過正則表達式來獲取到,正則表達式比較麻煩,寫錯了就獲取不到值了,

SSM框架Mybatis的SQL對映檔案寫法

1、單個引數 // UserMapper.java public interface UserMapper { public List<User> getUserListByUserName(String userName); } // UserM

轉:ssm spring+springmvc+mybatis的xml配置檔案詳解

這幾天一直在整合SSM框架,雖然網上有很多已經整合好的,但是對於裡面的配置檔案並沒有進行過多的說明,很多人知其然不知其所以然,經過幾天的搜尋和整理,今天總算對其中的XML配置檔案有了一定的瞭解,所以拿出來一起分享一下,希望有不足的地方大家批評指正~~~ 首先   這篇文章暫時只對框架中所要用到的配

基於ssm框架mybatis對映檔案的多對一返回型別的junit4單元測試

本專案使用maven搭建的ssm框架,大致的檔案結構如圖: 1、首先是pom.xml中所依賴的一些jar包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/

框架學習--mybatis--02

四、快取 1、介紹 (1)作用:就是提升查詢的效率; (2)分類: 一緩(本地快取):session 級別的快取,預設開啟,session關閉則失效; 二緩(全域性快取):namespace級別的快取,要手動開啟; 2、一級快取 (1)一級快取失效的四種情況

框架學習--mybatis--01

一、簡介 1、概念 mybatis 是一個半自動輕量級的一個 orm 框架 2、作用 將 java 與 sql 分離,解決了 jdbc 的硬編碼問題,方便 sql 的修改; sql 由開發人員控制,更加方便 sql 的調優; 3、快速開始 (1)原始