亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mybatis關(guān)聯(lián)關(guān)系映射的實(shí)現(xiàn)

 更新時(shí)間:2023年09月05日 09:39:06   作者:Ar.小白  
MyBatis的關(guān)聯(lián)關(guān)系映射在復(fù)雜數(shù)據(jù)模型中至關(guān)重要,使開(kāi)發(fā)人員能夠以最靈活的方式滿足不同項(xiàng)目的需求,本文就來(lái)介紹一下mybatis關(guān)聯(lián)關(guān)系映射的實(shí)現(xiàn),感興趣的可以了解一下

1. 介紹

在當(dāng)今的軟件開(kāi)發(fā)中,與數(shù)據(jù)庫(kù)進(jìn)行交互是一項(xiàng)至關(guān)重要的任務(wù)。開(kāi)發(fā)人員需要能夠輕松、高效地執(zhí)行數(shù)據(jù)庫(kù)操作,同時(shí)又要保持代碼的可維護(hù)性和靈活性。這正是MyBatis這個(gè)數(shù)據(jù)庫(kù)訪問(wèn)框架應(yīng)運(yùn)而生的背景所在。

背景

數(shù)據(jù)庫(kù)是許多應(yīng)用程序的核心組成部分,用于存儲(chǔ)和管理數(shù)據(jù)。然而,與數(shù)據(jù)庫(kù)進(jìn)行交互通常涉及到編寫(xiě)大量的SQL查詢語(yǔ)句,以及處理結(jié)果集和數(shù)據(jù)庫(kù)連接等繁瑣的任務(wù)。這不僅使開(kāi)發(fā)工作復(fù)雜化,還容易引入安全漏洞和性能問(wèn)題。

在過(guò)去,JDBC(Java Database Connectivity)是與數(shù)據(jù)庫(kù)交互的主要方式,它要求開(kāi)發(fā)人員手動(dòng)管理數(shù)據(jù)庫(kù)連接、編寫(xiě)SQL語(yǔ)句和處理結(jié)果集。這種方式存在以下挑戰(zhàn):

  • 冗余的代碼: 大量的重復(fù)性代碼需要編寫(xiě),包括數(shù)據(jù)庫(kù)連接的打開(kāi)和關(guān)閉、SQL語(yǔ)句的編寫(xiě)等。

  • 硬編碼的SQL: SQL語(yǔ)句通常是硬編碼在Java代碼中的,這使得維護(hù)和修改變得困難。

  • 安全性問(wèn)題: 由于直接拼接SQL語(yǔ)句,容易受到SQL注入攻擊的威脅。

  • 缺乏靈活性: 難以處理復(fù)雜的數(shù)據(jù)庫(kù)操作,如對(duì)象關(guān)系映射(ORM)和復(fù)雜的查詢。

MyBatis的出現(xiàn)解決了這些問(wèn)題,為Java開(kāi)發(fā)人員提供了一個(gè)強(qiáng)大的數(shù)據(jù)庫(kù)訪問(wèn)框架,它背后的核心理念是將SQL語(yǔ)句從Java代碼中解耦,同時(shí)提供了豐富的映射和查詢功能。

MyBatis的特點(diǎn)

MyBatis具有許多優(yōu)點(diǎn),使其成為數(shù)據(jù)庫(kù)訪問(wèn)的首選框架之一:

  • SQL和Java代碼的分離: MyBatis允許將SQL語(yǔ)句從Java代碼中獨(dú)立出來(lái),存儲(chǔ)在XML文件或注解中,使代碼更易維護(hù)和管理。

  • 強(qiáng)大的參數(shù)映射: MyBatis支持多種參數(shù)映射方式,包括基本類型、POJO對(duì)象和Map等,使得傳遞參數(shù)變得靈活。

  • 靈活的結(jié)果映射: 可以將查詢結(jié)果映射到Java對(duì)象中,支持一對(duì)一、一對(duì)多和多對(duì)多等關(guān)系映射。

  • 自動(dòng)資源管理: MyBatis自動(dòng)管理數(shù)據(jù)庫(kù)連接的打開(kāi)和關(guān)閉,減輕了開(kāi)發(fā)人員的負(fù)擔(dān)。

  • 動(dòng)態(tài)SQL支持: MyBatis允許在SQL中使用動(dòng)態(tài)條件,根據(jù)不同情況生成不同的SQL語(yǔ)句。

  • 性能優(yōu)化: MyBatis提供了緩存機(jī)制,可以提高查詢性能,同時(shí)還支持延遲加載。

  • 豐富的插件機(jī)制: 可以通過(guò)插件擴(kuò)展MyBatis的功能,滿足不同項(xiàng)目的需求。

