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是项目启动报错的主要内容,如果未能解决你的问题,请参考以下文章
mybatis如何由spring管理数据源(mybatis和spring的交互流程)
spring boot + mybatis批量插入大量数据(超过10000条)