1. 程式人生 > 實用技巧 >### Error opening session. Cause: java.lang.NullPointerException

### Error opening session. Cause: java.lang.NullPointerException

在測試mybatis的SQL語句時,出現如下錯誤提示:


我的Java程式碼:

//測試查詢
@Test
public void run1() throws Exception {
    // 載入配置檔案
    InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
    // 建立SqlSessionFactory物件
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
    // 建立SqlSession物件
    SqlSession session = factory.openSession();
    // 獲取到代理物件
    BlogMapper mapper = session.getMapper(BlogMapper.class);

    List<Blog> emps = mapper.selectByExample(null);
    for (Blog blog : emps) {
        System.out.println(blog);
    }
    // 關閉資源
    session.close();
    in.close();
}

錯誤原因是我在整合SSM框架的時候,把mybatis框架的部分配置,整合到了spring-context.xml配置檔案中。下面是可以發現下面mybatis-config.xml檔案中沒有關於資料庫的配置。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- MyBatis的全域性配置檔案 -->
<configuration>

   <settings>
      <!-- 對映下劃線到駝峰命名    last_name ==> lastName    -->
      <setting name="mapUnderscoreToCamelCase" value="true"/>
      <!-- 開啟延遲載入 -->
      <setting name="lazyLoadingEnabled" value="true"/>
      <!-- 指定載入的屬性是按需載入 -->
      <setting name="aggressiveLazyLoading" value="false"/>
      <!-- 二級快取 -->
      <setting name="cacheEnabled" value="true"/>
   </settings>

   <!--使用typeAliases配置別名,它只能配置domain中類的別名 -->
   <typeAliases>
      <package name="com.online.domain"/>
   </typeAliases>

   <!--分頁外掛-->
   <plugins>
      <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
   </plugins>

</configuration>

解決辦法:
在mybatis-config.xml的同級目錄下,新增一個新的Mybatis配置檔案SqlMapConfig.xml進行測試使用。
SqlMapConfig.xml程式碼:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置環境 -->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 引入對映配置檔案 -->
    <mappers>
        <package name="com.online.dao"/>
    </mappers>
</configuration>

然後將Java程式碼中的mybatis-config.xml換為SqlMapConfig.xml。

//測試查詢
@Test
public void run1() throws Exception {
    // 載入配置檔案
    InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
    // 建立SqlSessionFactory物件
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
    // 建立SqlSession物件
    SqlSession session = factory.openSession();
    // 獲取到代理物件
    BlogMapper mapper = session.getMapper(BlogMapper.class);

    List<Blog> emps = mapper.selectByExample(null);

    for (Blog blog : emps) {
        System.out.println(blog);
    }
    // 關閉資源
    session.close();
    in.close();
}