在數(shù)據(jù)庫(kù)中,數(shù)據(jù)通常存儲(chǔ)在多個(gè)相關(guān)聯(lián)的表中,這些表之間存在各種復(fù)雜的關(guān)系,如一對(duì)一、一對(duì)多和多對(duì)多。為了有效地操作這些復(fù)雜的數(shù)據(jù)模型,引入了關(guān)聯(lián)關(guān)系映射的概念,它在復(fù)雜數(shù)據(jù)模型中扮演著至關(guān)重要的角色。

什么是關(guān)聯(lián)關(guān)系映射?

關(guān)聯(lián)關(guān)系映射是將多個(gè)表之間的關(guān)聯(lián)關(guān)系映射到程序中的對(duì)象模型的過(guò)程。它的核心目標(biāo)是:

  • 將數(shù)據(jù)庫(kù)表之間的關(guān)系抽象成對(duì)象之間的關(guān)系。
  • 允許通過(guò)對(duì)象操作來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作,而不是直接使用SQL語(yǔ)句。

這個(gè)概念的核心思想是將數(shù)據(jù)庫(kù)的復(fù)雜性隱藏在應(yīng)用程序的背后,使開(kāi)發(fā)人員能夠更自然地處理數(shù)據(jù),而不必深入了解數(shù)據(jù)庫(kù)的結(jié)構(gòu)和關(guān)系。

為什么關(guān)聯(lián)關(guān)系映射在復(fù)雜數(shù)據(jù)模型中重要?

在復(fù)雜的數(shù)據(jù)模型中,表之間的關(guān)系往往非常復(fù)雜,可能包括:

一對(duì)一關(guān)系: 例如,一個(gè)用戶只有一個(gè)個(gè)人詳細(xì)信息,或一個(gè)訂單只有一個(gè)送貨地址。

一對(duì)多關(guān)系: 例如,一個(gè)作者可以有多本書(shū),一個(gè)班級(jí)可以有多名學(xué)生。

多對(duì)多關(guān)系: 例如,多名學(xué)生可以選擇多門(mén)課程,需要通過(guò)關(guān)聯(lián)表進(jìn)行映射。

在處理這些復(fù)雜的關(guān)系時(shí),直接使用原始的SQL查詢和結(jié)果集映射將變得非常繁瑣和復(fù)雜。這里是為什么關(guān)聯(lián)關(guān)系映射如此重要的原因:

  • 抽象復(fù)雜性: 關(guān)聯(lián)關(guān)系映射將數(shù)據(jù)庫(kù)的復(fù)雜性抽象成了對(duì)象模型,使開(kāi)發(fā)人員無(wú)需深入了解數(shù)據(jù)庫(kù)細(xì)節(jié),從而簡(jiǎn)化了開(kāi)發(fā)過(guò)程。

  • 提高可維護(hù)性: 通過(guò)將關(guān)系映射到對(duì)象,可以更容易地維護(hù)代碼,因?yàn)閷?duì)象模型更加直觀和可理解。

  • 提高開(kāi)發(fā)效率: 關(guān)聯(lián)關(guān)系映射框架可以自動(dòng)生成大部分?jǐn)?shù)據(jù)庫(kù)操作代碼,減少了手動(dòng)編寫(xiě)SQL語(yǔ)句的工作量。

  • 增加靈活性: 關(guān)聯(lián)關(guān)系映射允許進(jìn)行高級(jí)查詢和復(fù)雜操作,而不需要深入了解SQL的復(fù)雜性。

  • 降低錯(cuò)誤風(fēng)險(xiǎn): 通過(guò)將關(guān)系映射到對(duì)象,可以減少手動(dòng)編寫(xiě)SQL時(shí)可能引入的錯(cuò)誤,如拼寫(xiě)錯(cuò)誤或SQL注入。

