MyBatis的參數處理——parameterType 如何配置參數


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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM