多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > Mybatis學習筆記(三)—高級映射,延遲加載

Mybatis學習筆記(三)—高級映射,延遲加載

來源:程序員人生   發布時間:2016-07-28 09:10:19 閱讀次數:3686次

本文主要介紹了如何使用resultMap完成高級映照;分析數據庫中表之間的關系(1對1、1對多、多對多)

如何在mapper.xml文件中配置resultMap實現1對1、1對多、多對多;mybatis如何實現延遲加載

1       數據模型

數據庫中有已導入的4個表:items:(商品信息表);orderdetail:(定單明細表);orders:(定單表);user:(用戶表)

1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(32) NOT NULL COMMENT '商品名稱', 4 price FLOAT(10,1) NOT NULL COMMENT '商品定價', 5 detail TEXT COMMENT '商品描寫', 6 pic VARCHAR(64) DEFAULT NULL COMMENT '商品圖片', 7 createtime DATETIME NOT NULL COMMENT '生產日期', 8 PRIMARY KEY (id) 9 ) DEFAULT CHARSET=utf8; 10 11 /*Table structure for table `orderdetail` */ 12 13 CREATE TABLE orderdetail ( 14 id INT NOT NULL AUTO_INCREMENT, 15 orders_id INT NOT NULL COMMENT '定單id', 16 items_id INT NOT NULL COMMENT '商品id', 17 items_num INT DEFAULT NULL COMMENT '商品購買數量', 18 PRIMARY KEY (id), 19 KEY `FK_orderdetail_1` (`orders_id`), 20 KEY `FK_orderdetail_2` (`items_id`), 21 CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 22 CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 23 ) DEFAULT CHARSET=utf8; 24 25 /*Table structure for table `orders` */ 26 27 CREATE TABLE orders ( 28 id INT NOT NULL AUTO_INCREMENT, 29 user_id INT NOT NULL COMMENT '下單用戶id', 30 number VARCHAR(30) NOT NULL COMMENT '定單號', 31 createtime DATETIME NOT NULL COMMENT '創建定單時間', 32 note VARCHAR(100) DEFAULT NULL COMMENT '備注', 33 PRIMARY KEY (`id`), 34 KEY `FK_orders_1` (`user_id`), 35 CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 36 ) DEFAULT CHARSET=utf8; 37 38 /*Table structure for table `t_user` */ 39 40 CREATE TABLE user ( 41 id INT NOT NULL AUTO_INCREMENT, 42 username VARCHAR(32) NOT NULL COMMENT '用戶名稱', 43 birthday DATE DEFAULT NULL COMMENT '生日', 44 sex CHAR(1) DEFAULT NULL COMMENT '性別', 45 address VARCHAR(256) DEFAULT NULL COMMENT '地址', 46 PRIMARY KEY (`id`) 47 ) DEFAULT CHARSET=utf8;

測試數據代碼:

1 /*Data for the table `items` */ 2 3 INSERT INTO items(itemsname,price,detail,pic,createtime) VALUES 4 ('臺式機',3000.0,'該電腦質量非常好!',NULL,'2015-07-07 13:28:53'), 5 ('筆記本',6000.0,'筆記本性能好,質量好!',NULL,'2015-07-08 13:22:57'), 6 ('背包',200.0,'名牌背包,容量大質量好!',NULL,'2015-07-010 13:25:02'); 7 8 /*Data for the table `orderdetail` */ 9 10 INSERT INTO `orderdetail`(`orders_id`,`items_id`,`items_num`) VALUES 11 (1,1,1), 12 (1,2,3), 13 (2,3,4), 14 (3,2,3); 15 16 /*Data for the table `orders` */ 17 18 INSERT INTO `orders`(`user_id`,`number`,`createtime`,`note`) VALUES 19 (1,'1000010','2015-06-04 13:22:35',NULL), 20 (1,'1000011','2015-07-08 13:22:41',NULL), 21 (2,'1000012','2015-07⑴7 14:13:23',NULL), 22 (3,'1000012','2015-07⑴6 18:13:23',NULL), 23 (4,'1000012','2015-07⑴5 19:13:23',NULL), 24 (5,'1000012','2015-07⑴4 17:13:23',NULL), 25 (6,'1000012','2015-07⑴3 16:13:23',NULL); 26 27 /*Data for the table `user` */ 28 29 INSERT INTO `user`(`username`,`birthday`,`sex`,`address`) VALUES 30 ('王5',NULL,'2',NULL), 31 ('張3','2014-07⑴0','1','北京市'), 32 ('張小明',NULL,'1','河南鄭州'), 33 ('陳小明',NULL,'1','河南鄭州'), 34 ('張3豐',NULL,'1','河南鄭州'), 35 ('陳小明',NULL,'1','河南鄭州'), 36 ('王5',NULL,NULL,NULL), 37 ('小A','2015-06⑵7','2','北京'), 38 ('小B','2015-06⑵7','2','北京'), 39 ('小C','2015-06⑵7','1','北京'), 40 ('小D','2015-06⑵7','2','北京');

