mybatis ----数据级联查询(多对一)

2023-11-18

工程的目录结构:


有两个表,一个文章表article ,一个用户表user。

create table  article (id int(11) not null auto_increment,
                       userid int(11) not null,
                       title varchar(100) not null,
                       content text not null,
                       primary key (id))ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
insert into article(id,userid,title,content) values(1,1,'test_title','text_content'); 

insert into article(id,userid,title,content) values(2,1,'test_title_2','text_content_2');   
insert into article(id,userid,title,content) values(3,1,'test_title_3','text_content_3');                         
insert into article(id,userid,title,content) values(4,1,'test_title_4','text_content_4');  


create table user (id int(11) not null auto_increment,
                   userName varchar(50) default null,
                   userAge int(11) default null,
                   userAddress varchar(200) default null,
                   primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
                   

insert into user(id,userName,userAge,userAddress) values(1,'summer','100','上海');
现在要查询,根据用户的ID来查询他所拥有的文章。那么需要编写SQL语句如下:
select a.id, a.userName ,a.userAddress ,b.id aid, b.title,b.content
                                          from user a,article b 
                                         where a.id=b.userid and a.id=#{id}

现在就来贴下相关的JAVA代码和映射文件吧,该说的都在注释里了。

User.java

package com.mybatis.model;

public class User {
 private int id;
 private String userName;
 private String userAge;
 private String userAddress;
 
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getUserName() {
	return userName;
}
public void setUserName(String userName) {
	this.userName = userName;
}
public String getUserAge() {
	return userAge;
}
public void setUserAge(String userAge) {
	this.userAge = userAge;
}
public String getUserAddress() {
	return userAddress;
}
 public void setUserAddress(String userAddress) {
	this.userAddress = userAddress;
  }
 
}

Article.java

package com.mybatis.model;

public class Article {
	
	private int id;
	private User user; //文章的用户定义一个User对象,而不是int 类型
	private String title;
	private String content;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
}

接口类

IUserDao.java

package com.mybatis.dao;

import java.util.List;
import com.mybatis.model.Article;

public interface IUserDao {
	
 public List<Article> getUserArticles(int id);
}

总配置文件configution.xml

<?xml version="1.0" encoding="UTF-8" ?>   
<!DOCTYPE configuration   
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <typeAliases>
    <!-- 给实体类去一个别名  -->
        <typeAlias type="com.mybatis.model.User" alias="User"/> 
        <typeAlias type="com.mybatis.model.Article" alias="Article"/>
  </typeAliases>
  
  <!-- 数据源配置,这里用MySQL数据库 -->
  <environments default="development">
     <environment id="development">
         <transactionManager type="JDBC"/>
         <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
               <property name="username" value="root"/>
               <property name="password" value="123456"/>
         </dataSource>
     </environment>
  </environments>
  
  <mappers>
     <!-- book.xml装载进来,等同于把Dao的实现类装载进来 -->
       <mapper resource="com/mybatis/model/User.xml"/>
  </mappers>
  
</configuration>

User.xml

<?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="com.mybatis.dao.IUserDao">
       <!-- User联合Article进行查询 (多对一的方式)-->
       <resultMap type="Article" id="resultUserArticleList">
             <id property="id" column="aid"/>
             <result property="title" column="title"/>
             <result property="content" column="content"/>
             
             <!--关联一个用户 ,如果是关联多个的话,就需要用collection了-->
            <association property="user" javaType="User"> <!-- 这个 property="user" 对应的是Article中的User user属性-->
                   <id property="id" column="id"/>
                   <result property="userName" column="userName"/>
                   <result property="userAddress" column="userAddress"/>
            </association>
       </resultMap> 
       
       <select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
               select a.id, a.userName ,a.userAddress ,b.id aid, b.title,b.content
                                          from user a,article b 
                                         where a.id=b.userid and a.id=#{id}        
       </select>
</mapper>

总后,编写个测试类.

package com.mybatis.test;

import java.io.IOException;
import java.util.List;

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 com.mybatis.dao.IUserDao;
import com.mybatis.model.Article;

public class Test {
	
	/***
	 * 获得MyBatis SqlSessionFactory
	 * SqlSessionFactory 负责创建SqlSession ,一旦创建成功,就可以用SqlSession实例来执行映射语句
	 * ,commit,rollback,close等方法
	 * @return
	 */
	private static SqlSessionFactory getSessionFactory(){
		SqlSessionFactory sessionFactory=null;
		String resource="configuration.xml";
		 try {
			sessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sessionFactory;
	}
	
	/**
	 * main 方法
	 * @param args
	 */
	public static void main(String[] args) {
		
          SqlSession session=getSessionFactory().openSession();
     try {
    	 IUserDao userDao=session.getMapper(IUserDao.class);
    	 //传入用户的id=1
    	 List<Article> listArticle=userDao.getUserArticles(1);
         for(Article article:listArticle){
             System.out.println(article.getTitle()+":"+article.getContent()+
                     ":作者是:"+article.getUser().getUserName()+":地址:"+
                      article.getUser().getUserAddress());
         }
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		finally{
			session.close();
		}
	}
}

运行后结果如下:

test_title:text_content:作者是:summer:地址:上海
test_title_2:text_content_2:作者是:summer:地址:上海
test_title_3:text_content_3:作者是:summer:地址:上海
test_title_4:text_content_4:作者是:summer:地址:上海



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis ----数据级联查询(多对一) 的相关文章

  • 2. IDEA + maven + protobuf配置(on mac)

    1 絮絮叨叨 都说懒惰是人类进步的源泉 有时候想想还真就那么回事 学习了如何使用protoc命令编译 重度依赖IDEA且已经习惯了maven的我 就在想是否能在IDEA中一键编译 proto文件 2 vscode配置protobuf编辑环境

随机推荐

  • pyecharts实现电影数据分析可视化

    根据电影数据 使用pyecharts进行可视化分析 数据介绍 import pandas as pd data pd read csv 电影 csv data head 前5行数据如下 需要安装的python库 pip install pa
  • 2.晶晨A311D-编译Ubuntu/Debian固件

    上面是我的微信和QQ群 欢迎新朋友的加入 参考 https docs khadas com zh cn vim3 FenixScript html 编译环境 我重新安装了ubuntu20 安装软件包 配置环境 sudo apt get in
  • 【数据结构】排序(直接插入、折半插入、希尔、冒泡、快速、直接选择、堆、归并、基数排序)

    一 什么是排序 排序 将一组杂乱无章的数据按一定规律顺次排列起来 即 将无序序列的数据节点包含多个数据域 那么排序往往是针对其中某个域而言 二 排序方法的分类 1 按数据存储介质可分为 内部排序 数据量不大 数据在内存 无需内外存交换数据
  • SQL抽取数据脚本

    sp OutputData IF EXISTS SELECT 1 FROM sys objects o WHERE object id object id N sp OutputData AND OBJECTPROPERTY object
  • vue数据劫持 ajax,Vue视图更新原理 - 数据劫持,最小量更新和DIFF算法

    什么是数据劫持 加入有一个js文件内容如下 var obj x 100 y 200 Object defineProperties obj x set console log You gonna update x the vision wi
  • python smtp发送邮件 附件 中文名乱码 问题

    重点 mime add header Content Disposition attachment filename make header file name UTF 8 encode UTF 8 完整代码可以发送多个附件 import
  • 20220801:强改jar包的一下经历

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 改jar包内容 二 使用步骤 1 首先是修改的class文件 2 如何替换jar包中的class文件 总结 前言 目标是一个dubbo的服务 我们的工程引
  • VS2008错误Error spawning 'cmd.exe'的解决方法

    解决方法 In the Options go into Projects and Solutions gt VC Directories page and place this rows SystemRoot System32 System
  • Redisson配置类

    学习记录 Redisson配置类 Bean public RedissonClient redissonClient throws IOException ResourceLoader loader new DefaultResourceL
  • Dell台式机重装win 10系统之后开机报错

    电脑品牌 戴尔 报错信息 Hard disk dirve failure 硬盘驱动器故障 trick the F1 key to continue F2 to run the setup utility 报错原因 电脑一开机出现黑屏并出现H
  • Spring面向切面编程-AOP

    前言 在软件开发中 面向切面编程 Aspect Oriented Programming AOP 是一个非常重要的编程范式 Spring AOP是Spring框架提供的AOP实现 在Spring中使用AOP实现企业应用开发已经非常普遍 本文
  • 测试基础-静态白盒测试(检查代码)

    1 静态白盒测试 检查设计和代码 静态测试 测试非运行部分 检验和审查 白盒测试 访问代码 能够查看和审查 静态白盒测试 在不执行软件的条件下有条理地仔细审查软件设计 体系结构和代码 从而找出软件缺陷的过程 有时称为结构化分析 2 正式审查
  • yolov7运行自己的VOC格式数据集

    yolov7运行VOC格式数据集 代码下载 测试开发环境 使用自己的VOC格式数据集训练 修改配置文件yolov7 yaml 修改配置文件voc yaml VOC格式数据集转换COCO格式 开始训练 重头开始 fine train BUG
  • 【手写一个RPC框架】simpleRPC-03

    目录 前言 实现 项目创建 依赖配置 common service client server 文件结构 运行 本项目所有代码可见 https github com weiyu zeng SimpleRPC 前言 我们将新写一个服务接口 通
  • Ugly Numbers

    题目描述 Ugly numbers are numbers whose only prime factors are 2 3 or 5 The sequence 1 2 3 4 5 6 8 9 10 12 shows the first 1
  • 【深度学习】从LeNet-5识别手写数字入门深度学习

    活动地址 CSDN21天学习挑战赛 目录 LeNet模型 搭建环境 安装需要的包 创建工程 数据集 相关代码 可以设置GPU训练 默认CPU 通过TensorFlow下载数据集 对数据进行归一化处理 最值归一化 normalization
  • kvm创建快照与还原

    对k8s m1虚拟机创建快照 virsh snapshot create as k8s m1 20190317 查看虚拟机镜像快照的版本 virsh snapshot list k8s m1 或者 qemu img info opt kvm
  • Qt信号与槽

    信号与槽是Qt编程的基础 信号与槽在Qt中处理界面各个组件的交互操作时变得更加的直观和简单 信号 信号 Signal 就是在特定情况下被发射的事件 GUI程序设计的主要内容就是对界面上各个组件的信号进行响应 只需要知道什么情况下发射哪些信号
  • Vim配置#Vim插件安装#NERDTree配置

    一 centos系统的Vim安装 普通用户下输入命令 yum y install vim 之后输入y 即可等待安装完成 二 Vim的配置 如果你需要配置vim 只需在Home目录创建一个 vimrc文件即可以配置vim了 如需安装插件 在
  • mybatis ----数据级联查询(多对一)

    工程的目录结构 有两个表 一个文章表article 一个用户表user create table article id int 11 not null auto increment userid int 11 not null title