资讯专栏INFORMATION COLUMN

SpringBoot进阶教程 | 第四篇:整合Mybatis实现多数据源

AZmake / 3426人阅读

这篇文章主要介绍,通过Spring Boot整合Mybatis后如何实现在一个工程中实现多数据源。同时可实现读写分离。

准备工作

环境:

</>复制代码

  1. windows
  2. jdk 8
  3. maven 3.0
  4. IDEA
创建数据库表

mysql中创建student库并执行下面查询创建student

</>复制代码

  1. -- ----------------------------
  2. -- Table structure for student
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `student`;
  5. CREATE TABLE `student` (
  6. `sno` int(15) NOT NULL,
  7. `sname` varchar(50) DEFAULT NULL,
  8. `sex` char(2) DEFAULT NULL,
  9. `dept` varchar(25) DEFAULT NULL,
  10. `birth` date DEFAULT NULL,
  11. `age` int(3) DEFAULT NULL,
  12. PRIMARY KEY (`sno`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  14. -- ----------------------------
  15. -- Records of student
  16. -- ----------------------------
  17. INSERT INTO `student` VALUES ("1", "李同学", "1", "王同学学习成绩很不错", "2010-07-22", "17");

mysql中创建teacher库并执行下面查询创建teacher

</>复制代码

  1. -- ----------------------------
  2. -- Table structure for teacher
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `teacher`;
  5. CREATE TABLE `teacher` (
  6. `Tno` varchar(20) NOT NULL DEFAULT "",
  7. `Tname` varchar(50) DEFAULT NULL,
  8. `sex` char(2) DEFAULT NULL,
  9. `dept` varchar(25) DEFAULT NULL,
  10. `birth` date DEFAULT NULL,
  11. `age` int(3) DEFAULT NULL,
  12. PRIMARY KEY (`Tno`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  14. -- ----------------------------
  15. -- Records of teacher
  16. -- ----------------------------
  17. INSERT INTO `teacher` VALUES ("1", "王老师", "1", "王老师上课很认真", "2018-07-06", "35");
构建工程

</>复制代码

  1. 4.0.0
  2. cn.zhangbox
  3. spring-boot-study
  4. 1.0-SNAPSHOT
  5. cn.zhangbox
  6. spring-boot-mybatis-datasource
  7. 0.0.1-SNAPSHOT
  8. jar
  9. spring-boot-mybatis-datasource
  10. this project for Spring Boot
  11. UTF-8
  12. UTF-8
  13. 1.8
  14. 3.4
  15. 1.10
  16. 1.2.0
  17. 1.16.14
  18. 1.2.41
  19. 1.1.2
  20. aliyunmaven
  21. http://maven.aliyun.com/nexus/content/groups/public/
  22. org.mybatis.spring.boot
  23. mybatis-spring-boot-starter
  24. ${mybatis-spring-boot.version}
  25. org.springframework.boot
  26. spring-boot-starter-web
  27. mysql
  28. mysql-connector-java
  29. runtime
  30. org.springframework.boot
  31. spring-boot-starter-test
  32. test
  33. org.apache.commons
  34. commons-lang3
  35. ${commons-lang3.version}
  36. commons-codec
  37. commons-codec
  38. ${commons-codec.version}
  39. com.alibaba
  40. fastjson
  41. ${fastjson.version}
  42. com.alibaba
  43. druid-spring-boot-starter
  44. ${druid.version}
  45. org.projectlombok
  46. lombok
  47. ${lombok.version}
  48. spring-boot-mybatis-datasource
  49. org.apache.maven.plugins
  50. maven-compiler-plugin
  51. 3.5.1
  52. 1.8
  53. 1.8
  54. UTF-8
  55. org.apache.maven.plugins
  56. maven-surefire-plugin
  57. 2.19.1
  58. org.springframework.boot
  59. spring-boot-maven-plugin
  60. org.springframework
  61. springloaded
  62. 1.2.4.RELEASE
  63. cn.zhangbox.admin.SpringBootDruidApplication
  64. -Dfile.encoding=UTF-8 -Xdebug
  65. -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
  66. true
  67. true
  68. org.springframework.boot
  69. spring-boot-maven-plugin
  70. cn.zhangbox.admin.SpringBootDruidApplication
  71. -Dfile.encoding=UTF-8 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
  72. true
  73. true

注意:这里引入了lombok插件节省编写实体类时候写getset方法,这里在idea中进行setget操作需要下载lombok插件,在设置页面的plugins中搜索lombok插件在中央插件库下载后重启idea即可,更详细的lombok使用教程可以查考:

程序员DD的lombok系列教程:

Lombok:让JAVA代码更优雅

修改YML配置

</>复制代码

  1. #公共配置
  2. server:
  3. port: 80
  4. tomcat:
  5. uri-encoding: UTF-8
  6. spring:
  7. #激活哪一个环境的配置文件
  8. profiles:
  9. active: dev
  10. #连接池配置
  11. datasource:
  12. #配置student库驱动和连接池
  13. student:
  14. driver-class-name: com.mysql.jdbc.Driver
  15. # 使用druid数据源
  16. type: com.alibaba.druid.pool.DruidDataSource
  17. #配置teacher库驱动和连接池
  18. teacher:
  19. driver-class-name: com.mysql.jdbc.Driver
  20. # 使用druid数据源
  21. type: com.alibaba.druid.pool.DruidDataSource
  22. druid:
  23. # 配置测试查询语句
  24. validationQuery: SELECT 1 FROM DUAL
  25. # 初始化大小,最小,最大
  26. initialSize: 10
  27. minIdle: 10
  28. maxActive: 200
  29. # 配置一个连接在池中最小生存的时间,单位是毫秒
  30. minEvictableIdleTimeMillis: 180000
  31. testOnBorrow: false
  32. testWhileIdle: true
  33. removeAbandoned: true
  34. removeAbandonedTimeout: 1800
  35. logAbandoned: true
  36. # 打开PSCache,并且指定每个连接上PSCache的大小
  37. poolPreparedStatements: true
  38. maxOpenPreparedStatements: 100
  39. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,"wall"用于防火墙
  40. filters: stat,wall,log4j
  41. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
  42. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  43. #mybatis
  44. mybatis:
  45. # 实体类扫描
  46. type-aliases-package: cn.zhangbox.springboot.entity
  47. # 配置映射文件位置
  48. mapper-locations: classpath:mapper/*.xml
  49. # 开启驼峰匹配
  50. mapUnderscoreToCamelCase: true
  51. ---
  52. #开发环境配置
  53. server:
  54. #端口
  55. port: 8080
  56. spring:
  57. profiles: dev
  58. # 数据源配置
  59. datasource:
  60. student:
  61. url: jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
  62. username: root
  63. password: 123456
  64. teacher:
  65. url: jdbc:mysql://127.0.0.1:3306/teacher?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
  66. username: root
  67. password: 123456
  68. #日志
  69. logging:
  70. config: classpath:log/logback.xml
  71. path: log/spring-boot-mybatis-datasource
  72. ---
  73. #测试环境配置
  74. server:
  75. #端口
  76. port: 80
  77. spring:
  78. profiles: test
  79. # 数据源配置
  80. datasource:
  81. student:
  82. url: jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
  83. username: root
  84. password: 123456
  85. teacher:
  86. url: jdbc:mysql://127.0.0.1:3306/teacher?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
  87. username: root
  88. password: 123456
  89. #日志
  90. logging:
  91. config: classpath:log/logback.xml
  92. path: /home/log/spring-boot-mybatis-datasource
  93. ---
  94. #生产环境配置
  95. server:
  96. #端口
  97. port: 8080
  98. spring:
  99. profiles: prod
  100. # 数据源配置
  101. datasource:
  102. student:
  103. url: jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
  104. username: root
  105. password: 123456
  106. teacher:
  107. url: jdbc:mysql://127.0.0.1:3306/teacher?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
  108. username: root
  109. password: 123456
  110. #日志
  111. logging:
  112. config: classpath:log/logback.xml
  113. path: /home/log/spring-boot-mybatis-datasource

这里进行了mybatis整合,如果不会mybatis整合可以参考我写的这篇文章:
SpringBoot非官方教程 | 第六篇:SpringBoot整合mybatis

创建日志配置文件

在工程resources文件夹下新建文件夹log,并在该文件夹下创建logback.xml文件,加入以下配置:

</>复制代码

  1. ${CONSOLE_LOG_PATTERN}
  2. UTF-8
  3. info
  4. ${LOG_PATH}/log_debug.log
  5. %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
  6. UTF-8
  7. ${LOG_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log
  8. 500MB
  9. 30
  10. debug
  11. ACCEPT
  12. DENY
  13. ${LOG_PATH}/log_info.log
  14. %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
  15. UTF-8
  16. ${LOG_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log
  17. 500MB
  18. 30
  19. info
  20. ACCEPT
  21. DENY
  22. ${LOG_PATH}/log_warn.log
  23. %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
  24. UTF-8
  25. ${LOG_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log
  26. 500MB
  27. 30
  28. warn
  29. ACCEPT
  30. DENY
  31. ${LOG_PATH}/log_error.log
  32. %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
  33. UTF-8
  34. ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log
  35. 500MB
  36. 30
  37. error
  38. ACCEPT
  39. DENY

注意:loback配置文件中

</>复制代码

name的属性值一定要是当前工程的java代码的完整目录,因为mybatis打印的日志级别是debug级别的,因此需要配置debug级别日志扫描的目录。

创建Druid配置类

在工程java代码目录下创建config的目录在下面创建DruidDBConfig类加入以下代码:

</>复制代码

  1. @Configuration
  2. public class DruidDBConfig {
  3. @Bean
  4. public ServletRegistrationBean druidServlet() {
  5. ServletRegistrationBean reg = new ServletRegistrationBean();
  6. reg.setServlet(new StatViewServlet());
  7. reg.addUrlMappings("/druid/*");
  8. //设置控制台管理用户
  9. reg.addInitParameter("loginUsername","root");
  10. reg.addInitParameter("loginPassword","root");
  11. // 禁用HTML页面上的“Reset All”功能
  12. reg.addInitParameter("resetEnable","false");
  13. //reg.addInitParameter("allow", "127.0.0.1"); //白名单
  14. return reg;
  15. }
  16. @Bean
  17. public FilterRegistrationBean filterRegistrationBean() {
  18. //创建过滤器
  19. FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
  20. filterRegistrationBean.setFilter(new WebStatFilter());
  21. Map initParams = new HashMap();
  22. //忽略过滤的形式
  23. initParams.put("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
  24. filterRegistrationBean.setInitParameters(initParams);
  25. //设置过滤器过滤路径
  26. filterRegistrationBean.addUrlPatterns("/*");
  27. return filterRegistrationBean;
  28. }
  29. }

注意:这里ServletRegistrationBean 配置bean中通过addInitParameter设置了管控台的用户名密码都是root,可以在这里进行自定义配置也可以将这里的用户名密码通过转移数据库进行定制化配置实现。

创建Student数据源配置类

在工程java代码目录下创建config的目录在下面创建StudentDataSourceConfig类加入以下代码:

</>复制代码

  1. @Configuration
  2. @MapperScan(basePackages ="cn.zhangbox.springboot.dao.student",sqlSessionFactoryRef = "studentSqlSessionFactory")//mybatis接口包扫描
  3. public class StudentDataSourceConfig {
  4. @Value("${spring.datasource.student.type}")
  5. private Class dataSourceType;
  6. /**
  7. *初始化连接池
  8. * @return
  9. */
  10. @Bean(name = "studentDataSource")
  11. @ConfigurationProperties(prefix = "spring.datasource.student")
  12. @Primary
  13. public DataSource writeDataSource() {
  14. return DataSourceBuilder.create().type(dataSourceType).build();
  15. }
  16. /**
  17. *
  18. * 构建 SqlSessionFactory
  19. * @return
  20. */
  21. @Bean(name = "studentSqlSessionFactory")
  22. @Primary
  23. public SqlSessionFactory studentSqlSessionFactory(@Qualifier("studentDataSource") DataSource dataSource) throws Exception {
  24. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  25. bean.setDataSource(dataSource);
  26. //bean.setTypeAliasesPackage("com.ztzq.data.beans.bigdata");
  27. bean.setVfs(SpringBootVFS.class);
  28. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/student/*.xml"));
  29. return bean.getObject();
  30. }
  31. /**
  32. * 配置事物
  33. * @param dataSource
  34. * @return
  35. */
  36. @Bean(name = "studentTransactionManager")
  37. @Primary
  38. public DataSourceTransactionManager TransactionManager(@Qualifier("studentDataSource") DataSource dataSource) {
  39. return new DataSourceTransactionManager(dataSource);
  40. }
  41. /**
  42. * 构建 SqlSessionTemplate
  43. * @param sqlSessionFactory
  44. * @return
  45. * @throws Exception
  46. */
  47. @Bean(name = "studentSqlSessionTemplate")
  48. @Primary
  49. public SqlSessionTemplate SqlSessionTemplate(@Qualifier("studentSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  50. return new SqlSessionTemplate(sqlSessionFactory);
  51. }
  52. }
创建Teacher数据源配置类

在工程java代码目录下创建config的目录在下面创建TeacherDataSourceConfig类加入以下代码:

</>复制代码

  1. @Configuration
  2. @MapperScan(basePackages ="cn.zhangbox.springboot.dao.teacher",sqlSessionFactoryRef = "teacherSqlSessionFactory")//mybatis接口包扫描
  3. public class TecaherDataSourceConfig {
  4. @Value("${spring.datasource.teacher.type}")
  5. private Class dataSourceType;
  6. /**
  7. *初始化连接池
  8. * @return
  9. */
  10. @Bean(name = "teacherDataSource")
  11. @ConfigurationProperties(prefix = "spring.datasource.teacher")
  12. public DataSource writeDataSource() {
  13. return DataSourceBuilder.create().type(dataSourceType).build();
  14. }
  15. /**
  16. *
  17. * 构建 SqlSessionFactory
  18. * @return
  19. */
  20. @Bean(name = "teacherSqlSessionFactory")
  21. public SqlSessionFactory teacherSqlSessionFactory(@Qualifier("teacherDataSource") DataSource dataSource) throws Exception {
  22. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  23. bean.setDataSource(dataSource);
  24. //bean.setTypeAliasesPackage("com.ztzq.data.beans.bigdata");
  25. bean.setVfs(SpringBootVFS.class);
  26. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/teacher/*.xml"));
  27. return bean.getObject();
  28. }
  29. /**
  30. * 配置事物
  31. * @param dataSource
  32. * @return
  33. */
  34. @Bean(name = "teacherTransactionManager")
  35. public DataSourceTransactionManager TransactionManager(@Qualifier("teacherDataSource") DataSource dataSource) {
  36. return new DataSourceTransactionManager(dataSource);
  37. }
  38. /**
  39. * 构建 SqlSessionTemplate
  40. * @param sqlSessionFactory
  41. * @return
  42. * @throws Exception
  43. */
  44. @Bean(name = "teacherSqlSessionTemplate")
  45. public SqlSessionTemplate SqlSessionTemplate(@Qualifier("teacherSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  46. return new SqlSessionTemplate(sqlSessionFactory);
  47. }
  48. }
创建实体

在工程java代码目录下创建entity的目录在下面创建Student类加入以下代码:

</>复制代码

  1. @Data
  2. @EqualsAndHashCode(callSuper = false)
  3. public class Student {
  4. private static final long serialVersionUID = 1L;
  5. /**
  6. * 主键id
  7. */
  8. private Integer sno;
  9. /**
  10. * 学生姓名
  11. */
  12. private String sname;
  13. /**
  14. * 性别
  15. */
  16. private String sex;
  17. /**
  18. * 生日
  19. */
  20. private String birth;
  21. /**
  22. * 年龄
  23. */
  24. private String age;
  25. /**
  26. * 简介
  27. */
  28. private String dept;
  29. }

在工程java代码目录下创建entity的目录在下面创建Teacher类加入以下代码:

</>复制代码

  1. @Data
  2. @EqualsAndHashCode(callSuper = false)
  3. public class Teacher {
  4. private static final long serialVersionUID = 1L;
  5. /**
  6. * 主键id
  7. */
  8. private Integer tno;
  9. /**
  10. * 老师姓名
  11. */
  12. private String tname;
  13. /**
  14. * 性别
  15. */
  16. private String sex;
  17. /**
  18. * 生日
  19. */
  20. private String birth;
  21. /**
  22. * 年龄
  23. */
  24. private String age;
  25. /**
  26. * 简介
  27. */
  28. private String dept;
  29. }
创建Controller

在工程java代码目录下创建controller的目录在下面创建StudentConteroller类加入以下代码:

</>复制代码

  1. @Controller
  2. @RequestMapping("/student")
  3. public class StudentConteroller {
  4. private static final Logger LOGGER = LoggerFactory.getLogger(StudentConteroller.class);
  5. @Autowired
  6. protected StudentService studentService;
  7. /**
  8. * 查询所有的学生信息
  9. *
  10. * @param sname
  11. * @param age
  12. * @param modelMap
  13. * @return
  14. */
  15. @ResponseBody
  16. @GetMapping("/list")
  17. public String list(String sname, Integer age, ModelMap modelMap) {
  18. String json = null;
  19. try {
  20. List studentList = studentService.getStudentList(sname, age);
  21. modelMap.put("ren_code", "0");
  22. modelMap.put("ren_msg", "查询成功");
  23. modelMap.put("studentList", studentList);
  24. json = JSON.toJSONString(modelMap);
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. modelMap.put("ren_code", "0");
  28. modelMap.put("ren_msg", "查询失败===>" + e);
  29. LOGGER.error("查询失败===>" + e);
  30. json = JSON.toJSONString(modelMap);
  31. }
  32. return json;
  33. }
  34. }

在工程java代码目录下创建controller的目录在下面创建TeacherConteroller类加入以下代码:

</>复制代码

  1. @Controller
  2. @RequestMapping("/teacher")
  3. public class TeacherConteroller {
  4. private static final Logger LOGGER = LoggerFactory.getLogger(TeacherConteroller.class);
  5. @Autowired
  6. protected TeacherService teacherService;
  7. /**
  8. * 查询所有的老师信息
  9. *
  10. * @param tname
  11. * @param age
  12. * @param modelMap
  13. * @return
  14. */
  15. @ResponseBody
  16. @GetMapping("/list")
  17. public String list(String tname, Integer age, ModelMap modelMap) {
  18. String json = null;
  19. try {
  20. List teacherList = teacherService.getTeacherList(tname, age);
  21. modelMap.put("ren_code", "0");
  22. modelMap.put("ren_msg", "查询成功");
  23. modelMap.put("teacherList", teacherList);
  24. json = JSON.toJSONString(modelMap);
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. modelMap.put("ren_code", "0");
  28. modelMap.put("ren_msg", "查询失败===>" + e);
  29. LOGGER.error("查询失败===>" + e);
  30. json = JSON.toJSONString(modelMap);
  31. }
  32. return json;
  33. }
  34. }
创建Service

在工程java代码目录下面创建service目录在下面创建StudentService类加入以下代码:

</>复制代码

  1. public interface StudentService {
  2. /**
  3. * 查询所有的学生信息
  4. *
  5. * @param sname
  6. * @param age
  7. * @return
  8. */
  9. List getStudentList(String sname, Integer age);
  10. }

在工程java代码目录下面创建service目录在下面创建TeacherService类加入以下代码:

</>复制代码

  1. public interface TeacherService {
  2. /**
  3. * 查询所有的老师信息
  4. *
  5. * @param tname
  6. * @param age
  7. * @return
  8. */
  9. List getTeacherList(String tname, Integer age);
  10. }
创建ServiceImpl

在工程java代码目录下的service的目录下面创建impl目录在下面创建StudentServiceImpl类加入以下代码:

</>复制代码

  1. @Service("StudentService")
  2. @Transactional(readOnly = true, rollbackFor = Exception.class)
  3. public class StudentServiceImpl implements StudentService {
  4. @Autowired
  5. StudentDao studentDao;
  6. @Override
  7. public List getStudentList(String sname, Integer age) {
  8. return studentDao.getStudentList(sname,age);
  9. }
  10. }

在工程java代码目录下的service的目录下面创建impl目录在下面创建TeacherServiceImpl类加入以下代码:

</>复制代码

  1. @Service("TeacherService")
  2. @Transactional(readOnly = true, rollbackFor = Exception.class)
  3. public class TeacherServiceImpl implements TeacherService {
  4. @Autowired
  5. TeacherDao teacherDao;
  6. @Override
  7. public List getTeacherList(String tname, Integer age) {
  8. return teacherDao.getTeacherList(tname,age);
  9. }
  10. }
创建Dao

在工程java代码目录下创建dao的目录下面创建student目录在此目录下创建StudentDao类加入以下代码:

</>复制代码

  1. public interface StudentDao {
  2. List getStudentList(@Param("sname")String sname, @Param("age")Integer age);
  3. }

在工程java代码目录下创建dao的目录下面创建teacher目录在此目录下创建TeacherDao类加入以下代码:

</>复制代码

  1. public interface TeacherDao {
  2. List getTeacherList(@Param("tname") String tname, @Param("age") Integer age);
  3. }
创建Mapper映射文件

在工程resource目录下创建mapper的目录下创建student目录在此目录下面创建StudentMapper.xml映射文件加入以下代码:

</>复制代码

在工程resource目录下创建mapper的目录下创建teacher目录在此目录下面创建TeacherMapper.xml映射文件加入以下代码:

</>复制代码

创建启动类

</>复制代码

  1. @SpringBootApplication
  2. public class SpringBootManyDataSourceApplication extends SpringBootServletInitializer {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringBootManyDataSourceApplication.class, args);
  5. }
  6. }
启动项目进行测试: 控制台打印

</>复制代码

  1. . ____ _ __ _ _
  2. / / ___"_ __ _ _(_)_ __ __ _
  3. ( ( )\___ | "_ | "_| | "_ / _` |
  4. / ___)| |_)| | | | | || (_| | ) ) ) )
  5. " |____| .__|_| |_|_| |_\__, | / / / /
  6. =========|_|==============|___/=/_/_/_/
  7. :: Spring Boot :: (v1.5.3.RELEASE)
  8. 2018-07-09 19:58:22.757 INFO 10096 --- [ main] .z.s.SpringBootManyDataSourceApplication : Starting SpringBootManyDataSourceApplication on 99IHXFJDHAQ7H7N with PID 10096 (started by Administrator in D:开源项目spring-boot-study)
  9. 2018-07-09 19:58:22.780 INFO 10096 --- [ main] .z.s.SpringBootManyDataSourceApplication : The following profiles are active: dev
  10. 2018-07-09 19:58:22.987 INFO 10096 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@35e5d0e5: startup date [Mon Jul 09 19:58:22 CST 2018]; root of context hierarchy
  11. 2018-07-09 19:58:23.460 INFO 10096 --- [kground-preinit] o.h.validator.internal.util.Version : HV000001: Hibernate Validator 5.3.5.Final
  12. 2018-07-09 19:58:24.220 INFO 10096 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean "filterRegistrationBean" with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=druidDBConfig; factoryMethodName=filterRegistrationBean; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [cn/zhangbox/springboot/config/DruidDBConfig.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=com.alibaba.druid.spring.boot.autoconfigure.stat.DruidWebStatFilterConfiguration; factoryMethodName=filterRegistrationBean; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/alibaba/druid/spring/boot/autoconfigure/stat/DruidWebStatFilterConfiguration.class]]
  13. 2018-07-09 19:58:25.440 INFO 10096 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
  14. 2018-07-09 19:58:25.457 INFO 10096 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat
  15. 2018-07-09 19:58:25.459 INFO 10096 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.14
  16. 2018-07-09 19:58:25.594 INFO 10096 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
  17. 2018-07-09 19:58:25.594 INFO 10096 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2608 ms
  18. 2018-07-09 19:58:26.138 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: "statViewServlet" to [/druid/*]
  19. 2018-07-09 19:58:26.139 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: "dispatcherServlet" to [/]
  20. 2018-07-09 19:58:26.140 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: "statViewServlet" to [/druid/*]
  21. 2018-07-09 19:58:26.141 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet statViewServlet was not registered (possibly already registered?)
  22. 2018-07-09 19:58:26.146 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "characterEncodingFilter" to: [/*]
  23. 2018-07-09 19:58:26.147 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "hiddenHttpMethodFilter" to: [/*]
  24. 2018-07-09 19:58:26.148 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "httpPutFormContentFilter" to: [/*]
  25. 2018-07-09 19:58:26.148 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "requestContextFilter" to: [/*]
  26. 2018-07-09 19:58:26.149 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "webStatFilter" to urls: [/*]
  27. 2018-07-09 19:58:27.694 INFO 10096 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@35e5d0e5: startup date [Mon Jul 09 19:58:22 CST 2018]; root of context hierarchy
  28. 2018-07-09 19:58:27.792 INFO 10096 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/student/list],methods=[GET]}" onto public java.lang.String cn.zhangbox.springboot.controller.StudentConteroller.list(java.lang.String,java.lang.Integer,org.springframework.ui.ModelMap)
  29. 2018-07-09 19:58:27.794 INFO 10096 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/teacher/list],methods=[GET]}" onto public java.lang.String cn.zhangbox.springboot.controller.TeacherConteroller.list(java.lang.String,java.lang.Integer,org.springframework.ui.ModelMap)
  30. 2018-07-09 19:58:27.796 INFO 10096 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
  31. 2018-07-09 19:58:27.796 INFO 10096 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
  32. 2018-07-09 19:58:27.837 INFO 10096 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
  33. 2018-07-09 19:58:27.837 INFO 10096 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
  34. 2018-07-09 19:58:27.893 INFO 10096 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
  35. 2018-07-09 19:58:28.836 INFO 10096 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
  36. 2018-07-09 19:58:28.837 INFO 10096 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name "studentDataSource" has been autodetected for JMX exposure
  37. 2018-07-09 19:58:28.838 INFO 10096 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name "teacherDataSource" has been autodetected for JMX exposure
  38. 2018-07-09 19:58:28.838 INFO 10096 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name "statFilter" has been autodetected for JMX exposure
  39. 2018-07-09 19:58:28.846 INFO 10096 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean "studentDataSource": registering with JMX server as MBean [com.alibaba.druid.pool:name=studentDataSource,type=DruidDataSource]
  40. 2018-07-09 19:58:28.849 INFO 10096 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean "teacherDataSource": registering with JMX server as MBean [com.alibaba.druid.pool:name=teacherDataSource,type=DruidDataSource]
  41. 2018-07-09 19:58:28.851 INFO 10096 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean "statFilter": registering with JMX server as MBean [com.alibaba.druid.filter.stat:name=statFilter,type=StatFilter]
  42. 2018-07-09 19:58:28.877 INFO 10096 --- [ main] o.a.coyote.http11.Http11NioProtocol : Initializing ProtocolHandler ["http-nio-8080"]
  43. 2018-07-09 19:58:28.905 INFO 10096 --- [ main] o.a.coyote.http11.Http11NioProtocol : Starting ProtocolHandler ["http-nio-8080"]
  44. 2018-07-09 19:58:28.930 INFO 10096 --- [ main] o.a.tomcat.util.net.NioSelectorPool : Using a shared selector for servlet write/read
  45. 2018-07-09 19:58:28.965 INFO 10096 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
  46. 2018-07-09 19:58:28.972 INFO 10096 --- [ main] .z.s.SpringBootManyDataSourceApplication : Started SpringBootManyDataSourceApplication in 8.519 seconds (JVM running for 12.384)
  47. 2018-07-09 19:58:37.626 INFO 10096 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet "dispatcherServlet"
  48. 2018-07-09 19:58:37.626 INFO 10096 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet "dispatcherServlet": initialization started
  49. 2018-07-09 19:58:37.660 INFO 10096 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet "dispatcherServlet": initialization completed in 33 ms
  50. 2018-07-09 19:58:37.981 INFO 10096 --- [nio-8080-exec-1] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
  51. 2018-07-09 19:58:41.381 INFO 10096 --- [nio-8080-exec-2] com.alibaba.druid.pool.DruidDataSource : {dataSource-2} inited
浏览器请求测试


本地日志打印效果

</>复制代码

  1. 2018-07-09 19:58:22.779 [main] DEBUG c.z.springboot.SpringBootManyDataSourceApplication - Running with Spring Boot v1.5.3.RELEASE, Spring v4.3.8.RELEASE
  2. 2018-07-09 19:58:38.386 [http-nio-8080-exec-1] DEBUG c.z.s.dao.student.StudentDao.getStudentList - ==> Preparing: SELECT s.sno, s.sname, s.sex, s.dept, s.birth, s.age FROM student s WHERE 1 = 1
  3. 2018-07-09 19:58:38.409 [http-nio-8080-exec-1] DEBUG c.z.s.dao.student.StudentDao.getStudentList - ==> Parameters:
  4. 2018-07-09 19:58:38.436 [http-nio-8080-exec-1] DEBUG c.z.s.dao.student.StudentDao.getStudentList - <== Total: 2
  5. 2018-07-09 19:58:41.461 [http-nio-8080-exec-2] DEBUG c.z.s.dao.teacher.TeacherDao.getTeacherList - ==> Preparing: SELECT s.tno, s.tname, s.sex, s.dept, s.birth, s.age FROM teacher s WHERE 1 = 1
  6. 2018-07-09 19:58:41.462 [http-nio-8080-exec-2] DEBUG c.z.s.dao.teacher.TeacherDao.getTeacherList - ==> Parameters:
  7. 2018-07-09 19:58:41.472 [http-nio-8080-exec-2] DEBUG c.z.s.dao.teacher.TeacherDao.getTeacherList - <== Total: 1

这里使用logback配置中将不同级别的日志设置了在不同文件中打印,这样很大程度上方便项目出问题查找问题。

Druid管控台






druid链接池不知道怎么配置可以参考我写的这篇文章:
SpringBoot进阶教程 | 第三篇:整合Druid连接池以及Druid监控

源码地址

Spring Boot整合Mybatis实现多数据源源码

欢迎关注我的微信公众号获取更多更全的学习资源,视频资料,技术干货!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71553.html

相关文章

  • Java3y文章目录导航

    摘要:前言由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 前言 由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 由于更新比较频繁,因此隔一段时间才会更新目录导航哦~想要获取最新原创的技术文章欢迎关注我的公众号:Java3y Java3y文章目录导航 Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池...

    KevinYan 评论0 收藏0
  • SpringCloud核心教程 | 四篇:服务注册与发现 Consul篇

    摘要:下一篇介绍基于的服务注册与调用。服务提供者工程配置这里服务提供者是使用之前进阶教程第三篇整合连接池以及监控改造而来,这里一样的部分就不再重复说明,下面将说明新增的部分。 Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分...

    Xufc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<