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了
mybatis不可忽略的细节的更多相关文章
- mybatis的一些小细节
Mybatis要解决的问题: 1. 将sql语句硬编码到java代码中,如果修改sql语句,需要修改java代码,重新编译.系统可维护性不高. 设想如何解决? 能否将sql单独配置在配置文件中. 2. ...
- 聊聊自学大数据flume中容易被人忽略的细节
前言:老刘不敢保证说的有多好,但绝对是非常良心地讲述自学大数据开发路上的一些经历和感悟,保证会讲述一些不同于别人技术博客的细节. 01 自学flume的细节 老刘现在想写点有自己特色的东西,讲讲自学 ...
- html5一些容易忽略的细节
最近由于经常写前端,所以系统性的看了一下html5页面的基础信息,虽然以前写了很久的html代码,但是其中的一些细节还是容易被忽略,所以这里一起整理一下. 在html5中,空元素结尾处的空格和斜杠是可 ...
- Mybatis学习的一些细节
一.mybatis 基本配置 最近几天一直在学习mybatis,看了一些源码,本文讲述mybatis的一些基本配置和基本的用法和注意到一些细节.个人时间和精力有限,本文属于流水账类型,不成体系,算是自 ...
- html中不要忽略一些细节
1. img必备和可选的参数都有写了上了,但是必备参数里的一个值alt没写(其实一些大型的专业门户网站其实也是有存在一些小问题的,只要我们细心一 点就能发现).虽然这样alt不写,在页面中也不会有任何 ...
- mybatis使用注意的细节
1.mybatis对sql执行后会对结果进行封装,如果没有返回任何记录,只是封装后的对象没有值,而对象并不为空null: (这个问题疏忽坑了两次,在对返回数组结果进行判断的时候,我用的if(Array ...
- Mybatis需要注意的细节
mybatis第二篇 1.${}和#{}的区别 1.#在传参的时候,会自动拼接单引号:$不能拼接单引号; 2.$传参时,一般不支持jdbcType指定类型的写法;#则可以;如: #{name,jd ...
- Java 语法 try catch使用容易忽略的细节 BigDecimal
try catch使用细节 一. try catch的使用方式容易理解,两者最终都要执行finally中的代码,而当return在try和catch中又会有什么效果? 如果我们做一个简单的例子就会发现 ...
- 你真的理解了java单例模式吗?讲别人都忽略的细节!
前言:老刘这篇文章敢做保证,java的单例模式讲的比大多数的技术博客都要好,讲述别人技术博客都没有的细节!!! 1 java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上 ...
随机推荐
- ogg-oracle to sqlserver
环境: source: 54 Centos7 oracle12.2 ogg12.3 target : 52 Windows sqlserver2012 ...
- js和native交互方法浅析
一.背景 最近接触公司项目,需要和原生app做交互,由此业务需求,开始了学习探索之路. 二.解决方案之WebViewJavascriptBridge 想要和app交互,必须在app上先把bridge进 ...
- 【转】Memory gates checking failed because the free memory***解决办法
Issue: Vault users cannot connect. VLOGS show the following error: Memory gates checking failed beca ...
- JAVA多线程之CountDownLatch
前序: 上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现. 经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消 ...
- android studio无法识别含有rcs包名的jar
http://blog.csdn.net/JingleYe/article/details/70048943 android studio无法识别含有rcs包名的jar android stu ...
- win10清除桌面快捷方式小箭头
reg add /d "%systemroot%\system32\imageres.dll,197" /t reg_sz /f taskkill /f /im explorer. ...
- [国嵌攻略][098][Linux内核简介]
Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序, ...
- 10个html5增加的重要新特性和内容
文章开篇之前我们先了解一下什么是html5,百度上是这样定义html5的:万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改. 其实说白了html5也就是人为定义 ...
- Effective Java 第三版——25. 将源文件限制为单个顶级类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 如何开发由Create-React-App 引导的应用(二)
此文章是翻译How to develop apps bootstrapped with Create React App 官方文档 系列文章 如何开发由Create-React-App 引导的应用 如 ...