MyBatis的參數處理
1. parameterType 配置參數
1) 參數的使用說明
SQL語句傳參,使用標簽的 parameterType 屬性來設定。
該屬性的取值可以是基本類型,引用類型(例如:String 類型),還可以是實體類類型(POJO 類)。
同時也可以使用實體類的包裝類,本章節將介紹如何使用實體類的包裝類作為參數傳遞。
2) 參數配置的注意事項
parameterType配置參數:
在一個參數時可以忽略(可寫可不寫),
多個相同參數要寫
多個不同參數不寫
基本類型和String可以直接寫類型名稱也可以使用包名.類名的方式,例如:java.lang.String。
實體類類型,目前我們只能使用全限定類名。
究其原因,是mybaits在加載時已經把常用的數據類型注冊了別名,從而我們在使用時可以不寫包名,而我們的是實體類並沒有注冊別名,所以必須寫全限定類名。
2、parameterType 配置多參數方式
1. 傳遞 pojo 包裝對象(自定義實體類封裝參數,我們使用bean、pojo或entity來指代實體類)
開發中通過 pojo 傳遞查詢條件 ,查詢條件是綜合的查詢條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如將用戶購買商品信息也作為查詢條件),這時可以使用包裝對象傳遞輸入參數,Pojo 類中包含 pojo。
需求:根據用戶名查詢用戶信息,查詢條件放到 QueryVo 的 user 屬性中。
1) 編寫QueryVo
package cn.study.entity;
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
2) 編寫持久層接口UserMapper
public interface UserMapper {
public List<User> getUserByLikeName(QueryVo queryVo);
}
3) 配置接口方法對應的sql文件
<select id="getUserByLikeName" parameterType="cn.offcn.entity.QueryVo" resultType="cn.offcn.entity.User">
select * from user where name like #{user.name}
</select>
4) 測試QueryVo對象作為參數
@Test
public void testGetUserByLikeName() throws Exception{
//獲取SqlSession對象
SqlSession session = MyBatisUtils.getSession();
//調用SqlSession 創建 UserDao接口的代理對象
UserMapper userMapper = session.getMapper(UserMapper.class);
//創建User對象
User user=new User();
user.setName("%李%");
QueryVo queryVo=new QueryVo();
queryVo.setUser(user);
//調用deleteUser方法進行模糊查詢
List<User> userList = userMapper.getUserByLikeName(queryVo);
userList.forEach(System.out::print);
//關閉連接
MyBatisUtils.close(session);
}
2. map集合數據作為參數的處理方式
1) 添加接口方法參數使用map集合
public List<User> getUserByGenderAndAge(Map<String,Object> map);
2) 配置接口對應的sql配置
<!--#{}中參數必須和Map集合中的key保存一致,表示取Map集合中指定key的值。-->
<select id="getUserByGenderAndAge" parameterType="java.util.Map" resultType="cn.offcn.entity.User">
select * from user where gender=#{sex} and age=#{age}
</select>
3) 測試map集合作為參數
@Test
public void testGetUserByGenderAndAge() throws Exception{
//獲取SqlSession對象
SqlSession session = MyBatisUtils.getSession();
//調用SqlSession 創建 UserDao接口的代理對象
UserMapper userMapper = session.getMapper(UserMapper.class);
Map<String,Object> map=new HashMap<String,Object>();
map.put("sex","男");
map.put("age",22);
List<User> userList = userMapper.getUserByGenderAndAge(map);
userList.forEach(System.out::print);
//關閉連接
MyBatisUtils.close(session);
}
3. @Param方式解決多參數映射處理
1)@Param注解的介紹
@Param注解用於給方法內的參數取別名,當方法中擁有多個參數時,我們無法一次性將這些參數進行傳遞,
尤其多個參數具有不同的數據類型時無法傳遞,所以我們利用@Param給每個方法中的參數取一個別名,在映射文件中使用別名進行取值。
2) 添加接口方法參數使用@Param注解
public List<User> getUserByGenderAndBirthday(@Param("gen") String gender,Param("birth") Date birthday);
3) 配置接口對應的sql配置
<select id="getUserByGenderAndBirthday" resultType="cn.offcn.entity.User">
select * from user where gender=#{gen} and age=#{birth}
</select>
4) 測試注解方法
@Test
public void testGetUserByGenderAndBithday() throws Exception{
//獲取SqlSession對象
SqlSession session = MyBatisUtils.getSession();
//調用SqlSession 創建 UserDao接口的代理對象
UserMapper userMapper = session.getMapper(UserMapper.class);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,1997);
calendar.set(Calendar.DAY_OF_MONTH,10);
calendar.set(Calendar.DAY_OF_MONTH,12);
Date birthday=calendar.getTime();
List<User> userList = userMapper.getUserByGenderAndBirthday("女",birthday);
userList.forEach(System.out::print);
//關閉連接
MyBatisUtils.close(session);
}
4.多參數映射處理其他方式(不推薦)
實體類對象User.java
package cn.study.entity;
import java.util.Date;
public class User {
private Integer id;
private String userName;
private String gender;
private Integer age;
private Date birthday;
public User(){}
public User(String userName, String gender, Integer age, Date birthday) {
this.userName = userName;
this.gender = gender;
this.age = age;
this.birthday = birthday;
}
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 String getGender() {
return gender;
}
...
}
1、使用下標(argxx)
1) 添加接口方法參數
public List<User> getUserByGenderAndBirthday(String gender, Date birthday);
2) 添加接口方法參數
<select id="getUserByGenderAndBirthday" resultType="cn.offcn.entity.User">
select * from user where gender=#{arg0} and age=#{arg1}
</select>
2、參數全部屬於一個實體類時,使用實體類對象屬性
1) 添加接口方法參數
public List<User> getUserByGenderAndBirthday(User user);
2) 添加接口方法參數
<select id="getUserByGenderAndBirthday" parameterType="cn.offcn.entity.User" resultType="cn.offcn.entity.User">
select * from user where gender=#{gender} and age=#{birthday}
</select>