spring + mybatis 数据源改为jndi是项目启动报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring + mybatis 数据源改为jndi是项目启动报错相关的知识,希望对你有一定的参考价值。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in URL [file:/E:/Tomcat/apache-tomcat-6.0.37/webapps/web-prime/WEB-INF/classes/config/spring/applicationContext.xml]: Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name jndi is not bound in this Context

参考技术A 你的jndi数据源是如何配置的,比较常见的是配置在容器里面,现在报错就是找不到jndi数据源

spring-springmvc-mybatis整合

---恢复内容开始---

前言:

  整合这三个框架的目的:
    因为mybatis不支持事务处理,为了满足这一需求因此需要整合spring-mybatis。

  整合中的注意事项:

    mybatis框架默认是不可以调用spring框架的数据源的,因此我们必须配置数据源用于创建会话工厂

    mybatis是通过映射接口创建对象的,但是spring不支持接口创建对象,mybati-spring中提供了解决方案

    整合的目的就是为了支持事务代理,因此必须指定事务代理的数据源

配置流程:

  1、配置springmvc框架

  2、配置mybatis框架

  3、两个框架的整合

具体步骤

  配置springmvc:

  注意事项:springmvc是实现前端和后台代码分离的框架,构建的是一个web项目。因此配置流程应该从请求开始。为了能够实现一个请求对应一个方法,必须在web.xml中配置一个核心控制器,拦截所有请求。拦截请求后如何实现请求和方法一一对应?通过映射路径实现。

    配置流程:

      创建一个请求传到web项目入口web.xml。

      在web.xml中配置核心控制器拦截所有请求

      创建业务控制器(controller层)

      配置请求与方法的映射路径

      返回前端页面

    实现代码:

      请求创建:

<form action="${pageContext.request.contextPath }/add" method="get">
    姓名:<input type="text" name="name" placeholder="姓名"><br>
    学号:<input type="text" name="num" placeholder="学号"><br>
    <input type="submit" value="提交">
</form>

      配置核心控制器:

 <servlet>
      <servlet-name>dispatcherServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-*.xml</param-value>
      </init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>dispatcherServlet</servlet-name>
      <!-- 这样会拦截静态资源,到时要放开静态资源 -->
      <url-pattern>/</url-pattern>
  </servlet-mapping>

      编程业务控制器(表示层代码)以及设置映射路径和返回页面

@Controller
public class StudentController {
    @RequestMapping(value="/add")
    public String add(String name,String num,HttpServletRequest request) {
        System.out.println(name);
        request.setAttribute("name", name);
        return "/show.jsp";
    }
}

 

mybatis配置

  配置流程:

    创建配置总文件

    获得数据库操作对象

    创建映射接口

    在配置总文件中指定映射接口

  具体实现步骤

    创建总配置文件:

      声明:配置总文件是用于配置全局设置和参数的一个文件,需要读取配置总文件的参数来创建数据库操作对象,

         因此配置总文件必须包含连接数据库的一些必要属性。

      实现代码:

<!-- 配置连接信息 -->
    <environments default="sms">
        <environment id="sms">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="url" value="jdbc:mysql://localhost:3306/sms"/>
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

      获得数据库操作对象

        实现流程说明:

          1、使用Resources类以流的方式读取配置文件得到一个流对象

          2、创建会话工厂构建类对象

          3、使用会话工厂构建类对象创建会话工厂

          4、使用会话工厂获得操作对象

        实现代码:

public class Config {
    public SqlSession getsession() throws IOException {
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sessionFactory = builder.build(reader);
        SqlSession session = sessionFactory.openSession();
        return session;
    }
}

      创建映射接口:

public interface StudentMapper {
    @Select("select * from t_student where id = #{id}")
    public Student select(int id);
}

      在总配置文件中指定映射接口:

<!-- 指定映射接口 -->
    <mappers>
        <mapper class="my.mapper.StudentMapper"/>
    </mappers>

springmvc-mybatis整合

    注意事项:spring整合mybatis需要一个整合包(spring-mybatis),需要springJDBC、dbcp2、spring-tx四个包

         mybatis框架默认是不可以调用spring框架的数据源的,因此我们必须配置数据源用于创建会话工厂

         mybatis是通过映射接口创建对象的,但是spring不支持接口创建对象,mybati-spring中提供了解决方案

         整合的目的就是为了支持事务代理,因此必须指定事务代理的数据源

 

    配置流程:

        创建数据源(为了使数据源具有事务代理能力,需要重新指定数据源)

        创建支持spring数据源的会话工厂

        扫描映射接口的动态对象到spring容器中

        配置事务代理

    具体实现:

      说明:spring整合其他框架只需要在spring配置文件中增加<bean>即可,因此以上步骤均在在spring配置文件中配置

        创建数据源:

  <bean name="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="url" value="jdbc:mysql://localhost:3306/sms"></property>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="username" value="root"></property>
        <property name="password" value="1234"></property>
    </bean>

        创建支持spring数据源的会话工厂:

  <!-- 通过整合包的类,获得会话工厂 -->
    <bean name="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 指定使用的数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 相当于mybatis总配置文件中的settings 标签-->
        <property name="configuration">
            <bean  class="org.apache.ibatis.session.Configuration">
            <!-- 支持驼峰命名法 -->
                <property name="mapUnderscoreToCamelCase" value="true"></property>
            </bean>
        </property>
    </bean>

        扫描映射接口的动态对象到spring容器中:

    <!--获得映射接口的对象,将其注入到spring容器中
        注意:mybatis是通过接口创建对象的,但是spring不支持痛过接口创建对象,因此
                mybatis提供了一个解决方案  -->
    <bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定会话工厂,用于创建映射接口动态对象 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
        <!-- 指定映射接口包的位置 -->
        <property name="basePackage" value="my.mapper"></property>
        <!-- 指定使用指定注解才创建对象并注入到spring容器中 -->
        <property name="annotationClass" value="org.mybatis.spring.annotation.MapperScan"></property>
    </bean>

        配置事务代理:

<!-- 配置事务代理 -->
    <bean name="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 指定数据源 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <tx:annotation-driven transaction-manager="tx"/>

      最后删除mybatis总配置文件和获取操作对象的类即完成了ssm框架的配置。

          

      

---恢复内容结束---

以上是关于spring + mybatis 数据源改为jndi是项目启动报错的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot Mybatis双数据源的配置

mybatis如何由spring管理数据源(mybatis和spring的交互流程)

spring boot + mybatis批量插入大量数据(超过10000条)

Idea上搭建Springboot+mybatis+shiro

Mybatis与Spring整合

spring整合mybatis