【求助】使用Mybatis时SqlSessionFactory对象总是报空指针

光影00 2021-07-01 16:49:47

使用Mybatis时SqlSessionFactory对象总是报空指针:

java.lang.NullPointerException: Cannot invoke "org.apache.ibatis.session.SqlSessionFactory.openSession()" because "com.tao.utils.MybatisUtils.sqlSessionFactory" is null

1、Mysql数据库连接是正常的,使用数据库客户端测试过;

2、resources包导入也是正确的:import org.apache.ibatis.io.Resources;

有哪位高手能帮看看呀?就卡在这里没法继续下去了。多谢啦~~~~

==========================================================================================

相关代码如下

客户端测试类代码如下:

import com.tao.pojo.User;
import com.tao.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;

public class UserDaoTest {

    @Test
    public  void  test(){

        //第一步:获取sqlsession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //第二步: 执行SQL  方式一: getMapper

        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }

        sqlSession.close();

    }


}

实体类代码如下:

package com.tao.pojo;

public class User {
    private int id;
    private String name;
    private int age;

    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

工具类代码如下:

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;


//mybatis工具类
public class MybatisUtils {

    public static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();

    }



}

 

UserMapper.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.tao.dao.UserDao">
    <select id="getUserList" resultType="com.tao.pojo.User">
        select * from test01;
    </select>
</mapper>

 

...全文
4632 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
星期一的你 2023-01-29
  • 打赏
  • 举报
回复

跟我犯了同样的错

biankobe24 2021-07-05
  • 打赏
  • 举报
回复

useSSL true需要证书,你有证书吗

光影00 2021-07-07
  • 举报
回复
@biankobe24 哦哦,理解了。谢谢~
老王就是我 2021-07-02
  • 打赏
  • 举报
回复

静态变量sqlSessionFactory没有赋值啊,空指针不是很正常吗?

光影00 2021-07-01
  • 打赏
  • 举报
回复

刚才的空指针,确实是public static SqlSessionFactory sqlSessionFactory;没有赋值导致。

在静态代码块中,直接写sqlSessionFactory并赋值,就解决了。

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

==================================================================

但又遇到新的问题,虽然自己也解决了,但还是不清楚其中的原因。能解释一下不? 执行测试报错: Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

之后将Mybatis-config.xml中,useSSLuseUnicode都改成false了。先前为true,为什么true不行,而配置成false就能够运行成功呢?

配置的数据库连接信息:

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://1.1.1.1:3306/mysql?useSSL=false&amp;useUnicode=false&amp;characterEncoding=UTF-8"/>
                <property name="username" value="数据库用户名"/>
                <property name="password" value="数据库密码"/>
            </dataSource>
        </environment>
    </environments>
刘瑾言 2021-07-01
  • 打赏
  • 举报
回复 1

img 这里没赋值

光影00 2021-07-01
  • 举报
回复
@刘瑾言 嗯嗯。就是这个原因。
=PNZ=BeijingL 2021-07-01
  • 打赏
  • 举报
回复 2

"com.tao.utils.MybatisUtils.sqlSessionFactory" is null 表示sqlSessionFactory为空,看你的MybatisUtils 的静态变量sqlSessionFactory没有赋值,静态块里的处理赋值给了局部变量sqlSessionFactory 按照下面的改法试试

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 修改成下面的的代码试试
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
赖卓成 2021-07-01
  • 举报
回复 1
@=PNZ=BeijingL 应该是这个问题、
=PNZ=BeijingL 2021-07-01
  • 举报
回复 2
@赖卓成 问题解决就好
光影00 2021-07-01
  • 举报
回复 1
@=PNZ=BeijingL 嗯嗯。就是这个原因。谢谢啦~~
1条回复
我只爱钱 2021-07-01
  • 打赏
  • 举报
回复

看看配置文件的数据库地址有没有写对

光影00 2021-07-01
  • 举报
回复
@我只爱钱 配置文件地址都核对过了,是正确的。

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