电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring boot2基于Mybatis實現多表關聯查詢

瀏覽:25日期:2023-09-09 11:47:39

模擬業務關系:

一個用戶user有對應的一個公司company,每個用戶有多個賬戶account。

spring boot 2的環境搭建見上文:spring boot 2整合mybatis

一、mysql創表和模擬數據sql

CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `company_id` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `company` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `account` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `user`VALUES (1, ’aa’, 1), (2, ’bb’, 2);INSERT INTO `company`VALUES (1, ’xx公司’), (2, ’yy公司’);INSERT INTO `account`VALUES (1, ’中行’, 1), (2, ’工行’, 1), (3, ’中行’, 2);

二、創建實體

public class User { private Integer id; private String name; private Company company; private List<Account> accounts; //getter/setter 這里省略...}public class Company { private Integer id; private String companyName; //getter/setter 這里省略...}public class Account { private Integer id; private String accountName; //getter/setter 這里省略...}

三、開發Mapper

方法一:使用注解

1、AccountMapper.java

package com.example.demo.mapper;import java.util.List;import org.apache.ibatis.annotations.Result;import org.apache.ibatis.annotations.Results;import org.apache.ibatis.annotations.Select;import com.example.demo.entity.Account;public interface AccountMapper { /* * 根據用戶id查詢賬戶信息 */ @Select('SELECT * FROM `account` WHERE user_id = #{userId}') @Results({ @Result(property = 'accountName', column = 'name') }) List<Account> getAccountByUserId(Long userId);}

2、CompanyMapper.java

package com.example.demo.mapper;import org.apache.ibatis.annotations.Result;import org.apache.ibatis.annotations.Results;import org.apache.ibatis.annotations.Select;import com.example.demo.entity.Company;public interface CompanyMapper { /* * 根據公司id查詢公司信息 */ @Select('SELECT * FROM company WHERE id = #{id}') @Results({ @Result(property = 'companyName', column = 'name') }) Company getCompanyById(Long id);}

3、UserMapper.java

package com.example.demo.mapper;import org.apache.ibatis.annotations.Result;import org.apache.ibatis.annotations.Results;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.One;import org.apache.ibatis.annotations.Many;import com.example.demo.entity.User;public interface UserMapper { /* * 一對一查詢 * property:查詢結果賦值給此實體屬性 * column:對應數據庫的表字段,做為下面@One(select方法的查詢參數 * one:一對一的查詢 * @One(select = 方法全路徑) :調用的方法 */ @Select('SELECT * FROM user WHERE id = #{id}') @Results({ @Result(property = 'company', column = 'company_id', one = @One(select = 'com.example.demo.mapper.CompanyMapper.getCompanyById')) }) User getUserWithCompany(Long id); /* * 一對多查詢 * property:查詢結果賦值給此實體屬性 * column:對應數據庫的表字段,可做為下面@One(select方法)的查詢參數 * many:一對多的查詢 * @Many(select = 方法全路徑) :調用的方法 */ @Select('SELECT * FROM user WHERE id = #{id}') @Results({ @Result(property = 'id', column = 'id'),//加此行,否則id值為空 @Result(property = 'accounts', column = 'id', many = @Many(select = 'com.example.demo.mapper.AccountMapper.getAccountByUserId')) }) User getUserWithAccount(Long id); /* * 同時用一對一、一對多查詢 */ @Select('SELECT * FROM user') @Results({ @Result(property = 'id', column = 'id'), @Result(property = 'company', column = 'company_id', one = @One(select = 'com.example.demo.mapper.CompanyMapper.getCompanyById')), @Result(property = 'accounts', column = 'id', many = @Many(select = 'com.example.demo.mapper.AccountMapper.getAccountByUserId')) }) List<User> getAll(); }

方法二:使用XML

參考上文spring boot 2整合mybatis配置application.properties和mybatis-config.xml等后,以上面的getAll()方法為例,UserMapper.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.example.demo.mapper.UserMapper' > <resultMap type='com.example.demo.entity.User'> <id column='id' jdbcType='INTEGER' property='id' /> <result property='name' column='name' jdbcType='VARCHAR' /> <!--封裝映射company表數據,user表與company表1對1關系,配置1對1的映射 association:用于配置1對1的映射 屬性property:company對象在user對象中的屬性名 屬性javaType:company屬性的java對象 類型 屬性column:user表中的外鍵引用company表 --> <association property='company' javaType='com.example.demo.entity.Company' column='company_id'> <id property='id' column='companyid'></id> <result property='companyName' column='companyname'></result> </association> <!--配置1對多關系映射 property:在user里面的List<Account>的屬性名 ofType:當前account表的java類型 column:外鍵 --> <collection property='accounts' ofType='com.example.demo.entity.Account' column='user_id'> <id property='id' column='accountid'></id> <result property='accountName' column='accountname'></result> </collection> </resultMap> <select resultMap='UserMap' > SELECT u.id,u.name,c.id companyid, c.name companyname, a.id accountid,a.name accountname FROM user u LEFT JOIN company c on u.company_id=c.id LEFT JOIN account a on u.id=a.user_id </select></mapper>

四、控制層

package com.example.demo.web;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.example.demo.entity.User;import com.example.demo.mapper.UserMapper;@RestControllerpublic class UserController { @Autowired private UserMapper userMapper; //請求例子:http://localhost:9001/getUserWithCompany/1 /*請求結果:{'id':1,'name':'aa','company':{'id':1,'companyName':'xx公司'},'accounts':null}*/ @RequestMapping('/getUserWithCompany/{id}') public User getUserWithCompany(@PathVariable('id') Long id) { User user = userMapper.getUserWithCompany(id); return user; } //請求例子:http://localhost:9001/getUserWithAccount/1 /*請求結果:{'id':1,'name':'aa','company':null,'accounts':[{'id':1,'accountName':'中行'},{'id':2,'accountName':'工行'}]}*/ @RequestMapping('/getUserWithAccount/{id}') public User getUserWithAccount(@PathVariable('id') Long id) { User user = userMapper.getUserWithAccount(id); return user; } //請求例子:http://localhost:9001/getUserWithAccount/1 /*請求結果:[{'id':1,'name':'aa','company':{'id':1,'companyName':'xx公司'},'accounts':[{'id':1,'accountName':'中行'}, {'id':2,'accountName':'工行'}]},{'id':2,'name':'bb','company':{'id':2,'companyName':'yy公司'},'accounts':[{'id':3,'accountName':'中行'}]}]*/ @RequestMapping('/getUsers') public List<User> getUsers() { List<User> users=userMapper.getAll(); return users; } }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 锌合金压铸-铝合金压铸厂-压铸模具-冷挤压-誉格精密压铸 | 口臭的治疗方法,口臭怎么办,怎么除口臭,口臭的原因-口臭治疗网 | 立刷【微电签pos机】-嘉联支付立刷运营中心 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 北京发电机出租_发电机租赁_北京发电机维修 - 河北腾伦发电机出租 | 【化妆品备案】进口化妆品备案流程-深圳美尚美化妆品有限公司 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 湿地保护| 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 精益专家 - 设备管理软件|HSE管理系统|设备管理系统|EHS安全管理系统 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 无机纤维喷涂棉-喷涂棉施工工程-山东华泉建筑工程有限公司▲ | 模切之家-专注服务模切行业的B2B平台! | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 洗地机-全自动/手推式洗地机-扫地车厂家_扬子清洁设备 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 板框压滤机-隔膜压滤机配件生产厂家-陕西华星佳洋装备制造有限公司 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 北京京云律师事务所 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 尊享蟹太太美味,大闸蟹礼卡|礼券|礼盒在线预订-蟹太太官网 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 活性氧化铝|无烟煤滤料|活性氧化铝厂家|锰砂滤料厂家-河南新泰净水材料有限公司 | 微量水分测定仪_厂家_卡尔费休微量水分测定仪-淄博库仑 | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 手板_手板模型制作_cnc手板加工厂-东莞天泓 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 |