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(); } } }
原文地址:https://www.cnblogs.com/zhazhaacmer/p/10037726.html