1. 程式人生 > >JAVA框架 Mybaits 一對一、一對多

JAVA框架 Mybaits 一對一、一對多

AR 分享圖片 put 一個 exceptio pri type tom RR

一:闡述

我們在日常操作的時候,很多時候會遇到多表聯合查詢,由於參照物的不通 ,會出現一對一、一對多的情況。比如說:賬號信息和訂單表,從訂單表角度和賬號信息是一對一的情況(一個訂單只能是一個用戶的情況),從用戶的角度,就會出現一對多的情況(一個用戶會有多個訂單)。

二、一對一:

需要清楚:

技術分享圖片

現在我們創建2個表:

 1         CREATE TABLE username(
 2             id INT PRIMARY KEY AUTO_INCREMENT,
 3             NAME VARCHAR(20),
 4             sex VARCHAR(20
) 5 ); 6 7 CREATE TABLE orders ( 8 id INT PRIMARY KEY AUTO_INCREMENT, 9 num VARCHAR(20), 10 user_id INT 11 );

創建訂單表和用戶表。插入一些值。

參照物是:訂單

聯合查詢sql:

1 SELECT o.`id`AS oid ,o.`num` AS num ,o.`user_id` AS uid,u.* FROM orders AS o, username AS u WHERE o.user_id=u.id;

結果:

技術分享圖片

第一個方法:

首先映射類:

orders類:

 1 package jd.com.ou;
 2 
 3 public class orders {
 4     private String num;
 5     private Integer user_id;
 6 
 7     public void setNum(String num) {
 8         this.num = num;
 9     }
10 
11     public void setUser_id(Integer user_id) {
12         this.user_id = user_id;
13 } 14 15 public Integer getUser_id() { 16 return user_id; 17 } 18 19 public String getNum() { 20 return num; 21 } 22 }

user類:

 1 package jd.com.ou;
 2 
 3 public class user {
 4     private String name;
 5     private String sex;
 6 
 7     public void setName(String name) {
 8         this.name = name;
 9     }
10 
11     public void setSex(String sex) {
12         this.sex = sex;
13     }
14 
15     public String getName() {
16         return name;
17     }
18 
19     public String getSex() {
20         return sex;
21     }
22 }

註意:並不是為了聯合查詢就需要建立這2個表,而是這2個類是user表和ordes表的projo類。

然後我們定義返回數據的projo類:

 1 package jd.com.ou;
 2 
 3 public class customuo extends orders {
 4     private String name;
 5     private String sex;
 6 
 7     public void setSex(String sex) {
 8         this.sex = sex;
 9     }
10 
11     public void setName(String name) {
12         this.name = name;
13     }
14 
15     public String getSex() {
16         return sex;
17     }
18 
19     public String getName() {
20         return name;
21     }
22 
23     @Override
24     public String toString() {
25         return this.name+this.sex+this.getNum();
26     }
27 }

mapper配置文件:

1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <mapper namespace="jd.com.ou.oumapper">
6     <select id="findOrderAndUser" resultType="jd.com.ou.customuo" parameterType="jd.com.ou.customuo">
7         SELECT o.`id`AS oid ,o.`num` AS num ,o.`user_id` AS uid,u.* FROM orders AS o, username AS u WHERE o.`user_id`=u.id;
8     </select>
9 </mapper>

註意在sql語句中,where關鍵字中,前面定義列的別名,在where的表達是中不能用列的別名。

mapper接口:

1 package jd.com.ou;
2 
3 import java.util.List;
4 
5 public interface oumapper {
6     List<customuo> findOrderAndUser();
7 }

測試類:

 1 package jd.com.ou;
 2 
 3 import org.apache.ibatis.io.Resources;
 4 import org.apache.ibatis.session.SqlSession;
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 7 import org.junit.jupiter.api.Test;
 8 
 9 import java.io.IOException;
10 import java.io.InputStream;
11 
12 import java.util.List;
13 
14 public class testDemo {
15 
16     @Test
17     public  void  testDemo() throws IOException {
18         String reource="SqlMapConfig.xml";
19         InputStream inp= Resources.getResourceAsStream(reource);
20         SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inp);
21         SqlSession sqlSession=sqlSessionFactory.openSession();
22         oumapper oum=sqlSession.getMapper(oumapper.class);
23         List<customuo> list=oum.findOrderAndUser();
24         System.out.println(list);
25     }
26 }

註意:

這裏我們的定義接收返回值的customuo類中,我們並沒有將user的字段設置成customuo的屬性。為什麽呢??

因為我們沒有傳入參數,也就是說,無法設置user類到customuo的屬性中,這樣,如果調用customuo的user屬性會是對象的默認值:null。

那如果我們想使用user字段該怎麽操作呢?

第二種方法:

JAVA框架 Mybaits 一對一、一對多