mybatis不可忽略的細節


自我總結,歡迎拍磚!

目的:在需要返回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了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM