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

现在我们创建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 一对一、一对多的更多相关文章
- JAVA框架  Mybaits  核心配置
		一:mybaits的核心配置文件:SqlMapConfig.xml 配置文件中需要关注的属性: 二.properites属性:一般引用配置文件(properites文件)比如:数据库的配置.我们可以编 ... 
- JAVA框架  Mybaits 动态代理
		一.动态代理: mybaits给咱们提供一套动态代理,我们只需要按他的要求写接口即可,mybatis帮做动态代理,相当于咱们写的接口的实现类.底层通过反射实例化代理对象,通过代理对象调用相应的方法, ... 
- JAVA框架  Mybaits
		注意:我们在resultType中,对于selectlist方法也是projo类.resultType参数的含义是list的泛型的类型. 一:jar包下载: https://github.com/m ... 
- java框架篇---hibernate(一对多)映射关系
		一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多 ... 
- JAVA框架  Mybaits 动态sql
		动态sql 一:if标签使用: 我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接. Mapper配置文件: < ... 
- JAVA框架  Mybaits  输入和输出映射
		一.输入映射 当前端传来的参数,比较复杂,比如说用户名称.订单单号.账号信息等等.后端有可能有多个projo类对应这些信息.我们需要把这些的projo类封装成一个类似一个vo类. 通过设置字段形式关联 ... 
- MyBaits一对一的查询方法
		MyBaits一对一的查询方法 一:表数据与表结构 CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name ) ); CRE ... 
- 转  分享我在阿里工作十年接触过Java框架设计模式
		转 原文: 分享我在阿里工作十年接触过Java框架设计模式 一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者 ... 
- 一,java框架学习
		一,java框架学习 Hibernate概述Hibernate是一个开放源代码的ORM(对象关系映射)框架,对jdbc进行了轻量级的封装,是的java开发人员可以使用面向对象编程思想操作数据库,简化操 ... 
随机推荐
- Android四大组件framework层
			activity https://www.kancloud.cn/alex_wsc/android-deep2/413484 当前Activity Activity向AMS发送StartActivit ... 
- Unix环境高级编程:fork, vfork, clone
			fork fork产生的子进程是传统意义上的进程,fork之后执行路径就互不关联了,一旦fork返回后面的代码就在不用的进程上下文中执行了.到底是子进程先执行还是父进程先执行一般是随机的或者依赖实现的 ... 
- OSGI企业应用开发(十一)Bundle资源获取途径
			使用OSGI模块化标准构建Java EE项目,其中比较繁琐的一个方面就是Bundle资源的获取,因为很多开源框架官方都没有发布Bundle版本的Jar文件,这也是使用OSGI开发企业应用首先要解决的问 ... 
- PHPCMS V9开发文档
			内容模块 内容模块PC标签调用说明 模块名:content 模块提供的可用操作 操作名 说明 lists 内容数据列表 relation 内容相关文章 hits 内容数据点击排行榜 category ... 
- FileWriter剖析
			集合这种容器存储数据,它只能在内存中临时存储,不能永久存储,这样会导致数据的丢失,所以出现了IO流. IO流用来处理设备之间的数据传输.可以用来做复制文件,上传文件,下载文件. 读数据是输入流,写数据 ... 
- Android逆向 Android平台虚拟机
			一 Dalvik:是Google开发运行在Android平台的Java虚拟机, Android程序编译后会生成dex文件.Dalvik虚拟机下运行Java时,要将字节码通过即时编译器(just in ... 
- C++二进制输入输出流接口设计
			提到输入输出流,作为CPPer很自然的就会想到std::iostream,对于文本流的处理,iostream可以说足够强大,应付一般复杂度的需求毫无压力.对二进制流处理却只能用“简陋”来形容,悲催的是 ... 
- 【转】CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
			原文地址:https://www.cnblogs.com/lzpong/p/5755678.html 我这里是centos7 升级到gcc8.1,过程差不多,参考这篇文章,记录一下. ---原文--- ... 
- Mac日常使用问题
			问题一: macbook如何关闭safari左侧书签栏? 方法1: 快捷键:control+command+1键 办法2: 把光标移到safari顶部, 菜单单出来后, 选择view-->sho ... 
- python 之__new__
			注意: 继承自object的新式类才有__new__方法 类中的__init__方法依赖__new__方法的正确返回,init中的self就是__new__返回的实例 __new__至少要有一个参数c ... 
