优先使用基本数据类型

出处:《Effective Java》第2版第五条 ~避免创建不必要的对象

java1.5发行版本引入了自动拆装箱它允许程序员将基本数据类型和装箱基本类型混用,按需要自动装箱和拆箱。自动装箱使得基本类型和装箱基本类型之间的差别变得模糊起来,但是并没有完全消除。它们在语义上还有微妙的差别,在性能上也有着比较明显的差别。

测试:分别用long类型和Long类型计算所有int正值的总和

    public static void main(String[] args) {
        //用引用数据类型Long作计算
        long startTime1 = System.currentTimeMillis();
        Long sum1 = 0L;
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            sum1 += i;
        }
        long endTime1 = System.currentTimeMillis();
        System.out.println(sum1+"~Long耗时:"+(endTime1-startTime1)+"ms");

        //用基本数据类型long作计算
        long startTime2 = System.currentTimeMillis();
        long sum2 = 0L;
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            sum2 += i;
        }
        long endTime2 = System.currentTimeMillis();
        System.out.println(sum2+"~long耗时:"+(endTime2-startTime2)+"ms");
    }

测试结果:

书作者的测试时间是43秒和6.8秒,敢情我的机器比作者的快了10倍。-_-b

使用Long类型,意味着程序构造了大约2^{31}个Long对象。结论:优先使用基本数据类型,当心无意识的自动拆装箱。

 

