标签:默认 联合 std row 测试 user 技术 注意 pre
一:阐述
我们在日常操作的时候,很多时候会遇到多表联合查询,由于参照物的不通 ,会出现一对一、一对多的情况。比如说:账号信息和订单表,从订单表角度和账号信息是一对一的情况(一个订单只能是一个用户的情况),从用户的角度,就会出现一对多的情况(一个用户会有多个订单)。
二、一对一:
需要清楚:
现在我们创建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字段该怎么操作呢?
第二种方法:
标签:默认 联合 std row 测试 user 技术 注意 pre
原文地址:https://www.cnblogs.com/evilliu/p/8951803.html