Spring Boot 应用系列 3 -- Spring Boot 2 整合MyBatis和Druid,多数据源

本文演示多数据源(MySQL+SQL Server)的配置,并且我引入了分页插件pagehelper。

1. 项目结构

 

(1)db.properties存储数据源和连接池配置。

(2)两个数据源的mapper配置分别在src/main/resources下面的datasource1和datasource2里面。

2. pom.xml

需要在dependencies节点中添加:

<!-- MySQL -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.12</version>
</dependency>
<!-- MySQL end -->

<!-- SQL Server -->
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
</dependency>
<!-- SQL Server end -->

<!-- Connection Pool -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>
<!-- Connection Pool end -->

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<!-- MyBatis end -->

<!-- Page Helper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.5</version>
</dependency>
<!-- Page Helper end -->

3. properties配置文件

我们把主程序配置文件application.properties和数据库配置文件分开,这样可使application.properties不至于臃肿。

(1) application.properties

server.port=9008
spring.application.name=devutility-test-database-mybatis-springboot

#Configuration for druid
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

Druid ui的配置也放在里面,可通过http://localhost:9008/druid来访问。

(2) db.properties

 1 #Data source 1
 2 db1.sqlserver.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
 3 db1.sqlserver.url=${DB1_URL:jdbc:sqlserver://127.0.0.1:1433;DatabaseName=MyTestDb1}
 4 db1.sqlserver.username=${DB1_UID:tester}
 5 db1.sqlserver.password=${DB1_PWD:tester}
 6 db1.sqlserver.initial-size=1
 7 db1.sqlserver.min-idle=1
 8 db1.sqlserver.max-active=20
 9 db1.sqlserver.max-wait=60000
10 db1.sqlserver.time-between-eviction-runs-millis=60000
11 db1.sqlserver.min-evictable-idle-time-millis=300000
12 db1.sqlserver.validation-query=select 1
13 db1.sqlserver.test-on-borrow=true
14 db1.sqlserver.test-While-Idle=true
15 db1.sqlserver.test-on-return=false
16 db1.sqlserver.pool-prepared-statements=false
17 db1.sqlserver.max-pool-prepared-statement-per-connection-size=20
18 
19 db1.sqlserver.mybatis.config-location=classpath:datasource1/mybatis-config.xml
20 
21 db1.sqlserver.filter.stat.enabled=true
22 db1.sqlserver.filter.stat.db-type=mssql
23 db1.sqlserver.filter.stat.log-slow-sql=true
24 db1.sqlserver.filter.stat.slow-sql-millis=200
25 
26 #Data source 2
27 db2.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
28 db2.mysql.url=${DB2_URL:jdbc:mysql://127.0.0.1:3306/Test}?useUnicode=true&useSSL=false
29 db2.mysql.username=${DB2_UID:tester}
30 db2.mysql.password=${DB2_PWD:tester}
31 db2.mysql.initial-size=1
32 db2.mysql.min-idle=1
33 db2.mysql.max-active=20
34 db2.mysql.max-wait=60000
35 db2.mysql.time-between-eviction-runs-millis=60000
36 db2.mysql.min-evictable-idle-time-millis=300000
37 db2.mysql.validation-query=select 1
38 db2.mysql.test-on-borrow=true
39 db2.mysql.test-While-Idle=true
40 db2.mysql.test-on-return=false
41 db2.mysql.pool-prepared-statements=false
42 db2.mysql.max-pool-prepared-statement-per-connection-size=20
43 
44 db2.mysql.mybatis.config-location=classpath:datasource2/mybatis-config.xml
45 
46 db2.mysql.filter.stat.enabled=true
47 db2.mysql.filter.stat.db-type=mysql
48 db2.mysql.filter.stat.log-slow-sql=true
49 db2.mysql.filter.stat.slow-sql-millis=1000

注意19和44行,我们为两个数据源分别使用mybatis-config.xml来管理它们所属的mapper xml和其他一些配置。

4. JavaConfig

(1) DataSource1

package devutility.test.database.mybatis.springboot.multi.source.config;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.github.pagehelper.PageInterceptor;

@Configuration
@PropertySource("classpath:db.properties")
@MapperScan(basePackages = { "devutility.test.database.mybatis.springboot.multi.source.ds1" }, sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sqlSessionTemplate1")
public class DataSource1Configuration {
    @Bean
    @ConfigurationProperties("db1.sqlserver")
    public DataSource dataSource1() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("db1.sqlserver")
    public Properties ormProperties1() {
        return new Properties();
    }

    @Bean
    public Interceptor pageHelperInterceptor1() {
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "sqlserver2012");

        Interceptor interceptor = new PageInterceptor();
        interceptor.setProperties(properties);
        return interceptor;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory1(DataSource dataSource1, Properties ormProperties1) throws Exception {
        String configLocation = ormProperties1.getProperty("mybatis.config-location");
        Resource[] resources = new PathMatchingResourcePatternResolver().getResources(configLocation);

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource1);
        sqlSessionFactoryBean.setConfigLocation(resources[0]);
        sqlSessionFactoryBean.setPlugins(new Interceptor[] { pageHelperInterceptor1() });
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate1(SqlSessionFactory sqlSessionFactory1) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory1);
    }

    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager1(DataSource dataSource1) {
        return new DataSourceTransactionManager(dataSource1);
    }
}

(2) DataSource2

package devutility.test.database.mybatis.springboot.multi.source.config;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.github.pagehelper.PageInterceptor;

@Configuration
@PropertySource("classpath:db.properties")
@MapperScan(basePackages = { "devutility.test.database.mybatis.springboot.multi.source.ds2" }, sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class DataSource2Configuration {
    @Bean
    @ConfigurationProperties("db2.mysql")
    public DataSource dataSource2() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("db2.mysql")
    public Properties ormProperties2() {
        return new Properties();
    }

    @Bean
    public Interceptor pageHelperInterceptor2() {
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "mysql");

        Interceptor interceptor = new PageInterceptor();
        interceptor.setProperties(properties);
        return interceptor;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory2(DataSource dataSource2, Properties ormProperties2) throws Exception {
        String configLocation = ormProperties2.getProperty("mybatis.config-location");
        Resource[] resources = new PathMatchingResourcePatternResolver().getResources(configLocation);

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource2);
        sqlSessionFactoryBean.setConfigLocation(resources[0]);
        sqlSessionFactoryBean.setPlugins(new Interceptor[] { pageHelperInterceptor2() });
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate2(SqlSessionFactory sqlSessionFactory2) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory2);
    }

    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager2(DataSource dataSource2) {
        return new DataSourceTransactionManager(dataSource2);
    }
}

