一:阐述

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

二、一对一:

需要清楚:

现在我们创建2个表:

         CREATE TABLE username(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(),
sex VARCHAR()
); CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
num VARCHAR(),
user_id INT
);

创建订单表和用户表。插入一些值。

参照物是:订单

联合查询sql:

 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类:

 package jd.com.ou;

 public class orders {
private String num;
private Integer user_id; public void setNum(String num) {
this.num = num;
} public void setUser_id(Integer user_id) {
this.user_id = user_id;
} public Integer getUser_id() {
return user_id;
} public String getNum() {
return num;
}
}

user类:

 package jd.com.ou;

 public class user {
private String name;
private String sex; public void setName(String name) {
this.name = name;
} public void setSex(String sex) {
this.sex = sex;
} public String getName() {
return name;
} public String getSex() {
return sex;
}
}

注意:并不是为了联合查询就需要建立这2个表,而是这2个类是user表和ordes表的projo类。

然后我们定义返回数据的projo类:

 package jd.com.ou;

 public class customuo extends orders {
private String name;
private String sex; public void setSex(String sex) {
this.sex = sex;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public String getName() {
return name;
} @Override
public String toString() {
return this.name+this.sex+this.getNum();
}
}

mapper配置文件:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jd.com.ou.oumapper">
<select id="findOrderAndUser" resultType="jd.com.ou.customuo" parameterType="jd.com.ou.customuo">
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;
</select>
</mapper>

注意在sql语句中,where关键字中,前面定义列的别名,在where的表达是中不能用列的别名。

mapper接口:

 package jd.com.ou;

 import java.util.List;

 public interface oumapper {
List<customuo> findOrderAndUser();
}

测试类:

 package jd.com.ou;

 import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test; import java.io.IOException;
import java.io.InputStream; import java.util.List; public class testDemo { @Test
public void testDemo() throws IOException {
String reource="SqlMapConfig.xml";
InputStream inp= Resources.getResourceAsStream(reource);
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inp);
SqlSession sqlSession=sqlSessionFactory.openSession();
oumapper oum=sqlSession.getMapper(oumapper.class);
List<customuo> list=oum.findOrderAndUser();
System.out.println(list);
}
}

注意:

    这里我们的定义接收返回值的customuo类中,我们并没有将user的字段设置成customuo的属性。为什么呢??

因为我们没有传入参数,也就是说,无法设置user类到customuo的属性中,这样,如果调用customuo的user属性会是对象的默认值:null。

那如果我们想使用user字段该怎么操作呢?

第二种方法:实际生产用的情况。

将orders类的字段和user对象的设置成新类custuo2。

 package jd.com.ou;

 public class custuo2 {
private String num;
private Integer user_id;
private user us;
private Integer id; public void setId(Integer id) {
this.id = id;
} public Integer getId() {
return id;
} public void setUs(user us) {
this.us = us;
} public user getUs() {
return us;
} public void setNum(String num) {
this.num = num;
} public void setUser_id(Integer user_id) {
this.user_id = user_id;
} public Integer getUser_id() {
return user_id;
} public String getNum() {
return num;
} @Override
public String toString() {
return this.getNum()+" "+this.getId()+" "+this.getUser_id()+" "+this.getUs().toString();
}
}

mapper配置文件,resultType的类型改为:resultMap该属性字段值是resultMap标签的id值。

mapper配置文件:

   <select id="findOrderAndUserObj"  resultMap="UserObj">
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;
</select>
<!--
type:是我们resultMap类型的泛型值。
id:是别人调用该resultMap的唯一标识。
-->
<resultMap id="UserObj" type="jd.com.ou.custuo2" >
<!--
id:是主键列
result:非主键列
property:是类的属性名称
javaType:是属性名称的类型。
column:是实际数据库列的名称.
-->
<id property="id" javaType="int" column="oid"/>
<result property="user_id" javaType="int" column="uid"/>
<result javaType="string" property="num" column="num"/>
<association property="us" javaType="jd.com.ou.user" >
<!--
标签:association 是引用外部对象 我们写projo类的时候使用。
其中properites 是类中引用的属性的名称
javaType:引用对象的类型。
-->
<id javaType="int" property="id" column="id"/>
<result property="name" javaType="string" column="name"/>
<result property="sex" javaType="string" column="sex"/>
</association>
</resultMap>

三:一对多

一对多,那自定义 接收类中,对于一对多种的多的类型写成泛型的List对象。

1、需要注意的是在mapper文件中接收集合的是使用标签<collection>

2、需要注意的是collection标签的 需要设置属性ofType而不是javaType。该属性值是你自定义的接受类的定义的泛型的类型。

mapper文件:

     <select id="findOrderAndUserObjlIST" resultMap="UseList" >
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;
</select>
<resultMap id="UseList" type="jd.com.ou.ouList" >
<id property="id" column="id" javaType="int"/>
<result property="name" javaType="string" column="name" />
<result property="sex" column="sex" javaType="string"/>
<collection property="ord" ofType="jd.com.ou.orders" >
<id property="id" column="oid"/>
<result property="num" column="num"/>
<result property="user_id" column="uid"/> </collection>
</resultMap>

接口文件:

 package jd.com.ou;

 import java.util.List;

 public interface oumapper {
List<customuo> findOrderAndUser();
List<customuo> findOrderAndUserObj();
List<ouList> findOrderAndUserObjlIST();
}

