MyBatis<select>节点中的resultType和resultMap属性

1.为什么要进行resultType或resultMap注解配置
当需要实现的数据访问是查询类型的,在节点中使用resultType即可;

  • 当使用星号表示字段列表时,配置以指导MyBatis封装,并且,在 SELECT COUNT(*) FROM t_user

    如果某个查询的抽象方法的返回值是List集合类型的,例如:

    List findAll();

    在配置 SELECT * FROM t_user ORDER BY id

    注意:使用了这种做法后,就需要对抽象方法名称的定义增加一个要求“不允许重载”!

    3.resultMap
    3.1 一对一查询中的resultMap的使用
    在没有自定义别名的情况下,如果查询结果的列名与类的属性名不一致,还可以自定义节点进行配置,该节点的作用就是指导MyBatis封装查询到的数据!

    
    
    
        
        
        
        
        
        
        
        
    
    
    

    在以上配置中,需要注意:节点中的id属性值就是节点中配置useCache="false",然后,就不需要开发人员进行其它配置了,MyBatis会自动处理缓存的数据,并且,一旦当前namespace执行了增删改类型的操作,就会重建缓存!

    小结:在SQL中使用自定义别名,并在中使用resultMap,均可解决由于名称不一致导致无法封装查询结果的问题。

    3.2 一对多查询中的resultMap的使用
    在一对多的查询中,MyBatis根本就不知道怎么封装查询结果中的数据!当没有匹配的查询结果,或只有1条查询结果时,并不会报错,只是查询结果的数据不正确而已,如果查询结果有多条,则会出现如下错误信息:

    Caused by: org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

    为了保障能够正确的封装查询结果,必须使用来指导MyBatis封装!并且,在SQL语句中,还需要为某个id定义别名,以保证查询结果每一列的名称都不同,否则,MyBatis只会从相同的列名中排列靠前的那一列中取数据,甚至,如果在中使用配置主键,当出现多条数据的最靠前的那一列id值相同时,重复id的数据将不会被封装!

    具体配置如下:

    
    
      
    
    
    	
    		
    		
    		
    		
    		
    			
    			
    			
    			
    			
    			
    			
    		
    	
    
    	
    
    

    注意:在配置一对多的查询时,在中,即使存在列名与属性名完全相同的数据,也必须通过节点进行配置!

  • 你可能感兴趣的:(MyBatis,mybatis)