總之,關(guān)聯(lián)關(guān)系映射在復(fù)雜數(shù)據(jù)模型中是非常重要的,它提供了一種更高級(jí)、更抽象的方式來(lái)處理數(shù)據(jù)庫(kù)操作,使開(kāi)發(fā)人員能夠更輕松地應(yīng)對(duì)復(fù)雜性,提高代碼的可維護(hù)性和開(kāi)發(fā)效率。這正是許多現(xiàn)代應(yīng)用程序開(kāi)發(fā)中不可或缺的一部分。

2. 一對(duì)一關(guān)系映射

一對(duì)一關(guān)系映射是指兩個(gè)實(shí)體之間存在唯一的對(duì)應(yīng)關(guān)系,即一個(gè)實(shí)體只能與另一個(gè)實(shí)體相對(duì)應(yīng)。例如,一個(gè)人只能有一個(gè)身份證號(hào)碼,一個(gè)身份證號(hào)碼也只能對(duì)應(yīng)一個(gè)人。

一對(duì)一關(guān)系映射: 在數(shù)據(jù)庫(kù)中,可以通過(guò)在一個(gè)實(shí)體表中添加一個(gè)外鍵來(lái)映射一對(duì)一關(guān)系。例如,假設(shè)我們有兩個(gè)實(shí)體表:Person(人)和IDCard(身份證)。每個(gè)人只能有一個(gè)身份證,而每個(gè)身份證也只能對(duì)應(yīng)一個(gè)人。我們可以在Person表中添加一個(gè)外鍵IDCardID,將其與IDCard表的主鍵IDCardID關(guān)聯(lián)起來(lái)。這樣,每個(gè)Person實(shí)體都會(huì)有一個(gè)唯一的IDCardID,從而建立了一對(duì)一的關(guān)系。

 配置generatoeConfig文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <!-- 引入配置文件 -->
    <properties resource="jdbc.properties"/>
    <!--指定數(shù)據(jù)庫(kù)jdbc驅(qū)動(dòng)jar包的位置-->
    <classPathEntry location="C:\\temp2\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    <!-- 一個(gè)數(shù)據(jù)庫(kù)一個(gè)context -->
    <context id="infoGuardian">
        <!-- 注釋 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!-- 是否取消注釋 -->
            <property name="suppressDate" value="true"/> <!-- 是否生成注釋代時(shí)間戳 -->
        </commentGenerator>
        <!-- jdbc連接 -->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
        <!-- 類型轉(zhuǎn)換 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自動(dòng)轉(zhuǎn)化以下類型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 01 指定javaBean生成的位置 -->
        <!-- targetPackage:指定生成的model生成所在的包名 -->
        <!-- targetProject:指定在該項(xiàng)目下所在的路徑  -->
        <javaModelGenerator targetPackage="com.zking.model"
                            targetProject="src/main/java">
            <!-- 是否允許子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否對(duì)model添加構(gòu)造函數(shù) -->
            <property name="constructorBased" value="true"/>
            <!-- 是否針對(duì)string類型的字段在set的時(shí)候進(jìn)行trim調(diào)用 -->
            <property name="trimStrings" value="false"/>
            <!-- 建立的Model對(duì)象是否 不可改變  即生成的Model對(duì)象不會(huì)有 setter方法,只有構(gòu)造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>
        <!-- 02 指定sql映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.zking.mapper"
                         targetProject="src/main/java">
            <!-- 是否允許子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!-- 03 生成XxxMapper接口 -->
        <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper對(duì)象 -->
        <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相應(yīng)的Mapper對(duì)象 -->
        <!-- type="XMLMAPPER",生成SQLMap XML文件和獨(dú)立的Mapper接口 -->
        <javaClientGenerator targetPackage="com.zking.mapper"
                             targetProject="src/main/java" type="XMLMAPPER">
            <!-- 是否在當(dāng)前路徑下新加一層schema,false路徑com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- 配置表信息 -->
        <!-- schema即為數(shù)據(jù)庫(kù)名 -->
        <!-- tableName為對(duì)應(yīng)的數(shù)據(jù)庫(kù)表 -->
        <!-- domainObjectName是要生成的實(shí)體類 -->
        <!-- enable*ByExample是否生成 example類 -->
        <!--<table schema="" tableName="t_book" domainObjectName="Book"-->
        <!--enableCountByExample="false" enableDeleteByExample="false"-->
        <!--enableSelectByExample="false" enableUpdateByExample="false">-->
        <!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;-->
        <!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;-->
        <!--&lt;!&ndash; 指定列的java數(shù)據(jù)類型 &ndash;&gt;-->
        <!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;-->
        <!--</table>-->
        <table schema="" tableName="t_hibernate_book" domainObjectName="HBook"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>
        <table schema="" tableName="t_hibernate_book_category" domainObjectName="HBookCategory"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>
        <table schema="" tableName="t_hibernate_category" domainObjectName="HCategory"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>
        <table schema="" tableName="t_hibernate_order" domainObjectName="Order"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>
        <table schema="" tableName="t_hibernate_order_item" domainObjectName="OrderItem"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>
    </context>