自定义接收类:

 package jd.com.ou;

 import java.util.List;

 public class ouList {
private Integer id;
private String name;
private String sex;
private List<orders> ord; public void setOrd(List<orders> ord) {
this.ord = ord;
} public List<orders> getOrd() {
return ord;
} public void setId(Integer id) {
this.id = id;
} public Integer getId() {
return id;
} public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setSex(String sex) {
this.sex = sex;
} public String getSex() {
return sex;
} @Override
public String toString() {
return this.getSex()+" "+this.getId()+" "+this.getName()+" "+this.getOrd().toString();
}
}

测试类:

   @Test
public void testdemo2() throws IOException {
String resource="SqlMapConfig.xml";
InputStream inp=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inp);
SqlSession sqlSession=sqlSessionFactory.openSession();
oumapper oum=sqlSession.getMapper(oumapper.class);
List<ouList> list=oum.findOrderAndUserObjlIST();
System.out.println(list);
}

 注意:一对一的时候,我们使用的2种方法。

其中第一种方法需要注意的是:不设置projo类型的字段,否则获取不到值,这是因为自定义的projo引用,这时候需要通过set方法才能加载内存如果不设置的话,会使用其默认值。

第二种方法,通过标签<association>来实现projo类型的引用的。一对多也是。推荐第二种方法。

JAVA框架 Mybaits 一对一、一对多的更多相关文章

  1. JAVA框架 Mybaits 核心配置

    一:mybaits的核心配置文件:SqlMapConfig.xml 配置文件中需要关注的属性: 二.properites属性:一般引用配置文件(properites文件)比如:数据库的配置.我们可以编 ...

  2. JAVA框架 Mybaits 动态代理

    一.动态代理: mybaits给咱们提供一套动态代理,我们只需要按他的要求写接口即可,mybatis帮做动态代理,相当于咱们写的接口的实现类.底层通过反射实例化代理对象,通过代理对象调用相应的方法, ...

  3. JAVA框架 Mybaits

     注意:我们在resultType中,对于selectlist方法也是projo类.resultType参数的含义是list的泛型的类型. 一:jar包下载: https://github.com/m ...

  4. java框架篇---hibernate(一对多)映射关系

    一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多 ...

  5. JAVA框架 Mybaits 动态sql

    动态sql 一:if标签使用: 我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接. Mapper配置文件: < ...

  6. JAVA框架 Mybaits 输入和输出映射

    一.输入映射 当前端传来的参数,比较复杂,比如说用户名称.订单单号.账号信息等等.后端有可能有多个projo类对应这些信息.我们需要把这些的projo类封装成一个类似一个vo类. 通过设置字段形式关联 ...

  7. MyBaits一对一的查询方法

    MyBaits一对一的查询方法 一:表数据与表结构 CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name ) ); CRE ...

  8. 转 分享我在阿里工作十年接触过Java框架设计模式

    转 原文: 分享我在阿里工作十年接触过Java框架设计模式 一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者 ...

  9. 一,java框架学习

    一,java框架学习 Hibernate概述Hibernate是一个开放源代码的ORM(对象关系映射)框架,对jdbc进行了轻量级的封装,是的java开发人员可以使用面向对象编程思想操作数据库,简化操 ...

随机推荐

  1. Java Spring学习笔记----Bean的依赖注入(设值注入方式)1

    Spring常用的两种依赖注入方式:一种是设值注入方式,利用Bean的setter方法设置Bean的属性值:另一种是构造注入,通过给Bean的构造方法传递参数来实现Bean的属性赋值: 1.设值注入方 ...

  2. macbook 外接显示器黑屏,不显示

    我的mac本有点老了,11年底的那款 整了个显示器,刚开始连上没问题,后来开机状态拔了雷电线,再插  或者关机后莫名的原因再启动,显示器黑屏 网上好多方法都不行,自己总结了一个方法 拔掉连接线,关闭m ...

  3. JavaScript--DOM操作表格及样式(21)

    一 操作表格 // <table>标签是HTML中结构最为复杂的一个,我们可以通过DOM来创建生成它,或者HTMLDOM来操作它; // 使用DOM来创建表格; var table = d ...

  4. Code Signal_练习题_growingPlant

    Each day a plant is growing by upSpeed meters. Each night that plant's height decreases by downSpeed ...

  5. oop(Object Oriented Programming)

    嗯,昨天忙了一天没来及发,过年啊,打扫啊,什么搽窗户啊,拖地啊,整理柜子啊,什么乱七八糟的都有,就是一个字,忙. 好了,废话也不多说,把自己学到的放上来吧.嗯,说什么好呢,就说原型链啊 原型对象 每个 ...

  6. css 解决图片下小空隙问题

    http://baijiahao.baidu.com/s?id=1581004863053583633&wfr=spider&for=pc 这篇讲的挺清楚,也有解决办法

  7. android 所有焦点问题

    一. 主动获取焦点 setFocusable(true);    //  是设置能否获得焦点而已.. requestFocus();          //是让控件得到焦点 requestFocusI ...

  8. Python笔记(十三):urllib模块

    (一)      URL地址 URL地址组件 URL组件 说明 scheme 网络协议或下载方案 net_loc 服务器所在地(也许含有用户信息) path 使用(/)分割的文件或CGI应用的路径 p ...

  9. 团队项目个人进展——Day10

    一.昨天工作总结 冲刺第十天,与小组成员任务合并,并解决结合后的一些问题. 二.遇到的问题 界面还是不太和谐 三.今日工作规划 对页面的布局.wxss做了一些修改

  10. textbox只允许输入数字

    private void txtUserId_KeyPress(object sender, KeyPressEventArgs e) { //如果输入的不是数字键,也不是回车键.Backspace键 ...