一对一查询(多对一)
需求:查询所有账户信息,关联查询下单用户信息。
1.账户信息实体类(方法一)
//get 和 set 方法省略,toString省略,自己补
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
}
2.编写SQL语句
SELECT account.id,uid,money,username,address
FROM account JOIN USER ON (user.`id`= account.`UID`)
3.定义 AccountUser 类
为了能够封装上面 SQL 语句的查询结果,定义 AccountCustomer 类中要包含账户信息同时还要包含用户信息,所以我们要在定义 AccountUser 类时可以继承 User 类。
//get 和 set 方法省略,toString省略,自己补
public class AccountUser extends Account{
private String username;
private String address;
}
4.定义账户的持久层 Dao 接口
public interface IAccountDao {
/**
* 查询所有账户,并且带有名字和地址
* @return
*/
List<AccountUser> findAllAccount();
}
5.编写 AccountDao.xml 映射文件中的查询配置信息
注意:返回值类型 returnType的值设置为 AccountUser 类型
<!--查询所有账户,并且带有名字和地址-->
<select id="findAllAccount" resultType="AccountUser">
SELECT account.id,uid,money,username,address FROM account JOIN USER ON (user.`id`= account.`UID`)
</select>
定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段。此方法较为简单,企业中使用普遍。
方法二:使用 resultMap,定义专门的 resultMap 用于映射一对一查询结果。通过面向对象的(has a)关系可以得知,我们可以在 Account 类中加入一个 User 类的对象来代表这个账户是哪个用户的。
1.账户信息实体类(增加User对象)(方法二)
//get 和 set 方法省略,toString省略,自己补
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
private User user;
}
2.修改定义账户的持久层 Dao 接口
public interface IAccountDao {
/**
* 查询所有账户,并且带有名字和地址
* @return
*/
List<Account> findAllAccount();
}
3.编写 AccountDao.xml 映射文件中的查询配置信息
<!--定义Account和User的resultMap-->
<resultMap id="accountUserMap" type="account">
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--一对一的关系映射,配置封装user的内容-->
<association property="user" column="uid" javaType="user">
<result property="id" column="id"></result>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</association>
</resultMap>
<!--配置查询所有-->
<select id="findAll" resultMap="accountUserMap">
SELECT account.id AS aid,uid,money,user.* FROM account JOIN USER ON (user.`id`= account.`UID`)
</select>
SQL的结果:
4.测试
@Test //配置查询所有账户
public void testFindAll(){
List<Account> accountList = accountDao.findAll();
for (Account account : accountList){
System.out.println(account);
System.out.println(account.getUser());
}
}