</generatorConfiguration>

OrderItemVo

package com.liao.vo;
import com.liao.model.Order;
import com.liao.model.OrderItem;
public class OrderItemVo extends OrderItem {
    private Order order;
    public Order getOrder() {
        return order;
    }
    public void setOrder(Order order) {
        this.order = order;
    }
}
 

OrderItemMapper.xml

<resultMap id="OrderItemMap" type="com.liao.vo.OrderItemVo" >
    <result column="order_item_id" property="orderItemId" ></result>
    <result column="product_id" property="productId" ></result>
    <result column="quantity" property="quantity" ></result>
    <result column="oid" property="oid" ></result>
    <association property="order" javaType="com.liao.model.Order">
      <result column="order_id" property="orderId" ></result>
      <result column="order_no" property="orderNo" ></result>
    </association>
  </resultMap>
  <select id="selectByBiid" resultMap="OrderItemMap" parameterType="java.lang.Integer" >
  SELECT * FROM
  t_hibernate_order o ,
  t_hibernate_order_item oi
  WHERE o.order_id = oi.oid
  AND oi.order_item_id = #{oiid}
</select>

OrderItemBiz

package com.liao.biz;
import com.liao.vo.OrderItemVo;
public interface OrderItemBiz {
    OrderItemVo selectByBiid(Integer oiid);
}

實(shí)現(xiàn)OrderItemBiz接口,創(chuàng)建 OrderItemBizImpl 

package com.liao.biz;
import com.liao.mapper.OrderItemMapper;
import com.liao.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class OrderItemBizImpl implements OrderItemBiz {
    @Autowired
    private OrderItemMapper orderItemMapper;
    @Override
    public OrderItemVo selectByBiid(Integer oiid) {
        return orderItemMapper.selectByBiid(oiid);
    }
}

測(cè)試

package com.liao.biz;
import com.liao.vo.OrderItemVo;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class Test01 {
? ? @Autowired
? ? private OrderItemBiz orderItemBiz;
? ? @Before
? ? public void setUp() throws Exception {
? ? }
? ? @After
? ? public void tearDown() throws Exception {
? ? }
? ? @Test
? ? public void selectByBiid() {
? ? ? ? OrderItemVo orderItemVo = orderItemBiz.selectByBiid(27);
? ? ? ? System.out.println(orderItemVo);
? ? ? ? System.out.println(orderItemVo.getOrder());
? ? }
}

3. 一對(duì)多關(guān)系映射

一對(duì)多關(guān)系映射是指一個(gè)實(shí)體可以與多個(gè)實(shí)體相對(duì)應(yīng),而多個(gè)實(shí)體只能與一個(gè)實(shí)體相對(duì)應(yīng)。例如,一個(gè)班級(jí)可以有多個(gè)學(xué)生,但一個(gè)學(xué)生只能屬于一個(gè)班級(jí)。

一對(duì)多關(guān)系映射: 在數(shù)據(jù)庫(kù)中,可以通過(guò)在多的一方實(shí)體表中添加一個(gè)外鍵來(lái)映射一對(duì)多關(guān)系。例如,假設(shè)我們有兩個(gè)實(shí)體表:Department(部門(mén))和Employee(員工)。一個(gè)部門(mén)可以有多個(gè)員工,而一個(gè)員工只能屬于一個(gè)部門(mén)。我們可以在Employee表中添加一個(gè)外鍵DepartmentID,將其與Department表的主鍵DepartmentID關(guān)聯(lián)起來(lái)。這樣,每個(gè)Employee實(shí)體都會(huì)有一個(gè)對(duì)應(yīng)的DepartmentID,從而建立了一對(duì)多的關(guān)系。

OrdeVo

