MyBatis(四) 對映器配置(自動對映、resultMap手動對映、引數傳遞)

z1340954953發表於2018-07-04

引入對映器

 	<!-- 1.檔案路徑引入 -->
  	<mapper resource="cn\bing\mapper\StudentMapper.xml"/>
  	<!-- 2.映入對映器的類檔案 -->
  	<mapper class="cn.bing.mapper.StudentMapper"/>
  	<!-- 3.包路徑引入 -->
	<package name="cn.bing.mapper"/>
	<!-- 4 -->
	<mapper url="file:///var/mappers/cn/bing/mapper/StudentMapper.xml"/>

對映器的主要元素


select元素配置

* id屬性,和namespace構成唯一標識,為定義介面的方法名稱

* parameterType,入參的型別,可以是全路徑類名,也可以是別名,必須是上下文定義的

* parameterMap, 廢棄

* resultType, 可以是全路徑名,也可以是別名,結果集將通過javaBean對映,不能和resultMap同時使用

* resultMap, 定義表欄位和pojo的欄位的對映規則

另外幾個不常用的元素:

* flushCache,作用是呼叫sql後,是否要求MyBatis清空之前的查詢的本地快取和二級快取,預設false

* useCache,啟動二級快取,預設為true

查詢中的自動對映

也就是沒有配置resultMap的對映規則,直接將查詢的欄位值對映到對應的pojo的欄位上,

要求資料庫欄位和pojo的欄位名一致,這種情況下,一般是要給查詢的欄位起和pojo欄位一致的別名

<select id="queryStudentInfo" resultType="Student" parameterType="_int">
    select  
    stu_id as stuId, 
    stu_Age as stuAge,
    stu_Sex as stuSex, 
    stu_Name as stuName 
    from student_info where stu_id = #{id}
  </select>

自動對映的設定

<settings>
	<!-- 
	none:不自動對映
	partial:只會自動對映,沒有定義巢狀結果集的結果
	full: 不管是否巢狀,都自動對映
	 -->
	<setting name="autoMappingBehavior" value="none"/>
</settings>

resultMap指定對映方式

在對映過程中,可能需要指定typeHandler進行型別轉換,自動對映無法完成, 此時藉助resutlMap

* 將上面自動對映的SQL片段,修改

1. 無需指定列的別名,在resultMap中設定列的對映規則

2. 去除resultType,指定resultMap,兩個屬性不同共存

<select id="queryStudentInfo" resultMap="studentMap" parameterType="_int">
    select  stu_id,stu_Age,stu_Sex,stu_Name
    from student_info where stu_id = #{id}
  </select>
<resultMap type="cn.bing.pojo.Student" id="studentMap">
  	<id column="stu_id" property="stuId"/>
  	<result column="stu_age" property="stuAge"/>
  	<result column="stu_sex" property="stuSex" 
  	jdbcType="TINYINT" 
  	javaType="cn.bing.pojo.Sex" 
  	typeHandler="cn.bing.typeHandler.MyEnumTypeHandler"/>
  	<result column="stu_name" property="stuName"/>
  </resultMap>

type: 對映的javaBean型別

id主鍵列,result一般列

   property: 表列名對映的javaBean 欄位

   column: 表列名

引數傳遞的三種方式

指定parameterType的三種型別

1. map方式

public Student queryStudentByNameAndSex(Map<String, String> map);
<select id="queryStudentByNameAndSex" resultType="student" parameterType="map">
    select  
    stu_id as stuId, 
    stu_Age as stuAge,
    stu_Sex as stuSex, 
    stu_Name as stuName 
    from student_info where stu_name = #{name} and stu_sex = #{sex}
  </select>
map的key需要和sql裡面的引數一致 map.put("sex",sex)  map.put("name",name);

2. 註解方式

public Student queryStudentByNameAndSex(@Param("name")String stuName,@Param("sex")String sex);
<select id="queryStudentByNameAndSex" resultType="student" parameterType="map">
    select  
    stu_id as stuId, 
    stu_Age as stuAge,
    stu_Sex as stuSex, 
    stu_Name as stuName 
    from student_info where stu_name = #{name} and stu_sex = #{sex}
  </select>

3. javaBean的方式

要求javaBean的欄位名和SQL片段中的引數名稱一致

public void insertStudent(Student student);
<insert id="insertStudent" parameterType="student">
   insert into student_info (stu_age,stu_sex,stu_name) values 
   (#{stuAge},#{stuSex},#{stuName})
  </insert>


相關文章