mybatis3.1-[topic-18-20]-_對映檔案_引數處理_單個引數&多個引數&命名引數 _POJO&Map&TO 三種方式及舉例
阿新 • • 發佈:2018-11-29
筆記要點
出錯分析與總結
/**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(); } } }