这篇文章主要介绍,通过Spring Boot整合Mybatis后如何实现在一个工程中实现多数据源。同时可实现读写分离。
准备工作环境:
windows jdk 8 maven 3.0 IDEA创建数据库表
在mysql中创建student库并执行下面查询创建student表
-- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sno` int(15) NOT NULL, `sname` varchar(50) DEFAULT NULL, `sex` char(2) DEFAULT NULL, `dept` varchar(25) DEFAULT NULL, `birth` date DEFAULT NULL, `age` int(3) DEFAULT NULL, PRIMARY KEY (`sno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ("1", "李同学", "1", "王同学学习成绩很不错", "2010-07-22", "17");
在mysql中创建teacher库并执行下面查询创建teacher表
-- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `Tno` varchar(20) NOT NULL DEFAULT "", `Tname` varchar(50) DEFAULT NULL, `sex` char(2) DEFAULT NULL, `dept` varchar(25) DEFAULT NULL, `birth` date DEFAULT NULL, `age` int(3) DEFAULT NULL, PRIMARY KEY (`Tno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES ("1", "王老师", "1", "王老师上课很认真", "2018-07-06", "35");构建工程
4.0.0 cn.zhangbox spring-boot-study 1.0-SNAPSHOT cn.zhangbox spring-boot-mybatis-datasource 0.0.1-SNAPSHOT jar spring-boot-mybatis-datasource this project for Spring Boot UTF-8 UTF-8 1.8 3.4 1.10 1.2.0 1.16.14 1.2.41 1.1.2 aliyunmaven http://maven.aliyun.com/nexus/content/groups/public/ org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis-spring-boot.version} org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test org.apache.commons commons-lang3 ${commons-lang3.version} commons-codec commons-codec ${commons-codec.version} com.alibaba fastjson ${fastjson.version} com.alibaba druid-spring-boot-starter ${druid.version} org.projectlombok lombok ${lombok.version} spring-boot-mybatis-datasource org.apache.maven.plugins maven-compiler-plugin 3.5.1 1.8 UTF-8 org.apache.maven.plugins maven-surefire-plugin 2.19.1 org.springframework.boot spring-boot-maven-plugin org.springframework springloaded 1.2.4.RELEASE cn.zhangbox.admin.SpringBootDruidApplication -Dfile.encoding=UTF-8 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 true true org.springframework.boot spring-boot-maven-plugin cn.zhangbox.admin.SpringBootDruidApplication -Dfile.encoding=UTF-8 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 true true
注意:这里引入了lombok插件节省编写实体类时候写get和set方法,这里在idea中进行set和get操作需要下载lombok插件,在设置页面的plugins中搜索lombok插件在中央插件库下载后重启idea即可,更详细的lombok使用教程可以查考:
程序员DD的lombok系列教程:Lombok:让JAVA代码更优雅
修改YML配置#公共配置 server: port: 80 tomcat: uri-encoding: UTF-8 spring: #激活哪一个环境的配置文件 profiles: active: dev #连接池配置 datasource: #配置student库驱动和连接池 student: driver-class-name: com.mysql.jdbc.Driver # 使用druid数据源 type: com.alibaba.druid.pool.DruidDataSource #配置teacher库驱动和连接池 teacher: driver-class-name: com.mysql.jdbc.Driver # 使用druid数据源 type: com.alibaba.druid.pool.DruidDataSource druid: # 配置测试查询语句 validationQuery: SELECT 1 FROM DUAL # 初始化大小,最小,最大 initialSize: 10 minIdle: 10 maxActive: 200 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 180000 testOnBorrow: false testWhileIdle: true removeAbandoned: true removeAbandonedTimeout: 1800 logAbandoned: true # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxOpenPreparedStatements: 100 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,"wall"用于防火墙 filters: stat,wall,log4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 #mybatis mybatis: # 实体类扫描 type-aliases-package: cn.zhangbox.springboot.entity # 配置映射文件位置 mapper-locations: classpath:mapper/*.xml # 开启驼峰匹配 mapUnderscoreToCamelCase: true --- #开发环境配置 server: #端口 port: 8080 spring: profiles: dev # 数据源配置 datasource: student: url: jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 teacher: url: jdbc:mysql://127.0.0.1:3306/teacher?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 #日志 logging: config: classpath:log/logback.xml path: log/spring-boot-mybatis-datasource --- #测试环境配置 server: #端口 port: 80 spring: profiles: test # 数据源配置 datasource: student: url: jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 teacher: url: jdbc:mysql://127.0.0.1:3306/teacher?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 #日志 logging: config: classpath:log/logback.xml path: /home/log/spring-boot-mybatis-datasource --- #生产环境配置 server: #端口 port: 8080 spring: profiles: prod # 数据源配置 datasource: student: url: jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 teacher: url: jdbc:mysql://127.0.0.1:3306/teacher?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 #日志 logging: config: classpath:log/logback.xml path: /home/log/spring-boot-mybatis-datasource
这里进行了mybatis整合,如果不会mybatis整合可以参考我写的这篇文章:
SpringBoot非官方教程 | 第六篇:SpringBoot整合mybatis
在工程resources文件夹下新建文件夹log,并在该文件夹下创建logback.xml文件,加入以下配置:
${CONSOLE_LOG_PATTERN} UTF-8 info ${LOG_PATH}/log_debug.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${LOG_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log 500MB 30 debug ACCEPT DENY ${LOG_PATH}/log_info.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${LOG_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log 500MB 30 info ACCEPT DENY ${LOG_PATH}/log_warn.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${LOG_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log 500MB 30 warn ACCEPT DENY ${LOG_PATH}/log_error.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log 500MB 30 error ACCEPT DENY
注意::loback配置文件中
name的属性值一定要是当前工程的java代码的完整目录,因为mybatis打印的日志级别是debug级别的,因此需要配置debug级别日志扫描的目录。
创建Druid配置类在工程java代码目录下创建config的目录在下面创建DruidDBConfig类加入以下代码:
@Configuration public class DruidDBConfig { @Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean reg = new ServletRegistrationBean(); reg.setServlet(new StatViewServlet()); reg.addUrlMappings("/druid/*"); //设置控制台管理用户 reg.addInitParameter("loginUsername","root"); reg.addInitParameter("loginPassword","root"); // 禁用HTML页面上的“Reset All”功能 reg.addInitParameter("resetEnable","false"); //reg.addInitParameter("allow", "127.0.0.1"); //白名单 return reg; } @Bean public FilterRegistrationBean filterRegistrationBean() { //创建过滤器 FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); MapinitParams = new HashMap (); //忽略过滤的形式 initParams.put("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"); filterRegistrationBean.setInitParameters(initParams); //设置过滤器过滤路径 filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } }
注意:这里ServletRegistrationBean 配置bean中通过addInitParameter设置了管控台的用户名密码都是root,可以在这里进行自定义配置也可以将这里的用户名密码通过转移数据库进行定制化配置实现。
创建Student数据源配置类在工程java代码目录下创建config的目录在下面创建StudentDataSourceConfig类加入以下代码:
@Configuration @MapperScan(basePackages ="cn.zhangbox.springboot.dao.student",sqlSessionFactoryRef = "studentSqlSessionFactory")//mybatis接口包扫描 public class StudentDataSourceConfig { @Value("${spring.datasource.student.type}") private Class extends DataSource> dataSourceType; /** *初始化连接池 * @return */ @Bean(name = "studentDataSource") @ConfigurationProperties(prefix = "spring.datasource.student") @Primary public DataSource writeDataSource() { return DataSourceBuilder.create().type(dataSourceType).build(); } /** * * 构建 SqlSessionFactory * @return */ @Bean(name = "studentSqlSessionFactory") @Primary public SqlSessionFactory studentSqlSessionFactory(@Qualifier("studentDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //bean.setTypeAliasesPackage("com.ztzq.data.beans.bigdata"); bean.setVfs(SpringBootVFS.class); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/student/*.xml")); return bean.getObject(); } /** * 配置事物 * @param dataSource * @return */ @Bean(name = "studentTransactionManager") @Primary public DataSourceTransactionManager TransactionManager(@Qualifier("studentDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * 构建 SqlSessionTemplate * @param sqlSessionFactory * @return * @throws Exception */ @Bean(name = "studentSqlSessionTemplate") @Primary public SqlSessionTemplate SqlSessionTemplate(@Qualifier("studentSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }创建Teacher数据源配置类
在工程java代码目录下创建config的目录在下面创建TeacherDataSourceConfig类加入以下代码:
@Configuration @MapperScan(basePackages ="cn.zhangbox.springboot.dao.teacher",sqlSessionFactoryRef = "teacherSqlSessionFactory")//mybatis接口包扫描 public class TecaherDataSourceConfig { @Value("${spring.datasource.teacher.type}") private Class extends DataSource> dataSourceType; /** *初始化连接池 * @return */ @Bean(name = "teacherDataSource") @ConfigurationProperties(prefix = "spring.datasource.teacher") public DataSource writeDataSource() { return DataSourceBuilder.create().type(dataSourceType).build(); } /** * * 构建 SqlSessionFactory * @return */ @Bean(name = "teacherSqlSessionFactory") public SqlSessionFactory teacherSqlSessionFactory(@Qualifier("teacherDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //bean.setTypeAliasesPackage("com.ztzq.data.beans.bigdata"); bean.setVfs(SpringBootVFS.class); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/teacher/*.xml")); return bean.getObject(); } /** * 配置事物 * @param dataSource * @return */ @Bean(name = "teacherTransactionManager") public DataSourceTransactionManager TransactionManager(@Qualifier("teacherDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * 构建 SqlSessionTemplate * @param sqlSessionFactory * @return * @throws Exception */ @Bean(name = "teacherSqlSessionTemplate") public SqlSessionTemplate SqlSessionTemplate(@Qualifier("teacherSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }创建实体
在工程java代码目录下创建entity的目录在下面创建Student类加入以下代码:
@Data @EqualsAndHashCode(callSuper = false) public class Student { private static final long serialVersionUID = 1L; /** * 主键id */ private Integer sno; /** * 学生姓名 */ private String sname; /** * 性别 */ private String sex; /** * 生日 */ private String birth; /** * 年龄 */ private String age; /** * 简介 */ private String dept; }
在工程java代码目录下创建entity的目录在下面创建Teacher类加入以下代码:
@Data @EqualsAndHashCode(callSuper = false) public class Teacher { private static final long serialVersionUID = 1L; /** * 主键id */ private Integer tno; /** * 老师姓名 */ private String tname; /** * 性别 */ private String sex; /** * 生日 */ private String birth; /** * 年龄 */ private String age; /** * 简介 */ private String dept; }创建Controller
在工程java代码目录下创建controller的目录在下面创建StudentConteroller类加入以下代码:
@Controller @RequestMapping("/student") public class StudentConteroller { private static final Logger LOGGER = LoggerFactory.getLogger(StudentConteroller.class); @Autowired protected StudentService studentService; /** * 查询所有的学生信息 * * @param sname * @param age * @param modelMap * @return */ @ResponseBody @GetMapping("/list") public String list(String sname, Integer age, ModelMap modelMap) { String json = null; try { ListstudentList = studentService.getStudentList(sname, age); modelMap.put("ren_code", "0"); modelMap.put("ren_msg", "查询成功"); modelMap.put("studentList", studentList); json = JSON.toJSONString(modelMap); } catch (Exception e) { e.printStackTrace(); modelMap.put("ren_code", "0"); modelMap.put("ren_msg", "查询失败===>" + e); LOGGER.error("查询失败===>" + e); json = JSON.toJSONString(modelMap); } return json; } }
在工程java代码目录下创建controller的目录在下面创建TeacherConteroller类加入以下代码:
@Controller @RequestMapping("/teacher") public class TeacherConteroller { private static final Logger LOGGER = LoggerFactory.getLogger(TeacherConteroller.class); @Autowired protected TeacherService teacherService; /** * 查询所有的老师信息 * * @param tname * @param age * @param modelMap * @return */ @ResponseBody @GetMapping("/list") public String list(String tname, Integer age, ModelMap modelMap) { String json = null; try { List创建ServiceteacherList = teacherService.getTeacherList(tname, age); modelMap.put("ren_code", "0"); modelMap.put("ren_msg", "查询成功"); modelMap.put("teacherList", teacherList); json = JSON.toJSONString(modelMap); } catch (Exception e) { e.printStackTrace(); modelMap.put("ren_code", "0"); modelMap.put("ren_msg", "查询失败===>" + e); LOGGER.error("查询失败===>" + e); json = JSON.toJSONString(modelMap); } return json; } }
在工程java代码目录下面创建service目录在下面创建StudentService类加入以下代码:
public interface StudentService { /** * 查询所有的学生信息 * * @param sname * @param age * @return */ ListgetStudentList(String sname, Integer age); }
在工程java代码目录下面创建service目录在下面创建TeacherService类加入以下代码:
public interface TeacherService { /** * 查询所有的老师信息 * * @param tname * @param age * @return */ List创建ServiceImplgetTeacherList(String tname, Integer age); }
在工程java代码目录下的service的目录下面创建impl目录在下面创建StudentServiceImpl类加入以下代码:
@Service("StudentService") @Transactional(readOnly = true, rollbackFor = Exception.class) public class StudentServiceImpl implements StudentService { @Autowired StudentDao studentDao; @Override public ListgetStudentList(String sname, Integer age) { return studentDao.getStudentList(sname,age); } }
在工程java代码目录下的service的目录下面创建impl目录在下面创建TeacherServiceImpl类加入以下代码:
@Service("TeacherService") @Transactional(readOnly = true, rollbackFor = Exception.class) public class TeacherServiceImpl implements TeacherService { @Autowired TeacherDao teacherDao; @Override public List创建DaogetTeacherList(String tname, Integer age) { return teacherDao.getTeacherList(tname,age); } }
在工程java代码目录下创建dao的目录下面创建student目录在此目录下创建StudentDao类加入以下代码:
public interface StudentDao { ListgetStudentList(@Param("sname")String sname, @Param("age")Integer age); }
在工程java代码目录下创建dao的目录下面创建teacher目录在此目录下创建TeacherDao类加入以下代码:
public interface TeacherDao { List创建Mapper映射文件getTeacherList(@Param("tname") String tname, @Param("age") Integer age); }
在工程resource目录下创建mapper的目录下创建student目录在此目录下面创建StudentMapper.xml映射文件加入以下代码:
在工程resource目录下创建mapper的目录下创建teacher目录在此目录下面创建TeacherMapper.xml映射文件加入以下代码:
创建启动类
@SpringBootApplication public class SpringBootManyDataSourceApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(SpringBootManyDataSourceApplication.class, args); } }启动项目进行测试: 控制台打印
. ____ _ __ _ _ / / ___"_ __ _ _(_)_ __ __ _ ( ( )\___ | "_ | "_| | "_ / _` | / ___)| |_)| | | | | || (_| | ) ) ) ) " |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.5.3.RELEASE) 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) 2018-07-09 19:58:22.780 INFO 10096 --- [ main] .z.s.SpringBootManyDataSourceApplication : The following profiles are active: dev 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 2018-07-09 19:58:23.460 INFO 10096 --- [kground-preinit] o.h.validator.internal.util.Version : HV000001: Hibernate Validator 5.3.5.Final 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]] 2018-07-09 19:58:25.440 INFO 10096 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 2018-07-09 19:58:25.457 INFO 10096 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat 2018-07-09 19:58:25.459 INFO 10096 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.14 2018-07-09 19:58:25.594 INFO 10096 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2018-07-09 19:58:25.594 INFO 10096 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2608 ms 2018-07-09 19:58:26.138 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: "statViewServlet" to [/druid/*] 2018-07-09 19:58:26.139 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: "dispatcherServlet" to [/] 2018-07-09 19:58:26.140 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: "statViewServlet" to [/druid/*] 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?) 2018-07-09 19:58:26.146 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "characterEncodingFilter" to: [/*] 2018-07-09 19:58:26.147 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "hiddenHttpMethodFilter" to: [/*] 2018-07-09 19:58:26.148 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "httpPutFormContentFilter" to: [/*] 2018-07-09 19:58:26.148 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "requestContextFilter" to: [/*] 2018-07-09 19:58:26.149 INFO 10096 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: "webStatFilter" to urls: [/*] 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 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) 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) 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) 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) 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] 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] 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] 2018-07-09 19:58:28.836 INFO 10096 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 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 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 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 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] 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] 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] 2018-07-09 19:58:28.877 INFO 10096 --- [ main] o.a.coyote.http11.Http11NioProtocol : Initializing ProtocolHandler ["http-nio-8080"] 2018-07-09 19:58:28.905 INFO 10096 --- [ main] o.a.coyote.http11.Http11NioProtocol : Starting ProtocolHandler ["http-nio-8080"] 2018-07-09 19:58:28.930 INFO 10096 --- [ main] o.a.tomcat.util.net.NioSelectorPool : Using a shared selector for servlet write/read 2018-07-09 19:58:28.965 INFO 10096 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2018-07-09 19:58:28.972 INFO 10096 --- [ main] .z.s.SpringBootManyDataSourceApplication : Started SpringBootManyDataSourceApplication in 8.519 seconds (JVM running for 12.384) 2018-07-09 19:58:37.626 INFO 10096 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet "dispatcherServlet" 2018-07-09 19:58:37.626 INFO 10096 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet "dispatcherServlet": initialization started 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 2018-07-09 19:58:37.981 INFO 10096 --- [nio-8080-exec-1] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited 2018-07-09 19:58:41.381 INFO 10096 --- [nio-8080-exec-2] com.alibaba.druid.pool.DruidDataSource : {dataSource-2} inited
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 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 2018-07-09 19:58:38.409 [http-nio-8080-exec-1] DEBUG c.z.s.dao.student.StudentDao.getStudentList - ==> Parameters: 2018-07-09 19:58:38.436 [http-nio-8080-exec-1] DEBUG c.z.s.dao.student.StudentDao.getStudentList - <== Total: 2 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 2018-07-09 19:58:41.462 [http-nio-8080-exec-2] DEBUG c.z.s.dao.teacher.TeacherDao.getTeacherList - ==> Parameters: 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文章目录导航 Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池...
摘要:下一篇介绍基于的服务注册与调用。服务提供者工程配置这里服务提供者是使用之前进阶教程第三篇整合连接池以及监控改造而来,这里一样的部分就不再重复说明,下面将说明新增的部分。 Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分...
阅读 3193·2021-11-18 10:02
阅读 3417·2021-10-11 10:58
阅读 3324·2021-09-24 09:47
阅读 1095·2021-09-22 15:21
阅读 3858·2021-09-10 11:10
阅读 3254·2021-09-03 10:28
阅读 1723·2019-08-30 15:45
阅读 2096·2019-08-30 14:22