JNDI扩展知识

JNDI扩展知识

1 JNDI概述和原理
JNDI:Java Naming and Directory Interface。是SUN公司推出的一套规范,属于JavaEE技术之一。目的是模仿windows系统中的注册表。
在服务器中注册数据源:如图所示:在这里插入图片描述
2 JNDI搭建maven的war工程
1.打开IDEA工具的界面如图所示,点击Create New Project。在这里插入图片描述
2.选择Maven工程和JDK的版本以及骨架,并点击Next。如图所示:在这里插入图片描述
3.填写项目名称和保存的地址,点击Next。如图所示:在这里插入图片描述
4. 解决maven项目创建过慢的问题如图所示,输入变量名:archetypeCatalog和变量值:internal,并点击ok和Finish。如图所示:在这里插入图片描述
5.导入相应的依赖的jar包的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.txw</groupId>
  <artifactId>day03_05jndi</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>day03_05jndi Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <!--导入mybatis的依赖jar包的坐标-->
  <dependencies>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
    <!--导入mysql的依赖jar包的坐标-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>
    <!--导入log4j的依赖jar包的坐标-->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>
    <!--导入junit的依赖jar包的坐标-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <!--导入lombok的依赖jar包的坐标-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
    </dependency>
    <!--导入servlet-api的依赖jar包的坐标-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <!--导入jsp-api的依赖jar包的坐标-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>day03_05jndi</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

6.编写实体类的代码如下:

package com.txw.domain;

import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
 * 用户的实体类
 * @author:Adair
 * @QQ:1578533828
 */
@Data // 自动生成set和get方法
@ToString  // 重写toString方法
@SuppressWarnings("all")      // 注解警告信息
public class User {
    private Integer userId;   // 用户的id
    private String userName;  // 用户的名称
    private String userAddress; // 用户的地址
    private String userSex;     // 用户的性别
    private Date userBirthday;  // 用户的地址
}

7.编写QueryVo类的代码如下:

package com.txw.domain;

import lombok.Data;
/**
 * QueryVo类
 * @author:Adair
 * @QQ:1578533828
 */
@Data // 自动生成set和get方法
@SuppressWarnings("all")      // 注解警告信息
public class QueryVo {
    // 声明User业务对象
    private User user;
}

8.编写用户实体类持久层接口的代码如下:

package com.txw.dao;

import com.txw.domain.QueryVo;
import com.txw.domain.User;
import java.util.List;
/**
 * 用户的持久层接口
 * @author:Adair
 * @QQ:1578533828
 */
@SuppressWarnings("all")      // 注解警告信息
public interface UserDao {
    /**
     * 查询所有用户
     * @return
     */
    List<User> findAll();
    /**
     * 保存用户
     * @param user
     */
    void saveUser(User user);
    /**
     * 更新用户
     * @param user
     */
    void updateUser(User user);
    /**
     * 根据Id删除用户
     * @param userId
     */
    void deleteUser(Integer userId);
    /**
     * 根据id查询用户信息
     * @param userId
     * @return
     */
    User findById(Integer userId);
    /**
     * 根据名称模糊查询用户信息
     * @param username
     * @return
     */
    List<User> findByName(String username);
    /**
     * 查询总用户数
     * @return
     */
    int findTotal();
    /**
     * 根据queryVo中的条件查询用户
     * @param vo
     * @return
     */
    List<User> findUserByVo(QueryVo vo);
}

9.在resources目录创建com.txw.dao.UserDao.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.txw.dao.UserDao">
    <!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
    <resultMap id="userMap" type="uSeR">
        <!-- 主键字段的对应 -->
        <id property="userId" column="id"></id>
        <!--非主键字段的对应-->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>
    <!-- 查询所有 -->
    <select id="findAll" resultMap="userMap">
        <!--select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;-->
        select * from user;
    </select>
    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="user">
        <!-- 配置插入操作后,获取插入数据的id -->
        <selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
    </insert>
    <!-- 更新用户 -->
    <update id="updateUser" parameterType="USER">
        update user set username=#{userName},address=#{userAddress},sex=#{userAex},birthday=#{userBirthday} where id=#{userId}
    </update>
    <!-- 删除用户-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id = #{uid}
    </delete>
      <!-- 根据id查询用户 -->
    <select id="findById" parameterType="INT" resultMap="userMap">
        select * from user where id = #{uid}
    </select>
    <!-- 根据名称模糊查询 -->
    <select id="findByName" parameterType="string" resultMap="userMap">
          select * from user where username like #{name}
        <!-- select * from user where username like '%${value}%'-->
   </select>
    <!-- 获取用户的总记录条数 -->
    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>
    <!-- 根据queryVo的条件查询用户 -->
    <select id="findUserByVo" parameterType="com.txw.domain.QueryVo" resultMap="userMap">
        select * from user where username like #{user.userName}
    </select>
