3、Mybatis 的引數深入
技術標籤:# mybatis
Mybatis 的引數深入
OGNL表示式:
Object Graphic Navigation Language
物件 圖 導航 語言
它是通過物件的取值的方法來獲取資料。在寫法上把get給省略了。
比如:我們獲取使用者的名稱
類中的寫法:user.getUsername();
OGNL表示式寫法:user.username
mybatis中為什麼能直接寫username,而不用user.呢:
因為在parameterType中已經提供了屬性所屬的類,所以此時不需要寫物件名
1、傳遞 pojo 包裝物件
開發中通過 pojo 傳遞查詢條件 ,查詢條件是綜合的查詢條件,不僅包括使用者查詢條件還包括其它的查 詢條件(比如將使用者購買商品資訊也作為查詢條件),這時可以使用包裝物件傳遞輸入引數。
Pojo 類中包含 pojo。
需求:根據使用者名稱查詢使用者資訊,查詢條件放到 QueryVo 的 user 屬性中。
1.1、編寫 QueryVo
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
1.2、編寫持久層介面
public interface UserDao {
/**
* 根據 QueryVo 中的條件查詢使用者
* @param vo
* @return
*/
List<User> findByVo(QueryVo vo);
}
1.3、持久層介面的對映檔案
<!-- 根據使用者名稱稱模糊查詢,引數變成一個 QueryVo 物件了 --> <select id="findByVo" resultType="com.itheima.domain.User" parameterType="com.itheima.domain.QueryVo"> select * from user where username like #{user.username}; </select
1.4、測試包裝類作為引數
@Test
public void testFindByQueryVo() {
QueryVo vo = new QueryVo();
User user = new User();
user.setUserName("%王%");
vo.setUser(user);
List<User> users = userDao.findByVo(vo);
for(User u : users) {
System.out.println(u);
}
}
2、Mybatis 的輸出結果封裝
2.1、resultType 配置結果型別
resultType 屬性可以指定結果集的型別,它支援基本型別和實體類型別。
我們在前面的 CRUD 案例中已經對此屬性進行過應用了。
需要注意的是,它和 parameterType 一樣,如果註冊過類型別名的,可以直接使用別名。沒有註冊過的必須 使用全限定類名。例如:我們的實體類此時必須是全限定類名(今天最後一個章節會講解如何配置實體類的別名)
同時,當是實體類名稱是,還有一個要求,實體類中的屬性名稱必須和查詢語句中的列名保持一致,否則無法 實現封裝。
2.2、修改實體類
public class User implements Serializable {
private Integer userId;
private String userName;
private Date userBirthday;
private String userSex;
private String userAddress;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getUserBirthday() {
return userBirthday;
}
public void setUserBirthday(Date userBirthday) {
this.userBirthday = userBirthday;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", userBirthday="
+ userBirthday + ", userSex="
+ userSex + ", userAddress=" + userAddress + "]";
}
}
2.3、 Dao 介面
/**
* 查詢所有使用者
* @return
*/
List<User> findAll();
2.4、對映配置
<!-- 配置查詢所有操作 -->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
2.5、測試查詢結果
@Test
public void testFindAll() {
List<User> users = userDao.findAll();
for(User user : users) {
System.out.println(user);
}
}
為什麼名稱會有值呢?
因為:mysql 在 windows 系統中不區分大小寫!
2.6、修改對映配置
使用別名查詢
<!-- 配置查詢所有操作 -->
<select id="findAll" resultType="com.itheima.domain.User">
select id as userId,username as userName,birthday as userBirthday,sex as userSex,address as userAddress from user
</select>
執行結果:
2.7、resultMap 結果型別
resultMap 標籤可以建立查詢的列名和實體類的屬性名稱不一致時建立對應關係。從而實現封裝。
在 select 標籤中使用 resultMap 屬性指定引用即可。
同時 resultMap 可以實現將查詢結果對映為複雜類 型的 pojo,比如在查詢結果對映物件中包括 pojo 和 list 實現一對一查詢和一對多查詢。
2.7.1、定義 resultMap
<!-- 建立 User 實體和資料庫表的對應關係type 屬性:指定實體類的全限定類名id 屬性:給定一個唯一標識,是給查詢 select 標籤引用用的。-->
<resultMap type="com.itheima.domain.User" id="userMap">
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
<result column="birthday" property="userBirthday"/>
</resultMap>
id 標籤:用於指定主鍵欄位
result 標籤:用於指定非主鍵欄位
column 屬性:用於指定資料庫列名
property 屬性:用於指定實體類屬性名稱
2.7.2、對映配置
<!-- 配置查詢所有操作 -->
<select id="findAll" resultMap="userMap">
select * from user
</select>
2.7.3、測試結果
@Test
public void testFindAll() {
List<User> users = userDao.findAll();
for(User user : users) {
System.out.println(user);
}
}
執行結果: