Consulta em várias tabelas de Mybatis_day3_Mybatis

Consulta de várias tabelas Mybatis

  • Esse caso analisa principalmente o relacionamento de várias tabelas Mybatis com o modelo mais simples de usuário e conta. O usuário é a tabela Usuário e a conta é a tabela Conta. Um usuário (Usuário) pode ter várias contas (Conta). O relacionamento específico é o seguinte:

Insira a descrição da imagem aqui


Consulta um para um (muitos para um)

  • Procura
    • Consulta todas as informações da conta, informações associadas ao usuário da consulta.
  • Nota:
    • Como as informações de uma conta só podem ser usadas por um determinado usuário, as informações relacionadas ao usuário da consulta de informações da conta são uma consulta individual. Se você consultar as informações da conta do usuário, é uma consulta um para muitos, porque um usuário pode ter várias contas.
Caminho um
  1. Classe de entidade que define informações da conta
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;

public Integer getId() {
	return id;
}
public void setId(Integer id) {
	this.id = id;
}
public Integer getUid() {
	return uid;
}
public void setUid(Integer uid) {
	this.uid = uid;
}
public Double getMoney() {
	return money;
}
public void setMoney(Double money) {
	this.money = money;
}
@Override
public String toString() {
return "Account [id=" + id + ", uid=" + uid + ", money=" + money + "]";
	}
}

  1. Defina a classe AccountUser
public class AccountUser extends Account implements Serializable {
private String username;
private String address;

public String getUsername() {
	return username;
}
public void setUsername(String username) {
	this.username = username;
}
public String getAddress() {
	return address;
}
public void setAddress(String address) {
	this.address = address;
}
@Override
public String toString() {
return super.toString() + " AccountUser [username=" + username + ", 
address=" + address + "]";
	}
}

  1. Gravar instrução SQL
实现查询账户信息时,也要查询账户所对应的用户信息。
SELECT  
	account.*, 
	user.username, 
	user.address
FROM 
	account,
 	user
WHERE account.uid = user.id

  1. Defina a interface Dao da camada de persistência da conta
public interface IAccountDao {
/**
* 查询所有账户,同时获取账户的所属用户名称以及它的地址信息
* @return
*/
List<AccountUser> findAll();
}

  1. Definir informações de configuração da consulta no arquivo AccountDao.xml
<mapper namespace="cn.myp666.dao.IAccountDao">
<!-- 配置查询所有操作-->
<select id="findAll" resultType="accountuser">
	select a.*,u.username,u.address from account a,user u where a.uid =u.id;
</select>
</mapper>
  • Nota: Como os resultados da consulta acima incluem informações da conta e do usuário, o valor do nosso tipo de retorno returnType é definido como o tipo AccountUser, para que você possa receber informações da conta e do usuário.

  1. Criar classe de teste AccountTest
@Test
public void testFindAll() {
//6.执行操作
	List<AccountUser> accountusers = accountDao.findAll();
	
	for(AccountUser au : accountusers) {
		System.out.println(au);
	}

  1. Sumário
  • Defina uma classe po especial como o tipo de saída, que define todos os campos do conjunto de resultados da consulta sql. Este método é relativamente simples e amplamente utilizado nas empresas.


Método dois
  • Use resultMap para definir um resultMap especial para mapear os resultados da consulta um a um.
  • No relacionamento orientado a objeto (tem a), é possível saber que podemos adicionar um objeto da classe User à classe Account para representar qual usuário da conta.
  1. Modifique

    a classe Account.Adicione o objeto User class à classe Account como um atributo da classe Account.
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
//添加User对象
private User user;

public User getUser() {
	return user;
}
public void setUser(User user) {
	this.user = user;
}


public Integer getId() {
	return id;
}
public void setId(Integer id) {
	this.id = id;
}
public Integer getUid() {
	return uid;
}
public void setUid(Integer uid) {
	this.uid = uid;
}
public Double getMoney() {
	return money;
}
public void setMoney(Double money) {
	this.money = money;
}
@Override
public String toString() {
return "Account [id=" + id + ", uid=" + uid + ", money=" + money + "]";
	}
}

  1. Modifique o método na interface AccountDao.

    Nota: Na segunda maneira, o valor retornado é alterado para o tipo de conta. Como a classe Conta contém um objeto da classe Usuário, ela pode encapsular as informações do usuário correspondentes à conta.
public interface IAccountDao {
/**
* 查询所有账户,同时获取账户的所属用户名称以及它的地址信息
* @return
*/
List<Account> findAll();
}

  1. Redefina o arquivo AccountDao.xml
