1. 程式人生 > >mybatis3.1-[topic-18-20]-_對映檔案_引數處理_單個引數&多個引數&命名引數 _POJO&Map&TO 三種方式及舉例

mybatis3.1-[topic-18-20]-_對映檔案_引數處理_單個引數&多個引數&命名引數 _POJO&Map&TO 三種方式及舉例

筆記要點
出錯分析與總結

/**MyBatis_對映檔案_引數處理_單個引數&多個引數&命名引數
 *             _POJO&Map&TO 三種方式及舉例 _
 *  單個引數 : #{引數名} ,取出引數值;  [mybatis 不會做特殊處理]
 *  多個引數 : 註冊介面:public Employee getEmpByIdAndLaseName(Integer id,String lastName);
 *          多個引數會被封裝成一個map,key :param1...paramN 或者引數索引從0開始
 *   命名引數: 明確指定封裝引數時mapper介面的key:@Param("id") @Param("lastName")
 *          多個引數會被封裝成一個map;
 *          key: 使用@param註解指定的值;
 *          value:引數值;
 *        #{指定的key} 取出對應的引數
 *   --------------------------------------------------------
 *  POJO
 *   1.如果多個引數正好是我們業務邏輯的資料模型,我們就可以直接傳入pojo
 *      #{屬性名}: 取出傳入的pojo的屬性值
 *
 *  Map:
 *   如果多個引數不是業務邏輯模型中的資料 ,沒有對應的pojo,為了方便,我們也可以傳入map
 *          #{指定的key} 取出Map中對應的引數
 *  TO:
 *   如果多個引數不是業務模型中的資料,但是經常使用,推薦來編寫一個TO(transfer object)
 *   資料傳輸物件:
 *   Page{
 *       int index;
 *       int size;
 *   }
 *   ===================思考====================
 *   public Employee getEmp(@Param("id")Integer id,String lastName);
 *      取值: id==>#{id/param1} lastName ==>#{param2}
 *
 *   public Employee getEmp(Integer id,@Param("e")Employee emp);
 *      取值: id==>#{param1} lastName ==>#{param2.lastName /e.lastName}
 *
 *   ###特別注意: 如果是Collection(List /Set)型別或者陣列,也會特殊處理,
 *   也是把傳入的list或者陣列封裝在map中;
 *         key: Collection(collection),如果是List還可以使用這個key(list),陣列(array)
 *   public Employee getEmpById(List<Integer> ids);
 *   取值,取出第一個id的值: #{ids[0]}
 *==================結合原始碼來看,mybatis如何處理====================
 * debug +Stepinto 即可檢視!


工程組織

<mapper namespace="com.dao.EmployeeMapper">
    <!--namespace: 名稱空間;id: 唯一標識; resultType:返回值型別; -->

    <!--public Employee getEmpByMap(Map<String,Object> map);-->
    <select id="getEmpByMap" resultType="com.bean.Employee" databaseId="mysql">
        select 
* from tbl_employee where id = #{id} and last_name =#{lastName} </select> <!-- 多個引數查詢 public Employee getEmpByIdAndLaseName(Integer id,String lastName);--> <select id="getEmpByIdAndLaseName" resultType="com.bean.Employee" databaseId="mysql"> select
* from tbl_employee where id = #{id} and last_name =#{lastName} </select>

 

//介面式程式設計! namespace: 名稱空間,指定為介面名字;
public interface EmployeeMapper {
    //傳入map
    public Employee getEmpByMap(Map<String,Object> map);
    //多個引數處理
    public Employee getEmpByIdAndLaseName(
            @Param("id") Integer id,@Param("lastName") String lastName);

    public Employee getEmpById(Integer id);
            //新增返回值型別,表示mybatis的執行SQL語句結果是true或者false
    public boolean addEmp(Employee employee);
    public boolean updateEmp(Employee employee);
    public boolean deleteEmpById(Integer id);
}

 

 測試類  class test_tp20 public class test_tp20 {

public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void test04() throws IOException {
        //預設是不自動提交資料的,需要我們自己手動提交
        SqlSession openSession = getSqlSessionFactory().openSession();

        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
//測試註釋方法提交元素

Employee jerry = mapper.getEmpByIdAndLaseName(1, "jerry"); // System.out.println(jerry);
//測試map方法提交
HashMap<String, Object> map = new HashMap<>(); map.put("id", 4); map.put("lastName", "葫蘆娃"); Employee empByMap = mapper.getEmpByMap(map); System.out.println(empByMap); /結果:/Employee{id=4, lastname='葫蘆娃', email='葫蘆娃@163.com', gender='0'} //最後手動提交 openSession.commit(); }finally { openSession.close(); } } }