用戶表user:

記錄了購買商品的用戶

 

定單表orders:

記錄了用戶所創建的定單信息

 

定單明細表orderdetail:

記錄了用戶創建定單的詳細信息

 

商品信息表items:

記錄了商家提供的商品信息

 

分析表與表之間的關系:

 

用戶user和定單orders:

 

user---->orders:1個用戶可以創建多個定單   1對多

orders-->user:1個定單只能由1個用戶創建  1對1

 

定單orders和定單明細orderdetail:

orders-->orderdetail:1個定單可以包括多個定單明細  1對多

orderdetail-->orders:1個定單明細只屬于1個定單  1對1

 

定單明細orderdetail和商品信息items:

 

orderdetail-->items:1個定單明細對應1個商品信息1對1

items--> orderdetail:1個商品對應多個定單明細  1對多

以下是這4個表的對應關系:


1.1     項目的目錄結構

 

2       1對1查詢

2.1     需求

使用Mapper接口代理的方式查詢定單信息關聯查詢用戶信息

2.2     sql語句

查詢語句:

先肯定主查詢表:定單信息表

再肯定關聯查詢表:用戶信息

通過orders關聯查詢用戶使用user_id1個外鍵,只能關聯查詢出1條用戶記錄就能夠使用內連接

 

SELECT

 orders.*,

 user.username,

 user.sex

FROM

 orders,

 USER

WHERE orders.user_id = user.id

2.3使用resultType實現

2.3.11對1查詢映照的java對象

 

這里輸出的結果包括 定單信息和用戶信息,之前創建的pojo都是單表的實體類,所以這里需要自定義1個組合的pojo才能完成resultType的映照。

 

創建OrderCustom作為自定義pojo,補充相應的get()和set()方法

packagecn.itcast.mybatis.po;

 

 

public class OrderCustomextends Orders {

  

   //補充用戶信息

   privateStringusername;

  

   privateStringsex;

  

   privateString address;

}

2.3.2 mapper.xml文件的配置

定義OrdersMapperCustom.xml文件,

   <!--1對1查詢使用reusltType完成

   查詢定單關聯查詢用戶信息使用resultType的方式

    -->

    <selectid="findOrderUserList"resultType="orderCustom">

          SELECT

        orders.*,

        user.username,

        user.sex

      FROM

        orders,

        USER

      WHEREorders.user_id = user.id

    </select>

2.3.3 mapper.java接口

定義OrderMapperCustomer.java文件

packagecn.itcast.mybatis.mapper;

 

public interfaceOrdersMapperCustom {

   // 1對1查詢,查詢定單關聯查詢用戶,使用resultType

   publicList<OrderCustom> findOrderUserList()throwsException;

}

2.3.4  測試OrdersMapperCustomerTest.java

package cn.itcast.mybatis.mapper;

 

public class OrdersMapperCustomTest {

 

         //會話工廠

         privateSqlSessionFactory sqlSessionFactory;

 

         //創建工廠

         @Before

         publicvoid init() throws IOException {

 

                   //配置文件(SqlMapConfig.xml)

                   Stringresource = "SqlMapConfig.xml";

 

                   //加載配置文件到輸入流

                   InputStreaminputStream = Resources.getResourceAsStream(resource);

 

                   //創建會話工廠

                   sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

 

         }

 

         @Test

         publicvoid testFindOrderUserList() throws Exception {

 

                   SqlSessionsqlSession = sqlSessionFactory.openSession();

                   //創建mapper代理對象

                   OrdersMapperCustomordersMapperCustom = sqlSession

                                     .getMapper(OrdersMapperCustom.class);

 

                   //調用方法

                   List<OrderCustom>list = ordersMapperCustom.findOrderUserList();

 

                   System.out.println(list);

         }

}

2.4    使用resultMap實現