package com.liao.vo;
import com.liao.model.Order;
import com.liao.model.OrderItem;
import java.util.ArrayList;
import java.util.List;
public class OrderVo extends Order {
? ? private List<OrderItem> orderItems = new ArrayList<>();
? ? public List<OrderItem> getOrderItems() {
? ? ? ? return orderItems;
? ? }
? ? public void setOrderItems(List<OrderItem> orderItems) {
? ? ? ? this.orderItems = orderItems;
? ? }
}

OrderMapper.xml 

<resultMap id="OrderVoMap" type="com.liao.vo.OrderVo">
? ? <result column="order_id" property="orderId" ></result>
? ? <result column="order_no" property="orderNo" ></result>
? ? <collection property="orderItems" ofType="com.liao.model.OrderItem">
? ? ? <result column="order_item_id" property="orderItemId" ></result>
? ? ? <result column="product_id" property="productId" ></result>
? ? ? <result column="quantity" property="quantity" ></result>
? ? ? <result column="oid" property="oid" ></result>
? ? </collection>
? </resultMap>
? <select id="selectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer" >
? ? ?SELECT * FROM
? ? ?t_hibernate_order o ,
? ? ?t_hibernate_order_item oi
? ? ?WHERE o.order_id = oi.oid
? ? ? AND o.order_id = #{oid}
? </select>

在自動(dòng)生成的 OrderMapper接口中進(jìn)行增加以下代碼,如下:

OrderVo selectByOid(@Param("oid") Integer oid);

OrderBiz 接口

package com.liao.biz;
import com.liao.vo.OrderVo;
public interface OrderBiz {
? ? OrderVo selectByOid(Integer oid);
}

實(shí)現(xiàn) OrderBiz 接口 創(chuàng)建 OrderBizImpl 

package com.liao.biz;
import com.liao.mapper.OrderMapper;
import com.liao.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class OrderBizImpl implements OrderBiz {
? ? @Autowired
? ? private OrderMapper orderMapper;
? ? @Override
? ? public OrderVo selectByOid(Integer oid) {
? ? ? ? return orderMapper.selectByOid(oid);
? ? }
}

測(cè)試

 ? @Autowired