<mapper namespace="cn.myp666.dao.IAccountDao">
	<!-- 建立对应关系 -->
	<resultMap type="account" id="accountMap">
		<id column="aid" property="id"/>
		<result column="uid" property="uid"/>
		<result column="money" property="money"/>
		<!-- 它是用于指定从表方的引用实体属性的 -->
		 <!--多对一的关系, property: 指的是属性的值, javaType:指的是属性的类型 -->
		<association property="user" javaType="user">
			<id column="id" property="id"/>
			<result column="username" property="username"/>
			<result column="sex" property="sex"/>
			<result column="birthday" property="birthday"/>
			<result column="address" property="address"/>
		</association>
	</resultMap>
	
<select id="findAll" resultMap="accountMap">
	select u.*,a.id as aid,a.uid,a.money from account a,user u where a.uid =u.id;
</select>
</mapper>

  1. Adicionar método de teste na classe AccountTest
@Test
public void testFindAll() {
	List<Account> accounts = accountDao.findAll();
	for(Account au : accounts) {
		System.out.println(au);
		System.out.println(au.getUser());
	}
}



Consulta um para muitos

  • Requisitos:

    • Consulte todas as informações do usuário e informações da conta relacionadas ao usuário.
  • Análise:

    • As informações do usuário e as informações da conta estão em um relacionamento um para muitos e, se o usuário não tiver informações da conta durante a consulta, as informações do usuário também deverão ser consultadas no momento.
  • Os passos são os seguintes:

  1. Escreva instruções SQL
SELECT
	u.*, 
	acc.id as aid,
	acc.uid,
 	acc.money
FROM
	user u
LEFT JOIN account acc ON u.id = acc.uid

  1. Classe de usuário adicionada à lista <conta>
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
private List<Account> accounts;

public List<Account> getAccounts() {
	return accounts;
}
public void setAccounts(List<Account> accounts) {
	this.accounts = accounts;
}
public Integer getId() {
	return id;
}
public void setId(Integer id) {
	this.id = id;
}
public String getUsername() {
	return username;
}
public void setUsername(String username) {
	this.username = username;
}
public Date getBirthday() {
	return birthday;
}
public void setBirthday(Date birthday) {
	this.birthday = birthday;
}
public String getSex() {
	return sex;
}
public void setSex(String sex) {
	this.sex = sex;
}
public String getAddress() {
	return address;
}
public void setAddress(String address) {
	this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", birthday=" + birthday
+ ", sex=" + sex + ", address="
+ address + "]";
	}
}

  1. Método de consulta adicionado à interface Dao da camada de persistência do usuário
List<User> findAll();

  1. Camada de persistência do usuário Configuração do arquivo de mapeamento Dao
<mapper namespace="cn.myp666.dao.IUserDao">
	<resultMap type="user" id="userMap">
		<id column="id" property="id"></id>
		<result column="username" property="username"/>
		<result column="address" property="address"/>
		<result column="sex" property="sex"/>
		<result column="birthday" property="birthday"/>
		<!-- collection 是用于建立一对多中集合属性的对应关系
ofType 用于指定集合元素的数据类型
-->
		<collection property="accounts" ofType="account">
			<id column="aid" property="id"/>
			<result column="uid" property="uid"/>
			<result column="money" property="money"/>
		</collection>
	</resultMap>
	
<!-- 配置查询所有操作 -->
<select id="findAll" resultMap="userMap">
	select u.*,a.id as aid ,a.uid,a.money from user u left outer join account 
a on u.id =a.uid
</select>
</mapper>
  • A
    seção de coleta define as informações da conta associadas ao usuário. Conjunto de resultados da consulta relevante
  • property = "accounts":
    em qual propriedade do objeto User é o conjunto de resultados da consulta associada armazenada.
  • ofType = "account":
    especifica o tipo de objeto no conjunto de resultados da consulta associada, ou seja, o tipo de objeto na Lista. Você pode usar um alias ou um nome completo aqui.

  1. Método de teste
@Test
public void testFindAll() {
//6.执行操作
	List<User> users = userDao.findAll();
	for(User user : users) {
		System.out.println("-------每个用户的内容---------");
		System.out.println(user);
		System.out.println(user.getAccounts());
	}
}
Publicado 94 artigos originais · elogiado 0 · visitas 2097

Acho que você gosta

Origin blog.csdn.net/qq_16836791/article/details/104779111
Recomendado
Clasificación