MyBatis(八) 資料庫BLOB讀寫、批量更新操作、儲存過程呼叫、分表、分頁

z1340954953發表於2018-07-10

資料庫BLOB讀寫

Java欄位型別定義為byte[],資料庫表的欄位型別為BLOB,常用的型別轉換器是BlobTypeHandler

批量更新配置

<!-- 配置預設的執行型別是批量模式 -->
<setting name="defaultExecutorType" value="BATCH"/>

還有一種方式是在獲取sqlSession的時候進行設定

SqlSession session = factory.openSession(ExecutorType.BATCH)

或者在整合spring的時候配置

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
	<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
	<!-- 更新採用批量模式 -->
	<constructor-arg index="1" value="BATCH"></constructor-arg>
</bean>

呼叫儲存過程

* mysql中建立儲存過程

DROP PROCEDURE IF EXISTS get_stuName;
DELIMITER $
create procedure get_stuName(in stuid int, out stuname varchar(50))
begin
select stu_name into stuname from student_info where stu_id = stuid ;
end $
DELIMITER ;

* 定義入參的pojo型別,其實就是Student類

* 定義查詢語句

public void getStudentNameByProceDure(Student stu);
<select id="getStudentNameByProceDure" statementType="CALLABLE"
  parameterType="student"
  >
  { call get_stuName
  (#{stuId,mode=IN,jdbcType=INTEGER},
  #{stuName,mode=OUT,jdbcType=VARCHAR})}
  </select>

引數設定中對於儲存過程的支援

mode: 可以設定 IN,OUT,INOUT

jdbcType: org.apache.ibatis.type.JdbcType 中的列舉型別

javaType和typeHandler都可以指定。

另外當返回的型別是遊標jdbcType=CURSOR,還需要設定resultMap接受對映結果

接受遊標結果

<select id="getStudentNameByProceDure" statementType="CALLABLE"
  parameterType="student"
  >
  { call get_info
  (#{stuId,mode=IN,jdbcType=int},
  #{stuName,mode=OUT,jdbcType=VARCHAR},
  #{stuInfoList,mode=OUT,jdbcType=CURSOR,resultMap=cursorMap}
  )}
  </select>

分表的應用

其實就是將查詢引數,作為sql的一部分傳進去。

select  *   from student_info_${year} m 

分頁

Mybatis的分頁支援型別RowBounds,缺點是會將結果全查詢出來,在進行擷取,適合資料量比較小的查詢,大資料的查詢不推薦使用

new RowBounds(int offset,int limit) offset索引,limit查詢的資料量

public Student queryStudentInfoByStudent(@Param("id")Integer id, RowBounds rb);
 <select id="queryStudentInfo" resultMap="studentAndCourse" parameterType="int">
    select  *   from student_info m where m.stu_id = #{id}
  </select>
mapper.queryStudentInfoByStudent(5, new RowBounds(0,10));




相關文章