? ? private OrderBiz orderBiz;
? ? @Test
? ? public void selectByOid() {
? ? ? ? OrderVo orderVo = orderBiz.selectByOid(7);
? ? ? ? System.out.println(orderVo);
? ? ? ? orderVo.getOrderItems().forEach(System.out::println);

4. 多對(duì)多關(guān)系映射

多對(duì)多關(guān)系映射是指兩個(gè)實(shí)體之間存在多對(duì)多的對(duì)應(yīng)關(guān)系,即一個(gè)實(shí)體可以與多個(gè)實(shí)體相對(duì)應(yīng),同時(shí)一個(gè)實(shí)體也可以與多個(gè)實(shí)體相對(duì)應(yīng)。例如,一個(gè)學(xué)生可以選擇多門(mén)課程,而一門(mén)課程也可以有多個(gè)學(xué)生選修。在數(shù)據(jù)庫(kù)中,多對(duì)多關(guān)系通常需要通過(guò)引入第三個(gè)實(shí)體(中間表)來(lái)實(shí)現(xiàn)。

多對(duì)多關(guān)系映射: 在數(shù)據(jù)庫(kù)中,多對(duì)多關(guān)系通常需要通過(guò)引入第三個(gè)實(shí)體(中間表)來(lái)實(shí)現(xiàn)。例如,假設(shè)我們有兩個(gè)實(shí)體表:Student(學(xué)生)和Course(課程)。一個(gè)學(xué)生可以選擇多門(mén)課程,而一門(mén)課程也可以有多個(gè)學(xué)生選修。我們可以創(chuàng)建一個(gè)名為StudentCourse的中間表,其中包含兩個(gè)外鍵:StudentID和CourseID,分別與Student表和Course表的主鍵關(guān)聯(lián)起來(lái)。這樣,每個(gè)學(xué)生可以在StudentCourse表中有多個(gè)對(duì)應(yīng)的CourseID,同時(shí)每門(mén)課程也可以在StudentCourse表中有多個(gè)對(duì)應(yīng)的StudentID,從而建立了多對(duì)多的關(guān)系。

HBookMapper.xml

<resultMap id="HBookVoMap" type="com.liao.vo.HbookVo" >
    <result column="book_id" property="bookId"></result>
    <result column="book_name" property="bookName"></result>
    <result column="price" property="price"></result>
    <collection property="categories" ofType="com.liao.model.Category">
      <result column="category_id" property="categoryId"></result>
      <result column="category_name" property="categoryName"></result>
    </collection>
  </resultMap>
  <select id="selectByBookId" resultMap="HBookVoMap" parameterType="java.lang.Integer" >
    SELECT * FROM
    t_hibernate_book b,
    t_hibernate_book_category bc ,
    t_hibernate_category c
    WHERE b.book_id = bc.bid
    AND bc.cid = c.category_id
    AND b.book_id = #{bid}
  </select>

HBookMapper 

HbookVo selectByBookId(@Param("bid") Integer bid);

創(chuàng)建 HBookBiz 

package com.liao.biz;
import com.liao.vo.HbookVo;
import org.apache.ibatis.annotations.Param;
public interface HBookBiz {
? ? HbookVo selecByBookId(@Param("bid") Integer bid);
}

實(shí)現(xiàn) HBookBiz 接口,創(chuàng)建 HBookBizImpl 

package com.liao.biz;
import com.liao.mapper.HBookMapper;
import com.liao.vo.HbookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HBookBizImpl implements HBookBiz {
? ? @Autowired
? ? private HBookMapper hBookMapper;
? ? @Override
? ? public HbookVo selecByBookId(Integer bid) {
? ? ? ? return hBookMapper.selectByBookId(bid);
? ? }
}

測(cè)試

?@Autowired
? ? private HBookBiz hbookBiz;
? ? @Test
? ? public void selectByBookId() {
? ? ? ? HbookVo hBookVo = hbookBiz.selecByBookId(8);
? ? ? ? System.out.println(hBookVo);
? ? ? ? hBookVo.getCategories().forEach(System.out::println);

5. 總結(jié)

MyBatis是一個(gè)強(qiáng)大的數(shù)據(jù)庫(kù)訪問(wèn)框架,其中的關(guān)聯(lián)關(guān)系映射是其核心功能之一。在處理復(fù)雜的數(shù)據(jù)模型時(shí),MyBatis關(guān)聯(lián)關(guān)系映射具有重要性和靈活性,如下所總結(jié):

重要性:

1. 數(shù)據(jù)模型的抽象:

  • MyBatis將數(shù)據(jù)庫(kù)表之間的關(guān)系抽象成對(duì)象之間的關(guān)系,使開(kāi)發(fā)人員無(wú)需深入了解數(shù)據(jù)庫(kù)的復(fù)雜性,從而簡(jiǎn)化了開(kāi)發(fā)過(guò)程。

2. 提高可維護(hù)性:

  • 通過(guò)將關(guān)系映射到對(duì)象,代碼更加直觀和可理解,使得代碼的維護(hù)和修改變得更加容易。

3. 提高開(kāi)發(fā)效率:

  • MyBatis自動(dòng)生成大部分?jǐn)?shù)據(jù)庫(kù)操作代碼,減少了手動(dòng)編寫(xiě)SQL語(yǔ)句的工作量,提高了開(kāi)發(fā)效率。

4. 增加靈活性:

  • 關(guān)聯(lián)關(guān)系映射框架允許進(jìn)行高級(jí)查詢和復(fù)雜操作,而不需要深入了解SQL的復(fù)雜性,從而提供了更大的靈活性。

5. 降低錯(cuò)誤風(fēng)險(xiǎn):

  • 通過(guò)將關(guān)系映射到對(duì)象,可以減少手動(dòng)編寫(xiě)SQL時(shí)可能引入的錯(cuò)誤,如拼寫(xiě)錯(cuò)誤或SQL注入,提高了代碼的質(zhì)量和安全性。

靈活性:

1. 一對(duì)一、一對(duì)多和多對(duì)多關(guān)系:

  • MyBatis支持各種關(guān)系映射,包括一對(duì)一、一對(duì)多和多對(duì)多關(guān)系,使得能夠輕松地處理不同類型的關(guān)聯(lián)數(shù)據(jù)。

2. 動(dòng)態(tài)SQL:

  • MyBatis允許在SQL中使用動(dòng)態(tài)條件,根據(jù)不同情況生成不同的SQL語(yǔ)句,提供了更大的靈活性。

