《从空指针到百万访问:小丁学Java的1024天创作者之路》

文章目录

      • 文章目录 ✨
      • 机缘
      • 收获
      • 日常 ️
      • 成就
      • 憧憬

文章目录 ✨


  • 机缘
    提示:可以和大家分享最初成为创作者的初心,例如实战项目中的经验分享、日常学习过程中的记录、通过文章进行技术交流等…

  • 收获
    提示:在这创作过程中都有哪些收获,例如获得了多少粉丝的关注、获得了多少正向的反馈如赞、评论、阅读量等、认识和哪些志同道合的领域同行等…

  • 日常 ️
    提示:当前创作和你的工作、学习是什么样的关系,例如创作是否已经是你生活的一部分了、有限的精力下,如何平衡创作和工作学习等…

  • 成就
    提示:你过去写得最好的一段代码是什么?请用代码块贴出来,例如某个解题代码、某个项目实现代码等…

  • 憧憬
    提示:职业规划、创作规划等…


机缘

今天是2025年2月25日,晚上11:38 PST,距离我成为技术创作者的起点——2022年5月9日,已经过去了整整1024天。作为一名Java开发者,我的创作初心源于学生时代的学习经历,那是我第一次真正感受到知识分享的力量。

我的创作之旅始于一次学习MyBatis框架时的技术难题。2022年5月9日,我在大学宿舍埋头研究MyBatis,试图通过SqlSessionFactory实现一个简单的数据库查询Demo。然而,运行程序时,控制台抛出了一个让我头疼的错误日志:

Exception in thread "main" java.lang.NullPointerException
    at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:84)
    at com.itheima.test.MybatisTest.main(MybatisTest.java:24)
Process finished with exit code 1

这个空指针异常(NullPointerException)让我困惑了整整一个下午。我查阅了MyBatis官方文档、搜索了Stack Overflow,甚至向学校的编程社团求助,但问题依然没有解决。深夜,宿舍熄灯后,我坐在电脑前反复调试,逐步排查问题。最终,我发现问题的根源在于MybatisTest.java的导入(import)语句错误:我错误地导入了javax.annotation.Resource(一个J2EE注解,与MyBatis无关),而不是正确的org.apache.ibatis.io.Resources(MyBatis提供的资源加载类)。由于导入错误,Resources.class.getResourceAsStream("SqlMapConfig.xml")返回null,导致SqlSessionFactoryBuilder.build(in)抛出空指针异常。

我迅速修正了import语句,将错误的import javax.annotation.Resource;替换为正确的import org.apache.ibatis.io.Resources;。修正后的代码如下:

package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {
    public static void main(String[] args) throws Exception {
        // 1. 读取配置文件
        InputStream in = Resources.class.getResourceAsStream("SqlMapConfig.xml");
        // 2. 创建SqlSessionFactory对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        // 3. 创建SqlSession对象
        SqlSession session = factory.openSession();
        // 4. 使用SqlSession获取UserDao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
    }
}

为验证结果,我在博客中提供了以下图片:

  • 错误日志截图:显示java.lang.NullPointerException的完整堆栈信息。
  • 导入对比图:展示错误的import javax.annotation.Resource;(用红叉标记)和正确的import org.apache.ibatis.io.Resources;(用红勾标记)。
  • 项目结构和成功运行截图:展示修正后的MybatisTest.java代码、正确的项目结构(包括SqlMapConfig.xml文件位置),以及程序运行成功后的控制台输出。

解决问题的瞬间,我意识到这个经验对其他初学者可能同样宝贵。于是,我决定将这一过程记录下来,撰写了我的第一篇技术博客《(已解决)mybatis 的SqlSessionFactory 报空指针异常》,发布在CSDN上。这不仅是我实战项目中的经验分享,也是日常学习过程中的记录,同时通过文章与技术社区进行交流。从那天起,我开始了自己的创作者之旅,初心就是帮助他人解决技术难题,同时记录自己的成长。


收获

在这1024天的创作过程中,我收获了显著的成果,这些成果让我更加坚定了继续分享的信念。

首先,我获得了巨大的粉丝关注。截至2025年2月25日,我的CSDN账号“小丁学Java”已积累了16,517名粉丝。这些粉丝包括学生、初级开发者以及行业中的资深工程师,他们通过我的文章学习MyBatis、Java基础知识、Spring框架和调试技巧。这庞大的粉丝群体让我深刻感受到技术分享的影响力,特别是在中国开发者社区中的广泛认可。

其次,我收到了大量的正向反馈。第一篇博客《(已解决)mybatis 的SqlSessionFactory 报空指针异常》获得了超过2000次阅读量,50多个点赞和20多条评论。评论中,有人写道:“小丁,你的文章救了我三天的时间,太感谢了!”还有人留言:“思路清晰,图片直观,受益匪浅!”截至目前,我的总访问量已达960,982次,原创文章1,074篇,评论数16,517,铁粉(获赞数)993。这些数据反映了我的文章在社区中的认可度。特别是后续文章,如《Java多线程同步技巧》和《Spring Boot最佳实践》,平均阅读量稳定在5000次以上,评论区经常出现“干货满满”“值得收藏”的评价。

