自我總結,歡迎拍磚!
目的:在需要返回int,long等基礎類型數據的情況下,盡量在mybatis的Mapper中用基礎類型的包裝類。
原因:當查詢的字段為空值時,mybatis會返回null,用基礎類型接收則會出現異常,但是用包裝類就把這個問題規避了。
一.讀數據環境准備:
創建student表(無主鍵):
create table student(id int,name varchar(20),idCard bigint,classNo varchar(10));
insert into student set id=1,name='007';
insert into studetn set name ='911911';
二.代碼:
StudentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.core.mapper.StudentMapper"> <select id="getStudent" resultType="com.core.entity.Student"> select id,name,idCard,classNo from student where id = #{id} </select> <select id="getIdCard" resultType="Long"> select idCard from student where id = #{id} </select> <select id="getId" resultType="Integer"> select id from student where name = #{name} </select> </mapper>
StudentMapper.java
package com.core.mapper; import org.apache.ibatis.annotations.Param; import com.core.entity.Student; public interface StudentMapper { public Student getStudent(@Param("id") int id); public Long getIdCard(@Param("id") int id); public Integer getId(@Param("name") String name); }
測試類StudentTest
package com.core.test; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import com.core.common.SessionFactory; import com.core.entity.Student; import com.core.mapper.StudentMapper; public class StudentTest { public static void main(String[] args) { SqlSession session =SessionFactory.getSqlSession(); try { StudentMapper mapper = session.getMapper(StudentMapper.class); Student blog = mapper.getStudent(1); System.out.println(blog.getName()); } finally { session.close(); } } //通過ID獲取IdCard @Test public void TestGetIdCard(){ SqlSession session =SessionFactory.getSqlSession(); try { StudentMapper mapper = session.getMapper(StudentMapper.class); Long idCard = mapper.getIdCard(1); } finally { session.close(); } } //通過name獲取Id @Test public void TestGetIdByName(){ SqlSession session =SessionFactory.getSqlSession(); try { StudentMapper mapper = session.getMapper(StudentMapper.class); Integer id = mapper.getId("911911"); } finally { session.close(); } } }
3.分析:
1.若StudentMapper.java和StudentMapper.xml中getIdCard的返回值類型為long類型,此時傳遞的參數id為1,查詢idCard的記錄為null,long 類型無法接受null值,所以會報異常,若均如上方的代碼中改成包裝類Long,則可以接受null值。
2.若StudentMapper.java和StudentMapper.xml中getId的返回值類型為int類型,此時傳遞的參數name為'911911',查詢id的記錄為null,int 類型無法接受null值,所以會報異常,若均如上方的代碼中改成包裝類Integer,則可以接受null值。
總結:在需要返回int,long等基礎類型數據的情況下,盡量在mybatis的Mapper中用基礎類型的包裝類。
PS:在Mapper.java中盡量用@Param這種參數傳遞方式和Mapper.xml對相對應。這樣就不用在Mapper.xml中配置屬性parameterType了