注意,两个配置文件均有一个Properties类型的bean,该bean存储着db.properties中的所有配置,但是真正用到的配置只有一个"mybatis.config-location",它的值就是mybatis-config.xml的存储地址。当然,你也可以删掉ormProperties 这个bean,删掉db.properties的"mybatis.config-location"属性,然后以hardcode的方式在Configuration中配ConfigLocation.

5. MyBatis相关配置

MyBatis的配置主要包括mybatis-config.xml,mapper的xml文件,mapper的接口文件,和实体类,比单数据源多了一个mybatis-config.xml文件的配置。

(1) mybatis-config.xml

在本文中,该文件用来配置数据源相关的xml映射文件和实体类的包,其他配置项可参考MyBatis官网

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    <typeAliases>
        <package name="devutility.test.database.mybatis.springboot.multi.source.ds2.entities" />
    </typeAliases>
    <mappers>
        <mapper resource="datasource2/mappers/CustomerMapper.xml" />
    </mappers>
</configuration>

datasource1的配置类似,不再赘述。

(2) mapper的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="devutility.test.database.mybatis.springboot.multi.source.ds2.mappers.CustomerMapper">
    <resultMap id="CustomerMapping" type="Customer">
        <id column="Name1" property="name" />
        <id column="Address1" property="address" />
    </resultMap>
    <select id="get" resultMap="CustomerMapping">
        select * from Customer where id = #{id};
    </select>
    <select id="list" resultMap="CustomerMapping">
        select * from Customer where Name1 is not null order by Created desc
    </select>
</mapper>

(3) mapper的接口文件

package devutility.test.database.mybatis.springboot.multi.source.ds2.mappers;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import devutility.test.database.mybatis.springboot.multi.source.ds2.entities.Customer;

@Mapper
public interface CustomerMapper {
    Customer get(long id);

    List<Customer> list();
}

(4) 实体类

package devutility.test.database.mybatis.springboot.multi.source.ds2.entities;