</mapper>

10.在resources目录创建jdbcConfig.properties的代码如下:

dbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.59.130:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

11.在resources目录创建log4j.properties的代码如下:

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

12.编写测试的代码如下:

package com.txw.test;

import com.txw.dao.UserDao;
import com.txw.domain.QueryVo;
import com.txw.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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
 * 测试mybatis的crud操作
 * @author:Adair
 * @QQ:1578533828
 */
@SuppressWarnings("all")      // 注解警告信息
public class MybatisTest {
    private InputStream in;
    private SqlSession sqlSession;
    private UserDao userDao;
    @Before // 用于在测试方法执行之前执行
    public void init()throws Exception{
        // 1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 2.获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // 3.获取SqlSession对象
        sqlSession = factory.openSession(true);
        // 4.获取dao的代理对象
        userDao = sqlSession.getMapper(UserDao.class);
    }
    @After // 用于在测试方法执行之后执行
    public void destroy()throws Exception{
        // 提交事务
         //sqlSession.commit();
        // 6.释放资源
        sqlSession.close();
        in.close();
    }
    /**
     * 测试查询所有
     */
    @Test
    public void testFindAll(){
        // 5.执行查询所有方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }
    }
    /**
     * 测试保存操作
     */
    @Test
    public void testSave(){
        User user = new User();
        user.setUserName("autocommit");
        user.setUserAddress("贵州省六盘水市");
        user.setUserSex("男");
        user.setUserBirthday(new Date());
        System.out.println("保存操作之前:"+user);
        // 5.执行保存方法
        userDao.saveUser(user);
        System.out.println("保存操作之后:"+user);
    }
    /**
     * 测试更新操作
     */
    @Test
    public void testUpdate(){
        User user = new User();
        user.setUserId(50);
        user.setUserName("Adair");
        user.setUserAddress("贵州省六盘水市");
        user.setUserSex("男");
        user.setUserBirthday(new Date());
        // 5.执行保存方法
        userDao.updateUser(user);
    }
    /**
     * 测试删除操作
     */
    @Test
    public void testDelete(){
        //5.执行删除方法
        userDao.deleteUser(8);
    }
    /**
     * 测试删除操作
     */
    @Test
    public void testFindOne(){
        // 5.执行查询一个方法
        User  user = userDao.findById(50);
        System.out.println(user);
    }
    /**
     * 测试模糊查询操作
     */
    @Test
    public void testFindByName(){
        // 5.执行查询一个方法
        List<User> users = userDao.findByName("%王%");
//        List<User> users = userDao.findByName("王");
        for(User user : users){
            System.out.println(user);
        }
    }
    /**
     * 测试查询总记录条数
     */
    @Test
    public void testFindTotal(){
        // 5.执行查询一个方法
        int count = userDao.findTotal();
        System.out.println(count);
    }
    /**
     * 测试使用QueryVo作为查询条件
     */
    @Test
    public void testFindByVo(){
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUserName("%王%");
        vo.setUser(user);
        // 5.执行查询一个方法
        List<User> users = userDao.findUserByVo(vo);
        for(User u : users){
            System.out.println(u);
        }
    }
}

3 测试JNDI数据源的使用以及使用细节
1.在webapp目录创建META-INF目录,并创建context.xml的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- 
<Resource 
name="jdbc/mybatis"						数据源的名称
type="javax.sql.DataSource"						数据源类型
auth="Container"								数据源提供者
maxActive="20"									最大活动数
maxWait="10000"									最大等待时间
maxIdle="5"										最大空闲数
username="root"									用户名
password="123456"									密码
driverClassName="com.mysql.jdbc.Driver"			驱动类
url="jdbc:mysql://192.168.59.130:3306/mybatis?characterEncoding=utf-8"	连接url字符串
/>
 -->
<Resource 
name="jdbc/mybatis"
type="javax.sql.DataSource"
auth="Container"
maxActive="20"
maxWait="10000"
maxIdle="5"
username="root"
password="123456"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.59.130:3306/mybatis?characterEncoding=utf-8"
/>
</Context>

