zoukankan      html  css  js  c++  java
  • springboot使用多数据源以及配置

    1. 首先在application中配置数据源地址

    my.datasource.koi.type=com.alibaba.druid.pool.DruidDataSource
    my.datasource.koi.url=jdbc:mysql://localhost:3306/?useUnicode=true&characterEncoding=utf-8&useSSL=true
    my.datasource.koi.username=root
    my.datasource.koi.password=123456
    my.datasource.koi.driverClassName=com.mysql.jdbc.Driver
    

      

    2. 在@Bean中 new DataSource的地址空间

    @Configuration
    public class KOIDataSourceConfig {
    
        @Resource
        private DataSourceFactory dataSourceFactory;
    
        @Bean(name = "koiDataSource")
        @ConfigurationProperties(prefix = "my.datasource.koi")
        public DruidDataSource createDataSource() {
            return dataSourceFactory.create();
        }
        // dataSourceFactory.create() : DruidDataSource dataSource = new DruidDataSource();
    
        @Bean(name = "jdbcTemplate")
        public JdbcTemplate createSqlSessionTemplate(@Qualifier("koiDataSource") DruidDataSource druidDataSource) {
            return new JdbcTemplate(druidDataSource);
        }
    }
    

      

    3.  在Service中直接使用即可

    @Service
    public class KOISchedulerImpl implements KOIScheduler{
    
        @Resource
        private JdbcTemplate jdbcTemplate;
    
        @Transactional
        @Override
        public void set_task_and_run(SQLPool pool, String config_path) {
    
            ExecuteSQL.prepare_and_execut_sql(pool, config_path);
    
        }
    
        @Transactional
        @Override
        public void startSchedulerTaskByDruid(String configPath) {
            jdbcTemplate.execute("INSERT INTO mydata.`test` (id) VALUE(1);");
        }
    }
    

      

    读取application中的配置信息:

    1.  在application中配置  spring.sql.path = E://z
    
    2.  定义一个Component类
    
    @Component
    public class QualityRecode {
    
        @Value("${spring.sql.path}")
        private String sqlPath;
    
        public QualityRecode() {}
    
        public String getSqlPath() {
            return sqlPath;
        }
    
        public void setSqlPath(String sqlPath) {
            this.sqlPath = sqlPath;
        }
    }
    
    
    3. 在Controller中实例化该类, 获取数据
    
    @Resource
    private QualityRecode recode;
    
    recode.getSqlPath()
    

      

    4.  使用Mapper读取 写入数据

    1.  先在application配置数据源信息
    
    2.  配置数据源config类
    
    @Configuration
    @MapperScan(basePackages = "com.nio.mapper.dcs", sqlSessionTemplateRef = "dcsSqlSessionTemplate")
    public class DcsDataSourceConfig {
    
        @Resource
        private DataSourceFactory dataSourceFactory;
    
        @Bean(name = "dcsDataSource")
        @ConfigurationProperties(prefix = "my.datasource.dcs")
        public DruidDataSource createDataSource() {
            return dataSourceFactory.create();
        }
    
        @Bean(name = "dcsSqlSessionFactory")
        public SqlSessionFactory createSqlSessionFactory(@Qualifier("dcsDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(
                    new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/dcs/*.xml"));
            return bean.getObject();
        }
    
    //    @Bean(name = "cmsTransactionManager")
    //    public DataSourceTransactionManager createTransactionManager(@Qualifier("cmsDataSource") DataSource dataSource) {
    //        return new DataSourceTransactionManager(dataSource);
    //    }
    
        @Bean(name = "dcsSqlSessionTemplate")
        public SqlSessionTemplate createSqlSessionTemplate(@Qualifier("dcsSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
    
    
    3.  创建实体类 接收表传来的数据
    
    4.  编辑Mapper类, 创建查询-插入方法
    
    public interface CmsMapper {
        List<PostEntity> getPostEntityList();
        List<PostEntity> getLatestPostEntityList(@Param("yesterdayTimeStamp") Long yesterdayTimeStamp,
                                                 @Param("currentTimeStamp") Long currentTimeStamp);
    
    void insertError(@Param("TaskLogRecordEntity") List<TaskLogRecord> taskLogRecords);
    }
    
    
    5.  实现Mapper类
    
    <select id="getPostEntityList" resultType="com.nio.entities.PostEntity">
            SELECT
                up.account_id AS accountId,
                up.create_time AS updateTime,
                up.content,
                up.like_count AS likeCount,
                up.comment_count AS commentCount,
                lu.`name` AS nickName
            FROM
                lifestyle_prod.user_post up
                    LEFT JOIN lifestyle_prod.livestream_user lu ON up.account_id = lu.user_id
            WHERE
                up.STATUS = 1
              AND up.resource_type = 'user_post'
              AND lu.supplier = 'rongyun'
              AND up.create_time >= #{yesterdayTimeStamp}
              AND up.create_time <![CDATA[<=]]> #{currentTimeStamp}
        </select>
    
    
        <insert id="insertError">
            insert into `task_log_record`
            (
            id,task_type,execute_time,error_info
            )
            values
            <foreach collection="TaskLogRecordEntity" item="error" separator=",">
                (
                #{error.id},
                #{error.task_type},
                #{error.execute_time},
                #{error.error_info}
                )
            </foreach>
        </insert>
    

      

    6.  需要注意的问题:

    1.  当查询一个原表中不存在,  但需要写在中间实体的,  指标查询表时:
    
    例如, MySQL   该表只有一个字段 id ,   在计算之后, 生成
    
    public class TestEntity {
    
        private long id2;
    
        private long id3;
    
    }
    
    
    Mapper应写成:  
    
        <select id="getTest" resultType="com.nio.entities.TestEntity">
    
        select t.id + 3 id2, t.id +1 id3 from
        (select 2 id from test) t
        </select>
    
    ## select 的值, 必须与实体类名一致, 而不是表中字段的名;
    

      

  • 相关阅读:
    面试官:讲讲redis的过期策略如何实现?
    Java并发-CopyOnWriteArrayList
    Java并发-CopyOnWriteArrayList
    idea万能快捷键,不可不知的17个实用技巧
    Java面试题必备知识之ThreadLocal
    Java面试题必备知识之ThreadLocal
    再谈源码阅读
    再谈源码阅读
    七月伊始 LeetCode算法总结
    ta和夏天一起来了
  • 原文地址:https://www.cnblogs.com/ruili07/p/10106750.html
Copyright © 2011-2022 走看看