3. 自定義查詢:

  • 可以使用自定義SQL查詢來(lái)滿足特定需求,無(wú)需受限于框架生成的SQL語(yǔ)句。

4. 延遲加載:

  • MyBatis支持延遲加載,允許在需要時(shí)加載關(guān)聯(lián)數(shù)據(jù),提高性能并減少不必要的數(shù)據(jù)檢索。

綜上所述,MyBatis的關(guān)聯(lián)關(guān)系映射在復(fù)雜數(shù)據(jù)模型中至關(guān)重要,因?yàn)樗峁┝艘环N更高級(jí)、更抽象的方式來(lái)處理數(shù)據(jù)庫(kù)操作,同時(shí)也提供了豐富的配置和擴(kuò)展選項(xiàng),使開(kāi)發(fā)人員能夠以最靈活的方式滿足不同項(xiàng)目的需求。它不僅提高了代碼的可維護(hù)性和開(kāi)發(fā)效率,還降低了錯(cuò)誤風(fēng)險(xiǎn),使開(kāi)發(fā)人員能夠更輕松地應(yīng)對(duì)復(fù)雜性,是現(xiàn)代應(yīng)用程序開(kāi)發(fā)中不可或缺的工具之一。

到此這篇關(guān)于mybatis關(guān)聯(lián)關(guān)系映射的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)mybatis關(guān)聯(lián)關(guān)系映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC靜態(tài)資源訪問(wèn)問(wèn)題如何解決

    SpringMVC靜態(tài)資源訪問(wèn)問(wèn)題如何解決

    這篇文章主要介紹了SpringMVC靜態(tài)資源訪問(wèn)問(wèn)題如何解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java編程中應(yīng)用的GUI設(shè)計(jì)基礎(chǔ)

    Java編程中應(yīng)用的GUI設(shè)計(jì)基礎(chǔ)

    這篇文章主要介紹了Java編程中應(yīng)用的GUI設(shè)計(jì)基礎(chǔ),為一些Java開(kāi)發(fā)CS類型應(yīng)用的基礎(chǔ)概念知識(shí),需要的朋友可以參考下
    2015-10-10
  • SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法

    SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法

    本篇文章主要介紹了SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 基于springboot實(shí)現(xiàn)文件上傳

    基于springboot實(shí)現(xiàn)文件上傳

    這篇文章主要為大家詳細(xì)介紹了基于springboot實(shí)現(xiàn)文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • idea中怎樣創(chuàng)建并運(yùn)行第一個(gè)java程序

    idea中怎樣創(chuàng)建并運(yùn)行第一個(gè)java程序

    這篇文章主要介紹了idea中怎樣創(chuàng)建并運(yùn)行第一個(gè)java程序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 實(shí)時(shí)計(jì)算知多少?

    實(shí)時(shí)計(jì)算知多少?

    這篇文章對(duì)滑動(dòng)窗口計(jì)數(shù)的概念和關(guān)鍵代碼做了較為詳細(xì)解釋,讓我們對(duì)實(shí)時(shí)計(jì)算這一概念有了更深的了解,需要的朋友可以參考下
    2015-07-07
  • try-with-resource優(yōu)雅關(guān)閉io流的方法

    try-with-resource優(yōu)雅關(guān)閉io流的方法

    這篇文章主要給大家介紹了關(guān)于try-with-resource優(yōu)雅關(guān)閉io流的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • SpringBoot Mybatis動(dòng)態(tài)數(shù)據(jù)源切換方案實(shí)現(xiàn)過(guò)程

    SpringBoot Mybatis動(dòng)態(tài)數(shù)據(jù)源切換方案實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換方案過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 從Mybatis-Plus開(kāi)始認(rèn)識(shí)SerializedLambda的詳細(xì)過(guò)程

    從Mybatis-Plus開(kāi)始認(rèn)識(shí)SerializedLambda的詳細(xì)過(guò)程

    這篇文章主要介紹了從Mybatis-Plus開(kāi)始認(rèn)識(shí)SerializedLambda,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Java實(shí)踐練習(xí)輕松幾行實(shí)現(xiàn)追書(shū)神器

    Java實(shí)踐練習(xí)輕松幾行實(shí)現(xiàn)追書(shū)神器

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)追書(shū)神器,用技術(shù)改變生活,大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-10-10

最新評(píng)論