如图所示:目录结果。在这里插入图片描述
2.修改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>
    <typeAliases>
        <package name="com.txw.domain"></package>
    </typeAliases>
    <!-- 配置mybatis的环境 -->
    <environments default="mysql">
        <!-- 配置mysql的环境 -->
        <environment id="mysql">
            <!-- 配置事务控制的方式 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置连接数据库的必备信息  type属性表示是否使用数据源(连接池)-->
            <dataSource type="JNDI">
                <property name="data_source" value="java:comp/env/jdbc/mybatis"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 指定mapper配置文件的位置 -->
    <mappers>
        <mapper resource="com/txw/dao/UserDao.xml"/>
    </mappers>
</configuration>

3.部署tomcat服务器如图所示:在这里插入图片描述
在这里插入图片描述
4.使用tomcat运行,如图所示:在这里插入图片描述
通过浏览器访问http://localhost:8080/如图所示:在这里插入图片描述
5.运行测试查询所有方法代码的结果如下所示的错误!

D:\Java\java\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\java\ideaIU\IntelliJ IDEA 2020.1\lib\idea_rt.jar=52258:D:\java\ideaIU\IntelliJ IDEA 2020.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\java\ideaIU\IntelliJ IDEA 2020.1\lib\idea_rt.jar;D:\java\ideaIU\IntelliJ IDEA 2020.1\plugins\junit\lib\junit5-rt.jar;D:\java\ideaIU\IntelliJ IDEA 2020.1\plugins\junit\lib\junit-rt.jar;D:\java\java\jre\lib\charsets.jar;D:\java\java\jre\lib\deploy.jar;D:\java\java\jre\lib\ext\access-bridge-64.jar;D:\java\java\jre\lib\ext\cldrdata.jar;D:\java\java\jre\lib\ext\dnsns.jar;D:\java\java\jre\lib\ext\jaccess.jar;D:\java\java\jre\lib\ext\jfxrt.jar;D:\java\java\jre\lib\ext\localedata.jar;D:\java\java\jre\lib\ext\nashorn.jar;D:\java\java\jre\lib\ext\sunec.jar;D:\java\java\jre\lib\ext\sunjce_provider.jar;D:\java\java\jre\lib\ext\sunmscapi.jar;D:\java\java\jre\lib\ext\sunpkcs11.jar;D:\java\java\jre\lib\ext\zipfs.jar;D:\java\java\jre\lib\javaws.jar;D:\java\java\jre\lib\jce.jar;D:\java\java\jre\lib\jfr.jar;D:\java\java\jre\lib\jfxswt.jar;D:\java\java\jre\lib\jsse.jar;D:\java\java\jre\lib\management-agent.jar;D:\java\java\jre\lib\plugin.jar;D:\java\java\jre\lib\resources.jar;D:\java\java\jre\lib\rt.jar;F:\ideaworkbase\day03_05jndi\target\test-classes;F:\ideaworkbase\day03_05jndi\target\classes;E:\MavenRepository\org\mybatis\mybatis\3.4.5\mybatis-3.4.5.jar;E:\MavenRepository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;E:\MavenRepository\log4j\log4j\1.2.12\log4j-1.2.12.jar;E:\MavenRepository\junit\junit\4.12\junit-4.12.jar;E:\MavenRepository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\MavenRepository\org\projectlombok\lombok\1.18.12\lombok-1.18.12.jar;E:\MavenRepository\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar;E:\MavenRepository\javax\servlet\jsp\jsp-api\2.0\jsp-api-2.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.txw.test.MybatisTest,testFindAll
2020-08-08 23:43:00,300 1      [           main] DEBUG ache.ibatis.logging.LogFactory  - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
2020-08-08 23:43:00,532 233    [           main] DEBUG       org.apache.ibatis.io.VFS  - Class not found: org.jboss.vfs.VFS
2020-08-08 23:43:00,532 233    [           main] DEBUG org.apache.ibatis.io.JBoss6VFS  - JBoss 6 VFS API is not available in this environment.
2020-08-08 23:43:00,533 234    [           main] DEBUG       org.apache.ibatis.io.VFS  - Class not found: org.jboss.vfs.VirtualFile
2020-08-08 23:43:00,535 236    [           main] DEBUG       org.apache.ibatis.io.VFS  - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
2020-08-08 23:43:00,536 237    [           main] DEBUG       org.apache.ibatis.io.VFS  - Using VFS adapter org.apache.ibatis.io.DefaultVFS
2020-08-08 23:43:00,537 238    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Find JAR URL: file:/F:/ideaworkbase/day03_05jndi/target/classes/com/txw/domain
2020-08-08 23:43:00,537 238    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Not a JAR: file:/F:/ideaworkbase/day03_05jndi/target/classes/com/txw/domain
2020-08-08 23:43:00,606 307    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Reader entry: QueryVo.class
2020-08-08 23:43:00,607 308    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Reader entry: User.class
2020-08-08 23:43:00,607 308    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Listing file:/F:/ideaworkbase/day03_05jndi/target/classes/com/txw/domain
2020-08-08 23:43:00,610 311    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Find JAR URL: file:/F:/ideaworkbase/day03_05jndi/target/classes/com/txw/domain/QueryVo.class
2020-08-08 23:43:00,610 311    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Not a JAR: file:/F:/ideaworkbase/day03_05jndi/target/classes/com/txw/domain/QueryVo.class
2020-08-08 23:43:00,612 313    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Reader entry: ����   4 C
2020-08-08 23:43:00,614 315    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Find JAR URL: file:/F:/ideaworkbase/day03_05jndi/target/classes/com/txw/domain/User.class
2020-08-08 23:43:00,615 316    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Not a JAR: file:/F:/ideaworkbase/day03_05jndi/target/classes/com/txw/domain/User.class
2020-08-08 23:43:00,618 319    [           main] DEBUG rg.apache.ibatis.io.DefaultVFS  - Reader entry: ����   4 x
2020-08-08 23:43:00,619 320    [           main] DEBUG .apache.ibatis.io.ResolverUtil  - Checking to see if class com.txw.domain.QueryVo matches criteria [is assignable to Object]
2020-08-08 23:43:00,621 322    [           main] DEBUG .apache.ibatis.io.ResolverUtil  - Checking to see if class com.txw.domain.User matches criteria [is assignable to Object]

