Mybatis 框架(三)—— 映射文件的配置(單表查詢映射、一對一映射、一對多映射)、Mybatis Generator 插件進行反向工程

一、映射文件的配置(2)

1、手動的結果集映射_單表查詢映射

(1)單表查詢映射:
在使用 mybatis 時,我們推薦實體類的屬性名稱和表中的字段名名稱保持一致,採用這樣的做法 mybatis 可以自動將結果集中的字段值映射到實體類的屬性中,如果實體類的屬性名稱與數據庫表的字段名稱不一致時,我們就需要使用 resultMap 標籤來實現手動的結果集映射。
例如:實體類的屬性名稱爲 name,price 但是數據庫表的字段名稱是 p_name 和 p_price,這時我們就需要在映射文件中自定義映射關係。

<?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.mybatis.demo1.dao.OneToOneMapper">
    <!-- sql標籤定義可重用的sql語句 -->
   <sql id="columns">p_id,p_name,p_price,p_count,p_class,p_attribute</sql>

    <!-- 單表查詢映射 -->
    <resultMap type="Product" id="p_map">
        <id property="id" column="p_id"/>
        <result property="name" column="p_name"/>
        <result property="price" column="p_price"/>
        <result property="count" column="p_count"/>
        <result property="classes" column="p_class"/>
        <result property="attribute" column="p_attribute"/>
    </resultMap>
</mapper>

屬性說明:

  • type:結果集映射的實體類型
  • id:映射關係的id,在查詢時會使用該id完成結果集映射
  • column:列名
  • property:屬性名

定義好映射關係後,在查詢時,就可以使用 resultMap 屬性來引用手動映射關係

<select id="select" resultMap="p_map">
	select <include refid="columns"></include> from products
</select>

2、手動的結果集映射_一對一關聯查詢

一對一的關聯查詢有兩種方式,第一種是直接將多表連接查詢的結果封裝爲鍵值對,要實現這個目的只需要將 resultType 定義爲 map 類型即可。
第二種方式是用實體類對象來進行封裝,以商品表和商品類型爲例:
(1)Products 表結構:
在這裏插入圖片描述
(2)l_type 表結構:
在這裏插入圖片描述
(3)Products 實體類:

public class Products {
	private int p_id;
	private String p_name;
	private double p_price;
	private int p_count;
	private String p_class;
	private String p_attribute;
	private int p_typeid;
	private Ltype ltype;
	//省略get、set、toString方法
}

(4)Products 類中定義了一個 Ltype 的對象專門用於保存商品類型信息

public class Ltype {
	private int id;
	private String name;
	private int pid;
	//省略get、set、toString方法
}

映射文件:

<!-- 一對一映射關係 -->
<resultMap type="Product" id="p1_map">
	<id property="id" column="p_id"/>
	<result property="name" column="p_name"/>
	<result property="price" column="p_price"/>
	<result property="count" column="p_count"/>
	<result property="classes" column="p_class"/>
	<result property="attribute" column="p_attribute"/>
	<!--將查詢結果封裝爲一個對象-->
	<association property="ltype" javaType="Ltype">
		<id property="id" column="lt_id" />
		<result property="name" column="lt_name" />
		<result property="pid" column="lt_pid" />
	</association>
</resultMap>
<select id="selectOneToOne" resultMap="p1_map">
	select p.*,t.* from Products as p inner join ltype as t on p.p_typeid = t.lt_id
</select>

首先查詢時一定是使用多表聯合查詢,同時查詢出商品詳情和商品類型信息,最後在通過自定義的結果集映射來進行結果集的封裝。
重要標籤:

  • association:用於對實體類的關聯對象進行映射
  • property:表示對象名稱
  • javaType:用於說明關聯的對象類型

3、手動的結果集映射_一對多關聯映射查詢

以商品表和商品類型表爲例,一種類型對應多個商品,想要在查詢商品類型的同時查詢出對應類型的商品的詳細信息,在定義實體類時就需要在商品類型實體類中定義一個商品信息集合,用來保存單個商品信息。
(1)商品類型實體類:

public class Ltype {
	private int id;
	private String name;
	private int pid;
	private List<Product> product;
	//省略get、set方法
	@Override
	public String toString() {
		return "\nLtype {id:" + id + ", name:" + name + ", pid:" + pid
				+ ", product:" + product + "}";
	}
}

(2)商品信息類

public class Product {
	private int id;
	private String name;
	private double price;
	private int count;
	private String classes;
	private String attribute;
	private Ltype ltype;
	//省略get、set方法
	@Override
	public String toString() {
		return "{id:" + id + ", name:" + name + ", price:" + price
				+ ", count:" + count + ", classes:" + classes + ", attribute:"
				+ attribute + "}";
	}
}

(3)映射文件:

<!-- 一對多映射關係 -->
<resultMap type="Ltype" id="p_map">
    <id property="id" column="lt_id" />
    <result property="name" column="lt_name" />
    <!--一對多映射-->
    <collection property="product" ofType="Product">
        <id property="id" column="p_id"/>
        <result property="name" column="p_name"/>
        <result property="price" column="p_price"/>
        <result property="count" column="p_count"/>
        <result property="classes" column="p_class"/>
        <result property="attribute" column="p_attribute"/>
    </collection>
</resultMap>
<select id="selectOneToMore" resultMap="p_map">
    select t.lt_id,t.lt_name,p.* from Products as p right join ltype as t on p.p_typeid = t.lt_id
</select>

和一對一關聯查詢一樣首先要用多表聯合查詢查詢出數據,區別是:

  • 一對一是一條主表數據 + 一條從表數據 = 一條數據
  • 一對多是一條主表數據 + 多條從表數據 = 多條數據

但是我們最終的目的是想將一的數據保存到商品類型 Ltype 對象中,而 商品信息 Product 數據保存到 Orderinfo 對象的集合中,使用 collection 標籤來映射一對多結果集時,mybatis 會判斷如果一條數據的主表段已經被封裝爲對象,那麼 mybatis 就不會在封裝新對象了,而是將從表段數據封裝到集合中。

二、Mybatis Generator 插件進行反向工程

1、安裝插件

在這裏插入圖片描述

2、編寫xml文件進行反向工程

<?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>
	<!--指定jdbc驅動包在硬盤的地址 -->
	<classPathEntry location="E://work.software//mysql-connector-java-5.1.44-bin.jar" />
	<context id="DB2Tables" targetRuntime="MyBatis3">
		<commentGenerator>
			<!-- 是否去除自動生成的註釋  -->
			<property name="suppressAllComments" value="true" />
		</commentGenerator>
		<!--插件需要讀取數據庫的信息 進行反向工程 需要在此處提供鏈接數據庫的信息 -->
		<jdbcConnection 
            driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/store" 
			userId="root"
			password="admin">
		</jdbcConnection>

		<javaTypeResolver>
			<!--禁止將數據庫中的整數類型 在java實體類中定義爲BigDecimal類型 直接定義爲Integer類型 -->
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

		<!--生成實體類的配置 -->
		<javaModelGenerator targetPackage="com.mybatis.entity" targetProject="Mybatis_Demo1">
			<property name="enableSubPackages" value="true" />
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
		<!--生成映射文件的配置 -->
		<sqlMapGenerator targetPackage="com.mybatis.mapper" targetProject="Mybatis_Demo1">
			<property name="enableSubPackages" value="true" />
		</sqlMapGenerator>
		<!--生成數據層接口的配置 -->
		<javaClientGenerator type="XMLMAPPER" targetPackage="com.mybatis.mapper" targetProject="Mybatis_Demo1">
			<property name="enableSubPackages" value="true" />
		</javaClientGenerator>
		<!--那些表需要進行反向工程 -->
		<table tableName="products" domainObjectName="Products"></table>
		<table tableName="ltype" domainObjectName="Ltype"></table>
		<table tableName="btype" domainObjectName="Btype"></table>
	</context>
</generatorConfiguration>

3、運行xml文件,生成實體類、數據層接口、映射文件

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章