mybatis的association以及collection的用法
前言:
在项目中,某些实体类之间肯定有关联关系,比如一对一,一对多等。mybatis 中使用 association 和 collection 。
association:一对一关联(has one)
collection :一对多关联(has many)
注意:
只有做查询时才会涉及到联表,使用其完成联表查询 。两个标签都可以总结为三种方式。
一、association 的三种用法:
先来看看如下代码(set,get方法没有列出)
public class User {
private Integer userId;
private String userName;
private Integer age;
private Card card;//一个人一张身份证,1对1
}
public class Card {
private Integer cardId;
private String cardNum;//身份证号
private String address;//地址
}
public interface UserMapper {
/**
* 通过userId查询user信息
* @param userId
* @return
*/
User queryById(int userId);
}
<select id="queryById" parameterType="int" resultMap="userMap">
SELECT u.user_name,u.age,c.card_id,c.card_num,c.address
FROM tb_user u,tb_card c
WHERE u.card_id=c.card_id
AND
u.user_id=#{
userId}
</select>
以上是实体类,dao层的设计以及在UserMapper.xml中 queryById 方法的 sql 语句的编写,因为不论用 association的哪种方式,sql语句都是一样的写,sql 语句都是一样的写,不同的只是 userMap 的写法,所以这里先给出这段代码。User 和 Card 是一对一的关系,在数据库中,t_user 表通过外键 card_id 关联 t_card 表。下面分别用 association 的三种用法来实现 queryById 方法。
第一种用法:association中使用select
这种方法需要再定义 CardMapper.java如下:
public interface CardMapper {
Card queryCardById(int cardId);
}
在 CardMapper.xml 中实现该方法:
<select id="queryCardById" parameterType="int" resultType="com.ck.smm.entity.Card">
SELECT *
FROM tb_card
WHERE card_id=#{
cardId}
</select>
然后再看 UserMapper.xml 是如何引用这个方法的:
<resultMap type="User" id="userMap">
<result property="userName" column=