JAVA框架 Mybaits 一对一、一对多

一:阐述

我们在日常操作的时候,很多时候会遇到多表联合查询,由于参照物的不通 ,会出现一对一、一对多的情况。比如说:账号信息和订单表,从订单表角度和账号信息是一对一的情况(一个订单只能是一个用户的情况),从用户的角度,就会出现一对多的情况(一个用户会有多个订单)。

二、一对一:

需要清楚:

现在我们创建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字段该怎么操作呢?

第二种方法:

猜你喜欢

转载自www.cnblogs.com/evilliu/p/8951803.html