2.4.1 resultMap映照思路

resultMap提供1對1關聯查詢的映照和1對多關聯查詢映照,1對1映照思路:將關聯查詢的信息映照到查詢的POJO中,以下:

在Orders類中創建1個User屬性,將關聯查詢的信息映照到User屬性中。

Orders.java補充相應的get()和set()方法

package cn.itcast.mybatis.po;

 

public class Orders implements Serializable{

   private Integer id;

 

   private Integer userId;

 

   private String number;

 

   private Date createtime;

 

   private String note;

   

   //關聯用戶信息

private User user;

}

2.4.2  mapper.xml文件的配置

OrdersMapperCustomer.xml定義sql語句和resultMap映照之間的關系

<!-- 1對1查詢resultMap,這里的ID是1個唯1的標識,與輸出參數resultMap定義的相同(用黃色標出)

 -->

 

   <resultMaptype="orders"id="ordersUserResultMap">

      <!--完成了定單信息的映照配置-->

      <!--id:定單關聯用戶查詢的唯1標識  -->

      <!--column: sql語句中查詢的列,propertypojo中對應的屬性-->

      <idcolumn="id"property="id"/>

      <resultcolumn="user_id"property="userId"/>

      <resultcolumn="number"property="number"/>

      <resultcolumn="createtime"property="createtime"/>

      <resultcolumn="note"property="note"/>

     

      <!--下邊完成關聯信息的映照

      association:用于對關聯信息映照到單個pojo

      property:要將關聯信息映照到orders的哪一個屬性中

      javaType:關聯信息映照到orders的屬性的類型,是user的類型

       -->

      <associationproperty="user"javaType="user">

         <!--id:關聯信息的唯1標識  -->

         <!--property要映照到user的哪一個屬性中-->

         <idcolumn="user_id"property="id"/>

         <!--result就是普通列的映照-->

         <resultcolumn="username"property="username"/>

         <resultcolumn="sex"property="sex"/>

     

      </association>

     

   </resultMap>

<!-- 1對1查詢使用reusltMap完成

   查詢定單關聯查詢用戶信息 -->

    <selectid="findOrderUserListResultMap"resultMap="ordersUserResultMap">

          SELECT

        orders.*,

        user.username,

        user.sex

      FROM

        orders,

        USER

      WHEREorders.user_id = user.id

    </select>

2.4.3  mapper.java接口

OrderMapperCustomer.java中添加使用resultMap進行1對1查詢的接口

packagecn.itcast.mybatis.mapper;

 

public interfaceOrdersMapperCustom {

   // 1對1查詢,使用resultMap

publicList<Orders> findOrderUserListResultMap()throwsException;

}

2.4.4  測試OrdersMapperCustomerTest.java

package cn.itcast.mybatis.mapper;

 

public class OrdersMapperCustomTest {

 

         //會話工廠

         privateSqlSessionFactory sqlSessionFactory;

 

         //創建工廠

         @Before

         publicvoid init() throws IOException {

 

                   //配置文件(SqlMapConfig.xml)

                   Stringresource = "SqlMapConfig.xml";

 

                  // 加載配置文件到輸入流

                   InputStreaminputStream = Resources.getResourceAsStream(resource);

 

                   //創建會話工廠

                   sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

 

         }

 

                   // 1對1查詢使用resultMap

   @Test

   public voidtestFindOrderUserListResultMap() throwsException {

 

      SqlSessionsqlSession = sqlSessionFactory.openSession();

      // 創建mapper代理對象

      OrdersMapperCustomordersMapperCustom = sqlSession

            .getMapper(OrdersMapperCustom.class);

 

      // 調用方法

      List<Orders>list = ordersMapperCustom.findOrderUserListResultMap();

 

      System.out.println(list);

   }

}

2.5    小結

resultType:要自定義pojo 保證sql查詢列和pojo的屬性對應,加入sql語句使用別名,則查詢不到該列的信息,這類方法相對較簡單,所以利用廣泛。

 

resultMap:使用association完成1對1映照需要配置1個resultMap,進程有點復雜,如果要實現延遲加載就只能用resultMap實現 ,如果為了方便對關聯信息進行解析,也能夠用association將關聯信息映照到pojo中方便解析。

3       1對多查詢

 

3.1     需求

 

使用mapper接口代理的方式查詢所有定單信息(關聯用戶)及定單下的定單明細信息。

 

3.2     sql語句

 

主查詢表:定單表

關聯查詢表:定單明細

 

SELECT

 orders.*,

 user.username,

 user.sex ,

 orderdetail.id orderdetail_id,

 orderdetail.items_num,

 orderdetail.items_id

FROM

 orders,

 USER,

 orderdetail

WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id

 

 

3.3     resultMap進行1對多映照思路

 

resultMap 提供collection完成關聯信息映照到集合對象中。

 

在orders類中創建集合屬性:

package cn.itcast.mybatis.po;

 

public class Orders implements Serializable{

   private Integer id;

 

   private Integer userId;

 

   private String number;

 

   private Date createtime;

 

   private String note;

   

   //關聯用戶信息

    private User user;

   

   //定單明細

    privateList<Orderdetail> orderdetails;

}

3.4     mapper.xml文件的配置

<!-- 1對多,查詢定單及定單明細 -->

   <resultMaptype="orders"id="orderAndOrderDetails"extends="ordersUserResultMap">

      <!--映照定單信息,和用戶信息,這里使用繼承ordersUserResultMap-->

     

      <!--映照定單明細信息

      property:要將關聯信息映照到orders的哪一個屬性中

      ofType:集合中pojo的類型

      -->

      <collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">

         <!--id:關聯信息定單明細的唯1標識

         propertyOrderdetail的屬性名

           -->

         <idcolumn="orderdetail_id"property="id"/>

         <resultcolumn="items_num"property="itemsNum"/>

         <resultcolumn="items_id"property="itemsId"/>

      </collection>

  

   </resultMap>

<!-- 1對多查詢使用reusltMap完成

   查詢定單關聯查詢定單明細

    -->

    <selectid="findOrderAndOrderDetails"resultMap="orderAndOrderDetails">

         SELECT

     orders.*,

     user.username,

     user.sex ,

     orderdetail.id orderdetail_id,

     orderdetail.items_num,

     orderdetail.items_id

   FROM

     orders,

     USER,

     orderdetail

   WHEREorders.user_id = user.id  AND orders.id =orderdetail.orders_id

    </select>

3.5     mapper.java接口

在OrderMapperCustomer.java中添加使用resultMap進行1對多查詢的接口

packagecn.itcast.mybatis.mapper;

 

public interfaceOrdersMapperCustom {

   // 1對多查詢,使用resultMap

   publicList<Orders> findOrderAndOrderDetails()throwsException;

}

3.6     測試OrdersMapperCustomerTest.java

package cn.itcast.mybatis.mapper;

 

public class OrdersMapperCustomTest {

 

         //會話工廠

         privateSqlSessionFactory sqlSessionFactory;

 

         //創建工廠

         @Before

         publicvoid init() throws IOException {

 

                   //配置文件(SqlMapConfig.xml)

                   Stringresource = "SqlMapConfig.xml";

 

                   //加載配置文件到輸入流

                   InputStreaminputStream = Resources.getResourceAsStream(resource);

 

                   //創建會話工廠

                   sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

 

         }

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------

上一篇 3D Touch

下一篇 經典C算法收藏

分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美free hd xxxx movies| 亚洲视频福利 | 中文字幕精品在线观看 | 精品自拍视频在线观看 | 老司机成人午夜精品福利视频 | 成人精品一级毛片 | 欧美性a欧美在线 | 国产视频二区在线观看 | 久久久久伊人 | 欧美精品国产一区二区三区 | 亚洲国产一区二区在线 | 一区二区三区不卡在线 | 中文字幕永久视频 | 一级做a爱 一区 | 免费观看亚洲 | 国产18到20岁美女毛片 | 综合图片小说 | 免费观看在线永久免费xx视频 | 日本三级中文 | 最近最新免费中文字幕高清 | 久久精品伊人网 | 波多野结衣 一区 | 国产95在线 | 亚洲 | 国产视频一二区 | 特级毛片女人18毛片 | 日本特黄特色免费大片 | www黄色| 五月天国产 | 免费观看老外特级毛片 | 国产视频一二区 | 日韩18在线观看 | 波多野结衣在线播放视频 | 又硬又大又湿又紧a视频 | 成人综合在线视频 | 亚洲精品欧美精品中文字幕 | 欧美色综合天天综合高清网 | 夜夜伊人 | 日本一级毛片视频无遮挡免费 | 欧美一级毛片日本 | 中国一级淫片aaa毛片毛片 | 日本一区二区三区四区在线观看 |