前言:在項目中,某些實體類之間肯定有關(guān)鍵關(guān)系,比如一對一,一對多等。在hibernate 中用 one to one 和 one to many ,而mybatis 中就用 association 和 collection 。 association: 一對一關(guān)聯(lián)(has one)collection:一對多關(guān)聯(lián)(has many) 注意,只有在做select查詢時才會用到這兩個標簽,都有三種用法,且用法類似。 一、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 UserDao {
/**
* 通過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層的設計以及在UserDao.xml中queryById方法的sql語句的編寫,因為不論用association的哪種方式,sql語句都是一樣的寫,不同的只是userMap的寫法,所以這里先給出這段代碼。User詢Card是一對一關(guān)系,在數(shù)據(jù)庫中,tbuser表通過外鍵cardid關(guān)聯(lián)tb_card表。下面分別用association的三種用法來實現(xiàn)queryById方法。 1、第一種用法:association中使用select這種方法需要再定義CardDao.java,如下: public interface CardDao {
Card queryCardById(int cardId);
}
在CardDao.xml中實現(xiàn)該方法: <select id="queryCardById" parameterType="int" resultType="Card">
SELECT *
FROM tb_card
WHERE card_id=#{cardId}
</select>
然后再看UserDao.xml中是如何引用這個方法的: <resultMap type="User" id="userMap">
<result property="userName"
column="user_name"/>
<result property="age"
column="age"/>
<association property="card"
column="card_id"
select="com.zhu.ssm.dao.
CardDao.queryCardById">
</association>
</resultMap>
在這里直接通過select引用CardDao的queryById方法。個人感覺這種方法比較麻煩,因為還要在CardDao里定義queryCardById方法并且實現(xiàn)再引用才有用,不過這種方法思路清晰,易于理解。 2、第二種方法,嵌套resultMap<resultMap type="Card" id="cardMap">
<id property="cardId"
column="card_id"/>
<result property="cardNum"
column="card_num"/>
<result property="address"
column="address"/>
</resultMap>
<resultMap type="User" id="userMap">
<result property="userName"
column="user_name"/>
<result property="age"
column="age"/>
<association property="card"
resultMap="cardMap">
</association>
</resultMap>
第二種方法就是在UserDao.xml中先定義一個Card的resultMap,然后在User的resultMap的association標簽中通過resultMap="cardMap"引用。這種方法相比于第一種方法較為簡單。 3、第三種方法:嵌套resultMap簡化版<resultMap type="User" id="userMap">
<result property="userName"
column="user_name"/>
<result property="age"
column="age"/>
<association
property="card"
column="card_id"
javaType="Card">
<id property="cardId"
column="card_id"/>
<result property="cardNum"
column="card_num"/>
乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9
|