博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring boot 2使用Mybatis多表关联查询
阅读量:6089 次
发布时间:2019-06-20

本文共 6111 字,大约阅读时间需要 20 分钟。

模拟业务关系:

一个用户user有对应的一个公司company,每个用户有多个账户account。

spring boot 2的环境搭建见上文:

一、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
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
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
getAll(); }

 

方法二:使用XML

参考上文配置application.properties和mybatis-config.xml等后,

以上面的getAll()方法为例,UserMapper.xml配置如下:

四、控制层

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
getUsers() { List
users=userMapper.getAll(); return users; } }

 

转载地址:http://usvwa.baihongyu.com/

你可能感兴趣的文章
c语言编译执行过程
查看>>
我发誓,这真不是我写的
查看>>
UI组件-UIButton
查看>>
java获取在各种编码下中文及英文的字符个数
查看>>
Kilo 版 Keystone 数据库结构
查看>>
RetrunMoreRow
查看>>
Redis学习笔记(3)-Hash
查看>>
Alpha冲刺——Day1
查看>>
C++静态成员函数,静态成员变量,运算符重载
查看>>
CentOS6下安装git
查看>>
Centos6.5下docker 环境搭建
查看>>
Generic performance test
查看>>
解决eclipse异常退出后再次启动时自动退出的问题
查看>>
python基础===使用switch方法,减少使用if语句
查看>>
学习新知识的思路
查看>>
linux下kerberos教程
查看>>
第四次作业
查看>>
磁盘IOPS计算与测量
查看>>
Oracle 主键自增 Native Sequence两种方式
查看>>
Javascript单元测试框架比较Qunit VS Jasmine
查看>>