最后,我通过创作认识了许多志同道合的领域同行。在CSDN社区,我结识了数十位Java开发者,其中包括在校学生、初创公司工程师以及一些技术博主。我们通过评论、私信和线下技术交流会建立了联系,共同讨论MyBatis优化、Spring Boot微服务和高并发解决方案的实现。例如,我曾与一位资深开发者合作优化了一个开源项目的MyBatis配置,共同提交了PR,这让我深刻体会到团队协作的力量。此外,我还加入了一个Java学习小组,与成员定期分享技术心得,共同成长。这些同行关系不仅拓宽了我的技术视野,还让我在社区中找到了归属感。


日常 ️

当前,我的创作与工作、学习密切相关,已经成为我生活的重要组成部分。

创作已经成为我生活的一部分。每周,我会抽出一到两个小时,总结最近的项目经验或学习笔记,整理成博客文章。截至2025年2月25日,我已坚持创作1,074篇原创文章,平均每周约2篇,形成了稳定的输出习惯。这不仅帮助我巩固知识,还能为社区贡献价值。例如,在工作中遇到一个复杂的多线程同步问题,我会记录调试过程和解决方案,发布后常常收到读者的感谢反馈,评论数累计达16,517条。

然而,有限的精力让我需要在创作、工作和学习之间找到平衡。大学毕业后,我加入了一家互联网公司,负责Java后端开发,工作内容包括高并发系统的优化和数据库设计,经常需要加班。面对时间压力,我采取了以下策略:一是利用碎片时间,如通勤时规划文章大纲;二是将创作与工作结合,将项目中的技术难点直接转化为博客内容;三是设定每周创作目标(如一篇500字的技术文章),避免过度消耗精力。这些方法让我在繁忙中保持创作的连续性,同时不影响工作和学习进度。例如,2024年我完成了一个分布式系统的优化项目,之后用一周时间整理成一篇博客,阅读量突破8000次,评论中多位读者表示受益匪浅,铁粉数新增50次。

有时候,创作进度会因为工作任务繁重而放缓,但每当我打开CSDN后台,看到16,517名粉丝的关注和960,982次访问量,内心的动力就会重新燃起。我相信,只要初心不改,创作与工作学习就能相辅相成。


成就

在我过去的创作和学习中,我认为最值得骄傲的一段代码是我在解决SqlSessionFactory空指针异常后优化后的MybatisTest.java。这段代码不仅解决了最初的问题,还体现了异常处理和资源管理的严谨性。以下是这段代码:

package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {
    public static void main(String[] args) {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = null;
        SqlSessionFactory sqlSessionFactory = null;
        SqlSession sqlSession = null;

        try {
            // 1. 读取配置文件
            inputStream = Resources.getResourceAsStream(resource);
            if (inputStream == null) {
                throw new IOException("配置文件 " + resource + " 未找到");
            }
            // 2. 创建SqlSessionFactory对象
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            // 3. 创建SqlSession对象
            sqlSession = sqlSessionFactory.openSession();
            // 4. 使用SqlSession获取UserDao接口的代理对象
            IUserDao userDao = sqlSession.getMapper(IUserDao.class);
            // 5. 执行查询操作(示例)
            List<User> users = userDao.findAll();
            for (User user : users) {
                System.out.println(user);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 6. 关闭资源
            if (sqlSession != null) {
                sqlSession.close();
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

这段代码的亮点在于:

  • 异常处理:增加了对InputStreamnull的检查,防止配置文件未找到时直接抛出空指针。
  • 资源管理:使用try-finally块确保SqlSessionInputStream资源被正确关闭,避免资源泄漏。
  • 模块化设计:将配置文件加载、工厂创建和会话管理分步实现,便于调试和维护。
  • 扩展性:为后续添加查询逻辑(如userDao.findAll())提供了基础。

这段代码不仅解决了最初的空指针问题,还成为我后续学习和优化的起点,在社区中也得到了广泛认可。例如,这段代码的优化版本被多位读者转载,并在我后续的1,074篇博客中多次引用,累计阅读量超过10,000次,评论数新增200条,铁粉数增加50次。


憧憬

展望未来,我对职业和创作都有清晰的规划。在职业方面,我希望在接下来的三年内(2025-2028),成为一名资深Java后端工程师,专注于高并发系统和分布式架构的设计。我计划通过参与大型项目、考取Oracle Java SE认证和深入研究Spring Cloud框架来实现这一目标。同时,我希望在公司中承担更多技术领导角色,带领团队解决复杂问题,争取在2028年前晋升为技术经理。

在创作方面,我计划将博客升级为一个技术分享平台,定期发布高质量文章,覆盖Java核心、MyBatis优化、Spring Boot实践和高并发解决方案。基于当前的16,517名粉丝和960,982次访问量,短期目标是每月至少发布两篇500字以上的文章,将原创文章数量在2026年底提升至1,200篇。长期目标是出版一本关于Java后端开发的电子书,分享我在学习和工作中积累的经验。此外,我计划通过CSDN的里程碑专区,与更多开发者交流,组织线上技术沙龙或线下meetup,构建一个活跃的Java学习社区,目标是粉丝数在2027年突破20,000,铁粉数达到1,500。

我的憧憬不仅是个人成长,更是希望通过技术和分享,影响更多人,让编程成为连接世界的桥梁。感谢CSDN提供的平台和16,517位粉丝的支持,这份旅程才更有意义。让我们共同努力,在代码的星空中点亮更多希望!


你可能感兴趣的:(创作者纪念日)