<think>我们正在讨论MyBatis中如何使用resultType返回基本数据类型(如int、String等)而不是对象类型。根据引用[5],我们可以知道resultType可以配置为基本数据类型或其包装类,也可以配置为引用数据类型(如自定义对象)。下面将详细说明如何配置。###一、返回基本数据类型的场景在MyBatis中,当SQL查询返回的是单个值(例如计数、求和、最大值等)时,我们可以直接使用基本数据类型或它们的包装类作为resultType。###二、配置方法####1.返回整型(int/Integer)例如,查询员工总数:```xml<selectid="countEmployees"resultType="int">SELECTCOUNT(*)FROMemployee</select>```或者使用包装类(推荐,避免null值问题):```xml<selectid="countEmployees"resultType="java.lang.Integer">SELECTCOUNT(*)FROMemployee</select>```####2.返回字符串(String)例如,查询某个员工的姓名:```xml<selectid="getEmployeeName"resultType="string">SELECTnameFROMemployeeWHEREid=#{id}</select>```或者使用全限定名:```xml<selectid="getEmployeeName"resultType="java.lang.String">SELECTnameFROMemployeeWHEREid=#{id}</select>```####3.返回布尔型(boolean/Boolean)例如,检查员工是否存在:```xml<selectid="existsEmployee"resultType="boolean">SELECTEXISTS(SELECT1FROMemployeeWHEREid=#{id})</select>```####4.返回浮点型(double/Double)例如,计算平均工资:```xml<selectid="getAvgSalary"resultType="double">SELECTAVG(salary)FROMemployee</select>```###三、注意事项1.**别名使用**:MyBatis为常用基本数据类型提供了内置别名(如int,string,double等),也可以使用全限定类名(如java.lang.Integer)[^2]。2.**空值处理**:如果查询结果可能为NULL,建议使用包装类(如Integer、Double)以避免基本数据类型默认值(如0)带来的歧义。3.**结果集大小**:确保查询返回的是单行单列的值,否则会抛出异常。###四、示例代码####Mapper接口```javapublicinterfaceEmployeeMapper{intcountEmployees();//返回基本类型intIntegercountEmployeesWrapper();//返回包装类IntegerStringgetEmployeeName(intid);booleanexistsEmployee(intid);doublegetAvgSalary();}```####MapperXML```xml<selectid="countEmployees"resultType="int">SELECTCOUNT(*)FROMemployee</select><selectid="countEmployeesWrapper"resultType="java.lang.Integer">SELECTCOUNT(*)FROMemployee</select><selectid="getEmployeeName"resultType="string">SELECTnameFROMemployeeWHEREid=#{id}</select><selectid="existsEmployee"resultType="boolean">SELECTEXISTS(SELECT1FROMemployeeWHEREid=#{id})</select><selectid="getAvgSalary"resultType="double">SELECTAVG(salary)FROMemployee</select>```###五、常见问题**Q:为什么查询返回null时基本数据类型会报错?**A:当resultType为基本数据类型(如int)而查询结果为null时,MyBatis尝试将null转换为基本数据类型会导致错误。此时应使用包装类(如Integer)[^5]。**Q:返回Map和返回基本数据类型有什么区别?**A:返回Map适用于查询多列但不想创建实体类的情况,而返回基本数据类型仅适用于单列值[^2][^4]。---§§相关问题§§1.MyBatis中如何返回Map类型的结果?2.当resultType为基本数据类型时,如何处理SQL查询返回null的情况?3.MyBatis中resultType和resultMap的区别是什么?4.如何为自定义类型配置别名以简化resultType配置?5.MyBatis中如何返回多个基本数据类型的值(例如同时返回员工数量和平均工资)?</think>### MyBatis 中 `resultType` 返回基本数据类型的配置方法 在 MyBatis 中,`resultType` 可以直接指定为基本数据类型或其包装类,适用于查询结果为单个值的场景(如计数、求和等)。以下是具体配置方法: #### 一、常用基本数据类型配置 1. **整型数据**(如员工数量统计) ```xml <select id="countEmployees" resultType="int"> SELECT COUNT(*) FROM employee </select> ``` 或使用包装类(推荐,避免 null 值问题): ```xml <select id="countEmployees" resultType="java.lang.Integer"> SELECT COUNT(*) FROM employee </select> ``` 2. **字符串类型**(如查询员工姓名) ```xml <select id="getEmployeeName" resultType="string"> SELECT name FROM employee WHERE id = #{id} </select> ``` 3. **布尔类型**(如检查员工是否存在) ```xml <select id="checkEmployeeExists" resultType="boolean"> SELECT EXISTS(SELECT 1 FROM employee WHERE id = #{id}) </select> ``` 4. **浮点类型**(如计算平均工资) ```xml <select id="getAvgSalary" resultType="double"> SELECT AVG(salary) FROM employee </select> ``` #### 二、关键注意事项 1. **类型别名** MyBatis 内置了基本数据类型的别名,可直接使用: - `int` → `_int` 或 `java.lang.Integer` - `double` → `_double` 或 `java.lang.Double` - `boolean` → `_boolean` 或 `java.lang.Boolean` - `String` → `string` 或 `java.lang.String`[^2] 2. **空值处理** 当查询结果可能为 `NULL` 时: ```java // Mapper 接口使用包装类 Integer countEmployees(); // 允许返回 null ``` 避免使用基本数据类型(如 `int`),否则会因 `null` 转换引发异常[^5]。 3. **SQL 结果要求** 必须确保查询返回**单行单列**值: ```sql SELECT COUNT(*) -- ✅ 单列值 SELECT salary -- ❌ 多行结果需用集合接收 ``` #### 三、完整示例 **Mapper 接口**: ```java public interface EmployeeMapper { int countAll(); // 基本类型 Integer countByDept(String dept); // 包装类 Double getMaxSalary(); } ``` **Mapper XML**: ```xml <select id="countAll" resultType="_int"> SELECT COUNT(*) FROM employee </select> <select id="countByDept" resultType="java.lang.Integer"> SELECT COUNT(*) FROM employee WHERE dept = #{dept} </select> <select id="getMaxSalary" resultType="double"> SELECT MAX(salary) FROM employee </select> ``` #### 四、性能优化建议 1. 大数据量统计使用 `COUNT(1)` 替代 `COUNT(*)` 2. 复杂计算尽量在 SQL 中完成,避免 Java 二次处理 > **最佳实践**:当返回单个统计值时优先使用基本数据类型;当字段值可能为 `NULL` 时使用包装类[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值