JAVA框架 Mybaits 一對一、一對多
阿新 • • 發佈:2018-04-26
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 一對一、一對多