Spring boot2基于Mybatis實現(xiàn)多表關(guān)聯(lián)查詢
模擬業(yè)務(wù)關(guān)系:
一個用戶user有對應(yīng)的一個公司company,每個用戶有多個賬戶account。
spring boot 2的環(huán)境搭建見上文:spring boot 2整合mybatis
一、mysql創(chuàng)表和模擬數(shù)據(jù)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);
二、創(chuàng)建實體
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 這里省略...
}
三、開發(fā)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 {
/*
* 根據(jù)用戶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 {
/*
* 根據(jù)公司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:查詢結(jié)果賦值給此實體屬性
* column:對應(yīng)數(shù)據(jù)庫的表字段,做為下面@One(select方法的查詢參數(shù)
* one:一對一的查詢
* @One(select = 方法全路徑) :調(diào)用的方法
*/
@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:查詢結(jié)果賦值給此實體屬性
* column:對應(yīng)數(shù)據(jù)庫的表字段,可做為下面@One(select方法)的查詢參數(shù)
* many:一對多的查詢
* @Many(select = 方法全路徑) :調(diào)用的方法
*/
@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 id="UserMap" type="com.example.demo.entity.User">
<id column="id" jdbcType="INTEGER" property="id" />
<result property="name" column="name" jdbcType="VARCHAR" />
<!--封裝映射company表數(shù)據(jù),user表與company表1對1關(guān)系,配置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對多關(guān)系映射
property:在user里面的List<Account>的屬性名
ofType:當(dāng)前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 id="getAll" 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;
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
//請求例子:http://localhost:9001/getUserWithCompany/1
/*請求結(jié)果:{"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
/*請求結(jié)果:{"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
/*請求結(jié)果:[{"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;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)
- Mybatis-Plus多表關(guān)聯(lián)查詢的使用案例解析
- MyBatis多表關(guān)聯(lián)查詢的實現(xiàn)示例
- mybatis-plus多表聯(lián)查join的實現(xiàn)
- MyBatis-Plus多表聯(lián)查(動態(tài)查詢)的項目實踐
- MyBatis實現(xiàn)多表聯(lián)查的詳細(xì)代碼
- MyBatis-Plus多表聯(lián)查的實現(xiàn)方法(動態(tài)查詢和靜態(tài)查詢)
- Mybatis-Plus 多表聯(lián)查分頁的實現(xiàn)代碼
- MyBatis-Flex實現(xiàn)多表聯(lián)查(自動映射)
相關(guān)文章
PowerShell用戶認(rèn)證Function實例代碼
這篇文章主要介紹了PowerShell用戶認(rèn)證Function的資料,并附實例代碼,幫助大家學(xué)習(xí)理解,有需要的小伙伴可以參考下2016-09-09
Java讀取json數(shù)據(jù)并存入數(shù)據(jù)庫的操作代碼
很多朋友問大佬們JAVA怎么把json存入數(shù)據(jù)庫啊,這一問題就把我難倒了,糾結(jié)如何操作呢,下面小編把我的經(jīng)驗分享給大家,感興趣的朋友一起看看吧2021-08-08
java聯(lián)系人管理系統(tǒng)簡單設(shè)計
這篇文章主要為大家詳細(xì)介紹了java聯(lián)系人管理系統(tǒng)簡單設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10

