dao的迁移的数据源问题

dao的迁移的数据源问题

老师,本章讲述将SSM项目换成SpringBoot框架,在dao层迁移的过程,视频演示的是将原本的spring-dao.xml的配置文件分解成两个@Configuration注解的类,如下:

原本的spring-dao.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
   <!-- 配置整合mybatis过程 -->
   <!-- 1.配置数据库相关参数properties的属性:${url} -->
   <context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/>
   <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>
<!--   <bean class="com.imooc.o2o.util.EncryptPropertyPlaceholderConfigurer">-->
<!--      <property name="locations">-->
<!--         <list>-->
<!--            <value>classpath:jdbc.properties</value>-->
<!--            <value>classpath:redis.properties</value>-->
<!--         </list>-->
<!--      </property>-->
<!--      <property name="fileEncoding" value="UTF-8" />-->
<!--   </bean>-->
   <!-- 2.数据库连接池 -->
   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <!--配置连接池属性-->
      <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

      <!-- c3p0连接池的私有属性 -->
      <property name="maxPoolSize" value="40" />
      <property name="minPoolSize" value="10" />
      <!-- 关闭连接后不自动commit -->
      <property name="autoCommitOnClose" value="false" />
      <!-- 获取连接超时时间 -->
      <property name="checkoutTimeout" value="10000" />
      <!-- 当获取连接失败重试次数 -->
      <property name="acquireRetryAttempts" value="2" />
   </bean>

   <!-- 3.配置SqlSessionFactory对象 -->
   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <!-- 注入数据库连接池 -->
      <property name="dataSource" ref="dataSource" />
      <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
      <property name="configLocation" value="classpath:mybatis-config.xml" />
      <!-- 扫描entity包 使用别名 -->
      <property name="typeAliasesPackage" value="com.imooc.o2o.entity" />
      <!-- 扫描sql配置文件:mapper需要的xml文件 -->
      <property name="mapperLocations" value="classpath:mapper/*.xml" />
   </bean>

   <!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
   <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <!-- 注入sqlSessionFactory -->
      <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
      <!-- 给出需要扫描Dao接口包 -->
      <property name="basePackage" value="com.imooc.o2o.dao" />
   </bean>
</beans>

DataSourceConfiguration.java:

package com.imooc.o2o.config.dao;

import java.beans.PropertyVetoException;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.imooc.o2o.util.DESUtil;
import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 配置datasource到ioc容器里面
 * 
 * @author xiangze
 *
 */
@Configuration
// 配置mybatis mapper的扫描路径
@MapperScan("com.imooc.o2o.dao")
public class DataSourceConfiguration {
	@Value("${jdbc.driver}")
	private String jdbcDriver;
	@Value("${jdbc.url}")
	private String jdbcUrl;
	@Value("${jdbc.username}")
	private String jdbcUsername;
	@Value("${jdbc.password}")
	private String jdbcPassword;

	/**
	 * 生成与spring-dao.xml对应的bean dataSource
	 * 
	 * @return
	 * @throws PropertyVetoException
	 */
	@Bean(name = "dataSource")
	public ComboPooledDataSource createDataSource() throws PropertyVetoException {
		// 生成datasource实例
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		// 跟配置文件一样设置以下信息
		// 驱动
		dataSource.setDriverClass(jdbcDriver);
		// 数据库连接URL
		dataSource.setJdbcUrl(jdbcUrl);
		// 设置用户名
		dataSource.setUser(DESUtil.getDecryptString(jdbcUsername));
		// 设置用户密码
		dataSource.setPassword(DESUtil.getDecryptString(jdbcPassword));
		// 配置c3p0连接池的私有属性
		// 连接池最大线程数
		dataSource.setMaxPoolSize(30);
		// 连接池最小线程数
		dataSource.setMinPoolSize(10);
		// 关闭连接后不自动commit
		dataSource.setAutoCommitOnClose(false);
		// 连接超时时间
		dataSource.setCheckoutTimeout(10000);
		// 连接失败重试次数
		dataSource.setAcquireRetryAttempts(2);
		return dataSource;
	}

}

