今天遇到一個任務,需要把oracle上的數據遷移到mysql中,表的字段及結構並不完全相同,還需要寫一些代碼去對應。
這種小工程適合用springboot快速搭建,用mybatis+spring去實現。
但是我沒怎么用過springboot,只能去網上找現成的代碼,再根據具體的業務改一改:
SpringBoot2.0之八 多數據源配置
如果只會復制粘貼,那我永遠都只能是一個麻瓜,所以必須要把這一段代碼全部學會。
1 @Configuration 2 @MapperScan(basePackages = "com.somta.springboot.dao.master", sqlSessionTemplateRef = "masterSqlSessionTemplate") 3 public class MasterDataSourceConfiguration { 4 5 @Value("${spring.datasource.master.driver-class-name}") 6 private String driverClassName; 7 8 @Value("${spring.datasource.master.url}") 9 private String url; 10 11 @Value("${spring.datasource.master.username}") 12 private String username; 13 14 @Value("${spring.datasource.master.password}") 15 private String password; 16 17 @Bean(name = "masterDataSource") 18 @Primary 19 public DataSource dataSource() { 20 DruidDataSource dataSource = new DruidDataSource(); 21 dataSource.setDriverClassName(this.driverClassName); 22 dataSource.setUrl(this.url); 23 dataSource.setUsername(this.username); 24 dataSource.setPassword(this.password); 25 return dataSource; 26 } 27 28 @Bean(name = "masterSqlSessionFactory") 29 @Primary 30 public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { 31 SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); 32 bean.setDataSource(dataSource); 33 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/master/**/Mysql_*Mapper.xml")); 34 return bean.getObject(); 35 } 36 37 @Bean(name = "masterTransactionManager") 38 @Primary 39 public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) { 40 return new DataSourceTransactionManager(dataSource); 41 } 42 43 @Bean(name = "masterSqlSessionTemplate") 44 @Primary 45 public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { 46 return new SqlSessionTemplate(sqlSessionFactory); 47 } 48 49 }
這是整個配置中的核心就是這一段代碼了,我們來仔細研究一下:
@Configuration注解
自spring3.0以后,用於定義配置類,可以替代xml文件。被注解的類中包含一個或多個@bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,並用於構建bean定義,初始化Spring容器。
簡單地說,就是把spring中的配置文件
<beans> <bean> </bean> .... </beans>
這種配置用注解的形式替換掉
那么依次看代碼中被@bean注解的方法:
1 @Bean(name = "masterDataSource") 2 @Primary 3 public DataSource dataSource() { 4 DruidDataSource dataSource = new DruidDataSource(); 5 dataSource.setDriverClassName(this.driverClassName); 6 dataSource.setUrl(this.url); 7 dataSource.setUsername(this.username); 8 dataSource.setPassword(this.password); 9 return dataSource; 10 }
這就相當於向spring容器中注冊了一個id為"masterDataSource"的bean,同時在代碼中設定好參數,就配置好數據源。
1 @Bean(name = "masterSqlSessionFactory") 2 @Primary 3 public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { 4 SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); 5 bean.setDataSource(dataSource); 6 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/master/**/Mysql_*Mapper.xml")); 7 return bean.getObject(); 8 }
向ico容器注冊一個id為"masterDataSource"的bean,SqlSessionFactory是myBatis的核心類,用於生成sqlSession
MyBatis常用對象SqlSessionFactory和SqlSession介紹和運用
1 @Bean(name = "masterTransactionManager") 2 @Primary 3 public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) { 4 return new DataSourceTransactionManager(dataSource); 5 }
注冊一個id為"masterTranscationManager"的bean,DataSourceTransactionManager是spring事務管理的核心類
Spring3.1.0實現原理分析(二十二).Dao事務分析之事務管理器DataSourceTransactionManager
1 @Bean(name = "masterSqlSessionTemplate") 2 @Primary 3 public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { 4 return new SqlSessionTemplate(sqlSessionFactory); 5 }
注冊一個id為"masterSqlSessionTemplate"的bean,SqlSessionTemplate是spring事務管理的核心類
https://www.cnblogs.com/daxin/p/3544188.html
還有個需要注意的地方時,以上bean在引入其他依賴bean時,使用的時注解@Qualifier("beanName")。這樣做是因為要配置兩個數據源,DataSource、SqlSessionFaction、DataSourceTransactionManager、SqlSessionTemplate還會在另一個數據源中配置,需要通過名稱來區分。
上述代碼加注解的作用相當於以下xml配置文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 4 xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 7 http://www.springframework.org/schema/aop 8 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context-3.0.xsd 11 http://www.springframework.org/schema/tx 12 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 13 "> 14 15 <bean id="dataSource" 16 class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 17 <property name="driverClassName"> 18 <value>org.gjt.mm.mysql.Driver</value> 19 </property> 20 <property name="url"> 21 <value>jdbc:mysql://localhost:3306/zdy?useUnicode=true&characterEncoding=UTF-8 22 </value> 23 </property> 24 <property name="username"> 25 <value>root</value> 26 </property> 27 <property name="password"> 28 <value>1111</value> 29 </property> 30 </bean> 31 32 <!-- 獲取會話工廠,並注入Mybatis,和dateSource數據庫鏈接 --> 33 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 34 <property name="dataSource" ref="dataSource"></property> 35 <property name="configLocation" value="bs/Mybatis.xml"></property> 36 </bean> 37 38 <!-- 在會話工廠中取出SqlSessionTemplate這個對象 --> 39 <bean id="sqlsessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> 40 <constructor-arg index="0" ref="sqlSessionFactory" /> 41 </bean> 42 43 <!-- 把sqlsessionTemplate注入到UserMapper中去。UserMapper才能對數據進行操作 --> 44 <bean id="user" class="bs.UserImpl"> 45 <property name="sqlsession" ref="sqlsessionTemplate"> 46 </property> 47 </bean>
還有一個注解@MapperScan,用於注解掃描到的對應的mapper,然后在使用mapper下的bean的數據庫操作就會使用上述配置的數據源及相關bena。
沒怎么用過springboot,不太熟悉springboot的文件結構,這個mapper好像類似傳統ssm框架下的dao層文件,等我再學習學習。
寫了半天才發現這個玩意這些注解配置和之前的ssm框架原理是一樣的,只是通過注解簡化了大量操作,而且搭建起來也更加便捷。
