赞
踩
springboot + 多数据源mysql、oracle + pagehelper 分页
项目使用maven依赖
<!--mysql连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--oracle连接 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> </dependency> <!--pagehelper插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${pagehelper.version}</version> </dependency>
spring: datasource-sysadm: driverClassName: oracle.jdbc.driver.OracleDriver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:oracle:thin:@ip:prot:服务名或sid username: 用户名 password: 密码 # 查询时进行校验 validationQuery: select 1 from dual datasource: driverClassName : com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://ip:port/数据库名称?useUnicode=true&useSSL=false&characterEncoding=utf8&characterSetResults=utf8 username: 用户名 password :密码 # 下面为连接池的补充设置,应用到上面所有数据源中 # 初始化大小,最小,最大 initialSize: 10 minIdle: 30 maxActive: 100 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false exceptionSorter: true testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20
package com.XXX.bpaas.idm.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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import com.alibaba.druid.pool.DruidDataSource; import com.github.pagehelper.PageInterceptor; @Configuration @MapperScan(basePackages="com.XXX.bpaas.idm.mapper.dao", sqlSessionTemplateRef = "idmSqlSessionTemplate") //扫描到具体的包 public class IdmDataSourceConfig { //日志 private Logger log = LoggerFactory.getLogger(IdmDataSourceConfig.class); //精确到 具体 目录,以便跟其他数据源隔离 private static final String MAPPER_LOCATION = "classpath:mybatis/mapper/*.xml"; @Value("${spring.datasource.url}") private String dbUrl; @Value("${spring.datasource.type}") private String dbtype; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driverClassName}") private String driverClassName; @Value("${spring.datasource.validationQuery}") private String validationQuery; //以下的配置从配置文件中读取 @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.poolPreparedStatements}") private boolean poolPreparedStatements; @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") private int maxPoolPreparedStatementPerConnectionSize; /** * 设置主数据源的参数 */ @Bean @Primary public DruidDataSource dataSource() { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(this.dbUrl); datasource.setDbType(dbtype); datasource.setUsername(this.username); datasource.setPassword(this.password); datasource.setDriverClassName(this.driverClassName); datasource.setInitialSize(this.initialSize); datasource.setMinIdle(this.minIdle); datasource.setMaxActive(this.maxActive); datasource.setMaxWait((long) this.maxWait); datasource.setTimeBetweenEvictionRunsMillis((long) this.timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis((long) this.minEvictableIdleTimeMillis); datasource.setValidationQuery(this.validationQuery); datasource.setTestWhileIdle(this.testWhileIdle); datasource.setTestOnBorrow(this.testOnBorrow); datasource.setTestOnReturn(this.testOnReturn); datasource.setPoolPreparedStatements(this.poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(this.maxPoolPreparedStatementPerConnectionSize); return datasource; } /** * 设置数据源的事务 */ @Bean(name = "idmTransactionManager") @Primary public DataSourceTransactionManager idmTransactionManager() { log.info("---------idmTransactionManager-------" + "加载完成"); return new DataSourceTransactionManager(dataSource()); } /** * 连接池管道 */ @Bean(name = "idmSqlSessionFactory") @Primary public SqlSessionFactory idmSqlSessionFactory(@Qualifier("dataSource") DataSource idmDataSource) throws Exception { log.info("--------clusterSqlSessionFactory-------" + "加载完成"); SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(idmDataSource); sessionFactory.setMapperLocations( new PathMatchingResourcePatternResolver().getResources(IdmDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } /** * 数据sql模板 */ @Bean(name = "idmSqlSessionTemplate") @Primary public SqlSessionTemplate kdysSqlSessionTemplate( @Qualifier("idmSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
package com.XXX.bpaas.idm.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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import com.alibaba.druid.pool.DruidDataSource; import com.github.pagehelper.PageInterceptor; @Configuration @MapperScan(basePackages="com.XXX.bpaas.sysadm.mapper.dao", sqlSessionTemplateRef = "sysadmSqlSessionTemplate") //扫描到具体的包 public class SysadmDataSourceConfig { //日志 private Logger log = LoggerFactory.getLogger(SysadmDataSourceConfig.class); //精确到 具体 目录,以便跟其他数据源隔离 private static final String MAPPER_LOCATION = "classpath:mybatis/mapper-sysadm/*.xml"; @Value("${spring.datasource-sysadm.url}") private String dbUrl; @Value("${spring.datasource-sysadm.type}") private String dbtype; @Value("${spring.datasource-sysadm.username}") private String username; @Value("${spring.datasource-sysadm.password}") private String password; @Value("${spring.datasource-sysadm.driverClassName}") private String driverClassName; @Value("${spring.datasource-sysadm.validationQuery}") private String validationQuery; //以下的配置从配置文件中读取 @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.poolPreparedStatements}") private boolean poolPreparedStatements; @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") private int maxPoolPreparedStatementPerConnectionSize; /** * 设置主数据源的参数 */ @Bean(name="sysadmDataSource") public DruidDataSource dataSource() { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(this.dbUrl); datasource.setDbType(this.dbtype); datasource.setUsername(this.username); datasource.setPassword(this.password); datasource.setDriverClassName(this.driverClassName); datasource.setInitialSize(this.initialSize); datasource.setMinIdle(this.minIdle); datasource.setMaxActive(this.maxActive); datasource.setMaxWait((long) this.maxWait); datasource.setTimeBetweenEvictionRunsMillis((long) this.timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis((long) this.minEvictableIdleTimeMillis); datasource.setValidationQuery(this.validationQuery); datasource.setTestWhileIdle(this.testWhileIdle); datasource.setTestOnBorrow(this.testOnBorrow); datasource.setTestOnReturn(this.testOnReturn); datasource.setPoolPreparedStatements(this.poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(this.maxPoolPreparedStatementPerConnectionSize); return datasource; } /** * 设置数据源的事务 */ @Bean(name = "sysadmTransactionManager") public DataSourceTransactionManager idmTransactionManager() { log.info("---------sysadmTransactionManager-------" + "加载完成"); return new DataSourceTransactionManager(dataSource()); } /** * 连接池管道 */ @Bean(name = "sysadmSqlSessionFactory") public SqlSessionFactory sysadmSqlSessionFactory(@Qualifier("sysadmDataSource") DataSource sysadmDataSource) throws Exception { log.info("--------sysadmSqlSessionFactory-------" + "加载完成"); SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(sysadmDataSource); sessionFactory.setMapperLocations( new PathMatchingResourcePatternResolver().getResources(SysadmDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } @Bean(name = "sysadmSqlSessionTemplate") public SqlSessionTemplate kdysSqlSessionTemplate( @Qualifier("sysadmSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
以上多数据源即可使用了,如果需要其他数据源,继续添加即可
pagehelper:
helperDialect: mysql
reasonable: false
supportMethodsArguments: true
params: count=countSql
pagehelper 官网的连接
(1) helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。
(2) offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
(3) rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。
(4) pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
(5) reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
(6) params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
(7) supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。
(8) autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver)
pagehelper:
# helperDialect: mysql
reasonable: false
supportMethodsArguments: true
params: count=countSql
# 默认false,当为true时,自动检验适合的数据库
auto-dialect: true
# 这个一定要加上,不然mysql和oracle分页两个只能用一个,另一个会报错,加上后,两中数据库分页都可以用了
auto-runtime-dialect: true
如来神掌,写完收工
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。