SessionFactoryConfiguration.java:

package com.imooc.o2o.config.dao;

import java.io.IOException;

import javax.sql.DataSource;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

@Configuration
public class SessionFactoryConfiguration {
	// mybatis-config.xml配置文件的路径
	private static String mybatisConfigFile;

	@Value("${mybatis_config_file}")
	public void setMybatisConfigFile(String mybatisConfigFile) {
		SessionFactoryConfiguration.mybatisConfigFile = mybatisConfigFile;
	}

	// mybatis mapper文件所在路径
	private static String mapperPath;

	@Value("${mapper_path}")
	public void setMapperPath(String mapperPath) {
		SessionFactoryConfiguration.mapperPath = mapperPath;
	}

	// 实体类所在的package
	@Value("${type_alias_package}")
	private String typeAliasPackage;

	@Autowired
	private DataSource dataSource;

	/**
	 * 创建sqlSessionFactoryBean 实例 并且设置configtion 设置mapper 映射路径 设置datasource数据源
	 * 
	 * @return
	 * @throws IOException
	 */
	@Bean(name = "sqlSessionFactory")
	public SqlSessionFactoryBean createSqlSessionFactoryBean() throws IOException {
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		// 设置mybatis configuration 扫描路径
		sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(mybatisConfigFile));
		// 添加mapper 扫描路径
		PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
		String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + mapperPath;
		sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath));
		// 设置dataSource
		sqlSessionFactoryBean.setDataSource(dataSource);
		// 设置typeAlias 包扫描路径
		sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasPackage);
		return sqlSessionFactoryBean;
	}

}

对此,我有点不解

  1. 这两个@Configuration注解的类是怎么关联起来的啊?它们是从一个xml文件迁移出来的,按理说它们应该有关联才对不是么?

  2. 从spring-dao.xml文件可以看出SqlSessionFactoryBean的注入数据源的是注入上面定义好的C3P0数据源,可是迁移出来的两个@Configuration注解类,DataSourceConfiguration引入的数据源是import com.mchange.v2.c3p0.ComboPooledDataSource,即C3P0的数据源,但是SessionFactoryConfiguration引入的数据源是import javax.sql.DataSource,是另一个数据源。但是在原本的spring-dao.xml中,SqlSessionFactoryBean注入的数据源就是在上面自定义好的C3P0数据源,这是怎么回事?

  3. 再有就是,在原本SSM框架中,是在项目的web.xml里设置DispatcherServlet的初始化参数contextConfigLocation为classpath:spring/spring-*.xml,这样读取了三个配置文件的信息,应用于程序中,可是切换后的SpringBoot并没有读取的操作呀,怎么就能应用上这些配置了呢?难道是因为@Configuration这个注解已经告诉了SpringBoot这是个配置类,里面是一些配置信息,程序运行之前要加载这些信息,是这个意思么?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,javax.sql.DataSource;的DataSource是一个接口,ComboPooledDataSource的DataSource经过多重继承,继承自javax.sql.DataSource,所以可以转换,例如:

http://img1.sycdn.imooc.com//climg/5d43b56c0001862b06460058.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

好帮手慕阿满 2019-08-01 20:02:41

同学你好,关于同学的问题,有如下回答:

1、这两个文件是有关联的。

2、在DataSourceConfiguration类中,加了@Bean(name = "dataSource"),在SessionFactoryConfiguration类中,使用@Autowired自动注入的dataSource就是DataSourceConfiguration的中dataSource,如:

http://img1.sycdn.imooc.com//climg/5d42d2ec0001352503270083.jpg

http://img1.sycdn.imooc.com//climg/5d42d2aa0001494d03710078.jpg

3、@Configuration注解用java代码的形式实现spring中xml配置文件配置的效果。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 哆丶哆 #1
    老师,关于第2点的“使用@Autowired自动注入的dataSource就是DataSourceConfiguration的中dataSource”,它们两个的dataSource不是不同类型么?难道是父子类关系自动转换?
    2019-08-01 21:49:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师