org.apache.ibatis.exceptions.PersistenceException: 
### Error building SqlSession.
### The error may exist in SQL Mapper Configuration
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: There was an error configuring JndiDataSourceTransactionPool. Cause: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
	at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)
	at com.txw.test.MybatisTest.init(MybatisTest.java:31)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: There was an error configuring JndiDataSourceTransactionPool. Cause: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:121)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:99)
	at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:78)
	... 25 more
Caused by: org.apache.ibatis.datasource.DataSourceException: There was an error configuring JndiDataSourceTransactionPool. Cause: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at org.apache.ibatis.datasource.jndi.JndiDataSourceFactory.setProperties(JndiDataSourceFactory.java:60)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.dataSourceElement(XMLConfigBuilder.java:326)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement(XMLConfigBuilder.java:280)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:116)
	... 27 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
	at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
	at javax.naming.InitialContext.lookup(InitialContext.java:417)
	at org.apache.ibatis.datasource.jndi.JndiDataSourceFactory.setProperties(JndiDataSourceFactory.java:56)
	... 30 more


java.lang.NullPointerException
	at com.txw.test.MybatisTest.destroy(MybatisTest.java:42)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

此时需要在index.xml修改为如下的代码即可:

<%@ page import="java.io.InputStream" %>
<%@ page import="org.apache.ibatis.io.Resources" %>
<%@ page import="org.apache.ibatis.session.SqlSessionFactoryBuilder" %>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory" %>
<%@ page import="org.apache.ibatis.session.SqlSession" %>
<%@ page import="com.txw.dao.UserDao" %>
<%@ page import="com.txw.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>
<%
    // 1.读取配置文件
    InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
    // 2.根据配置文件构建SqlSessionFactory
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(in);
    // 3.使用SqlSessionFactory创建SqlSession对象
    SqlSession sqlSession = factory.openSession();
    // 4.使用SqlSession构建Dao的代理对象
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    // 5.执行dao中的findAll方法
    List<User> users = userDao.findAll();
    for(User user : users){
        System.out.println(user);
    }
    // 6.释放资源
    sqlSession.close();
    in.close();
%>
</body>
</html>

因为test测试没有经过tomcat服务。所以报错!
重新使用tomcat运行结果如图所示:在这里插入图片描述
通过浏览器访问http://localhost:8080/如图所示:在这里插入图片描述
控制台打印结果如图所示,说明运行成功!在这里插入图片描述

当我们访问jsp的时候,它经过tomcat服务器。因为jsp在执行的时候,会先翻译成.Java,再编译成.class,再去运行,这些都是由tomcat服务器来做的!
当你经过tomcat服务器的时候,tomcat为你准备的数据源就可以使用。而你用单元测试,它根本就没有经过tomcat服务器,就是Java文件在运行,此时tomcat服务器为我们准备的数据源就不能使用!这就是JNDI数据源的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值