public class Customer extends BaseEntity {
    private long id;
    private String name;
    private String address;
    private String city;
    private String state;
    private int zip;
    private String phone;
    private String email;

6. 应用

package devutility.test.database.mybatis.springboot.multi.source.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.github.pagehelper.PageHelper;

import devutility.test.database.mybatis.springboot.multi.source.ds2.entities.Customer;
import devutility.test.database.mybatis.springboot.multi.source.ds2.mappers.CustomerMapper;

@RestController
@RequestMapping("/ds2")
public class Ds2Controller {
    @Autowired
    private CustomerMapper customerMapper;

    @RequestMapping("/customer")
    public Customer customer(long id) {
        return customerMapper.get(id);
    }

    @RequestMapping("customers-page")
    public List<Customer> customersPage(int page) {
        return PageHelper.startPage(page, 10).doSelectPage(() -> customerMapper.list());
    }
}

Demo代码

转载于:https://www.cnblogs.com/eagle6688/p/9634521.html

智慧旅游解决方案利用云计算、物联网和移动互联网技术,通过便携终端设备,实现对旅游资源、经济、活动和旅游者信息的智能感知和发布。这种技术的应用旨在提升游客在旅游各个环节的体验,使他们能够轻松获取信息、规划行程、预订票务和安排食宿。智慧旅游平台为旅游管理部门、企业和游客提供服务,包括政策发布、行政管理、景区安全、游客流量统计分析、投诉反馈等。此外,平台还提供广告促销、库存信息、景点介绍、电子门票、社交互动等功能。 智慧旅游的建设规划得到了国家政策的支持,如《国家中长期科技发展规划纲要》和国务院的《关于加快发展旅游业的意见》,这些政策强调了旅游信息服务平台的建设和信息化服务的重要性。随着技术的成熟和政策环境的优化,智慧旅游的时机已经到来。 智慧旅游平台采用SaaS、PaaS和IaaS等云服务模式,提供简化的软件开发、测试和部署环境,实现资源的按需配置和快速部署。这些服务模式支持旅游企业、消费者和管理部门开发高性能、高可扩展的应用服务。平台还整合了旅游信息资源,提供了丰富的旅游产品创意平台和统一的旅游综合信息库。 智慧旅游融合应用面向游客和景区景点主管机构,提供无线城市门户、智能导游、智能门票及优惠券、景区综合安防、车辆及停车场管理等服务。这些应用通过物联网和云计算技术,实现了旅游服务的智能化、个性化和协同化,提高了旅游服务的自由度和信息共享的动态性。 智慧旅游的发展标志着旅游信息化建设的智能化和应用多样化趋势,多种技术和应用交叉渗透至旅游行业的各个方面,预示着全面的智慧旅游时代已经到来。智慧旅游不仅提升了游客的旅游体验,也为旅游管理和服务提供了高效的技术支持。
智慧旅游解决方案利用云计算、物联网和移动互联网技术,通过便携终端设备,实现对旅游资源、经济、活动和旅游者信息的智能感知和发布。这种技术的应用旨在提升游客在旅游各个环节的体验,使他们能够轻松获取信息、规划行程、预订票务和安排食宿。智慧旅游平台为旅游管理部门、企业和游客提供服务,包括政策发布、行政管理、景区安全、游客流量统计分析、投诉反馈等。此外,平台还提供广告促销、库存信息、景点介绍、电子门票、社交互动等功能。 智慧旅游的建设规划得到了国家政策的支持,如《国家中长期科技发展规划纲要》和国务院的《关于加快发展旅游业的意见》,这些政策强调了旅游信息服务平台的建设和信息化服务的重要性。随着技术的成熟和政策环境的优化,智慧旅游的时机已经到来。 智慧旅游平台采用SaaS、PaaS和IaaS等云服务模式,提供简化的软件开发、测试和部署环境,实现资源的按需配置和快速部署。这些服务模式支持旅游企业、消费者和管理部门开发高性能、高可扩展的应用服务。平台还整合了旅游信息资源,提供了丰富的旅游产品创意平台和统一的旅游综合信息库。 智慧旅游融合应用面向游客和景区景点主管机构,提供无线城市门户、智能导游、智能门票及优惠券、景区综合安防、车辆及停车场管理等服务。这些应用通过物联网和云计算技术,实现了旅游服务的智能化、个性化和协同化,提高了旅游服务的自由度和信息共享的动态性。 智慧旅游的发展标志着旅游信息化建设的智能化和应用多样化趋势,多种技术和应用交叉渗透至旅游行业的各个方面,预示着全面的智慧旅游时代已经到来。智慧旅游不仅提升了游客的旅游体验,也为旅游管理和服务提供了高效的技术支持。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值