這篇文篇將介紹,如何經過SpringBoot整合Druid數據庫連接池,實時監控數據庫連接信息,爲優化數據庫性能提供更好的指導,一樣將經過YML配置文件形式進行配置,方便簡潔。php
準備工做
環境:css
windows jdk 8 maven 3.0 IDEA
建立數據庫表
-- ---------------------------- -- 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');
構建工程
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>cn.zhangbox</groupId> <artifactId>spring-boot-study</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>cn.zhangbox</groupId> <artifactId>spring-boot-druid</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-boot-druid</name> <description>this project for Spring Boot</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <!-- 版本控制 --> <commons-lang3.version>3.4</commons-lang3.version> <commons-codec.version>1.10</commons-codec.version> <mybatis-spring-boot.version>1.2.0</mybatis-spring-boot.version> <lombok.version>1.16.14</lombok.version> <fastjson.version>1.2.41</fastjson.version> <druid.version>1.1.2</druid.version> </properties> <repositories> <!-- 阿里私服 --> <repository> <id>aliyunmaven</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> </repositories> <dependencies> <!-- mybatis核心包 start --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot.version}</version> </dependency> <!-- mybatis核心包 end --> <!-- SpringWEB核心包 start --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- SpringWEB核心包 end --> <!-- mysql驅動核心包 start --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- mysql驅動核心包 end --> <!-- sprigTest核心包 start --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- sprigTest核心包 end --> <!-- commons工具核心包 start --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>${commons-codec.version}</version> </dependency> <!-- commons工具核心包 end --> <!-- fastjson核心包 start --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <!-- fastjson核心包 end --> <!-- druid核心包 start --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <!-- druid核心包 end --> <!-- lombok核心包 start --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <!-- lombok核心包 end --> </dependencies> <build> <finalName>spring-boot-druid</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.4.RELEASE</version> </dependency> </dependencies> <configuration> <mainClass>cn.zhangbox.admin.SpringBootDruidApplication</mainClass> <jvmArguments>-Dfile.encoding=UTF-8 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 </jvmArguments> <executable>true</executable> <fork>true</fork> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>cn.zhangbox.admin.SpringBootDruidApplication</mainClass> <jvmArguments>-Dfile.encoding=UTF-8 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005</jvmArguments> <executable>true</executable> <fork>true</fork> </configuration> </plugin> </plugins> </build> </project>
注意:這裏引入了lombok
插件節省編寫實體類時候寫get
和set
方法,這裏在idea
中進行set
和get
操做須要下載lombok
插件,在設置頁面的plugins
中搜索lombok
插件在中央插件庫下載後重啓idea
便可,更詳細的lombok使用教程能夠查考:html
程序員DD的lombok系列教程:
修改YML配置
#公共配置 server: port: 80 tomcat: uri-encoding: UTF-8 spring: #激活哪個環境的配置文件 profiles: active: dev #鏈接池配置 datasource: 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: url: jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 #日誌 logging: config: classpath:log/logback.xml path: log/spring-boot-druid --- #測試環境配置 server: #端口 port: 80 spring: profiles: test # 數據源配置 datasource: url: jdbc:mysql://127.0.0.1:3306/spring-boot-druid?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 #日誌 logging: config: classpath:log/logback.xml path: /home/log/spring-boot-druid --- #生產環境配置 server: #端口 port: 8080 spring: profiles: prod # 數據源配置 datasource: url: jdbc:mysql://127.0.0.1:3306/spring-boot-druid?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true username: root password: 123456 #日誌 logging: config: classpath:log/logback.xml path: /home/log/spring-boot-druid
這裏進行了mybatis
整合,若是不會mybatis
整合能夠參考我寫的這篇文章:java
SpringBoot非官方教程 | 第六篇:SpringBoot整合mybatispython
建立日誌配置文件
在工程resources
文件夾下新建文件夾log
,並在該文件夾下建立logback.xml
文件,加入如下配置:mysql
<!-- Logback configuration. See http://logback.qos.ch/manual/index.html --> <configuration scan="true" scanPeriod="10 seconds"> <!--繼承spring boot提供的logback配置--> <!--<include resource="org/springframework/boot/logging/logback/base.xml" />--> <!--設置系統日誌目錄--> <property name="APP_DIR" value="spring-boot-druid" /> <!-- 彩色日誌 --> <!-- 彩色日誌依賴的渲染類 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> <!-- 彩色日誌格式 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!-- 控制檯輸出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <charset>UTF-8</charset> <!-- 此處設置字符集 --> </encoder> <!--此日誌appender是爲開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌信息--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>info</level> </filter> </appender> <!-- 時間滾動輸出 level爲 DEBUG 日誌 --> <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日誌文件的路徑及文件名 --> <file>${LOG_PATH}/log_debug.log</file> <!--日誌文件輸出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此處設置字符集 --> </encoder> <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 歸檔的日誌文件的路徑,例現在天是2017-04-26日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。 而2017-04-26的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 除按日誌記錄以外,還配置了日誌文件不能超過500M,若超過500M,日誌文件會以索引0開始, 命名日誌文件,例如log-error-2017-04-26.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>500MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日誌文件保留天數--> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 此日誌文件只記錄debug級別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 時間滾動輸出 level爲 INFO 日誌 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日誌文件的路徑及文件名 --> <file>${LOG_PATH}/log_info.log</file> <!--日誌文件輸出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此處設置字符集 --> </encoder> <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 歸檔的日誌文件的路徑,例現在天是2017-04-26日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。 而2017-04-26的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 除按日誌記錄以外,還配置了日誌文件不能超過500M,若超過500M,日誌文件會以索引0開始, 命名日誌文件,例如log-error-2017-04-26.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>500MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日誌文件保留天數--> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 此日誌文件只記錄info級別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 時間滾動輸出 level爲 WARN 日誌 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日誌文件的路徑及文件名 --> <file>${LOG_PATH}/log_warn.log</file> <!--日誌文件輸出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此處設置字符集 --> </encoder> <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 歸檔的日誌文件的路徑,例現在天是2017-04-26日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。 而2017-04-26的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 除按日誌記錄以外,還配置了日誌文件不能超過500M,若超過500M,日誌文件會以索引0開始, 命名日誌文件,例如log-error-2017-04-26.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>500MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日誌文件保留天數--> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 此日誌文件只記錄warn級別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 時間滾動輸出 level爲 ERROR 日誌 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日誌文件的路徑及文件名 --> <file>${LOG_PATH}/log_error.log</file> <!--日誌文件輸出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此處設置字符集 --> </encoder> <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 歸檔的日誌文件的路徑,例現在天是2017-04-26日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。 而2017-04-26的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 除按日誌記錄以外,還配置了日誌文件不能超過500M,若超過500M,日誌文件會以索引0開始, 命名日誌文件,例如log-error-2017-04-26.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>500MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日誌文件保留天數--> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 此日誌文件只記錄ERROR級別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>error</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <logger name="org.springframework.web" level="info"/> <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> <logger name="cn.zhangbox.springboot" level="debug"/> <!--開發環境:打印控制檯--> <springProfile name="dev"> <root level="info"> <appender-ref ref="CONSOLE" /> <appender-ref ref="DEBUG_FILE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="WARN_FILE" /> <appender-ref ref="ERROR_FILE" /> </root> </springProfile> <!--測試環境:打印控制檯和輸出到文件--> <springProfile name="test"> <root level="info"> <appender-ref ref="CONSOLE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="WARN_FILE" /> <appender-ref ref="ERROR_FILE" /> </root> </springProfile> <!--生產環境:輸出到文件--> <springProfile name="prod"> <root level="info"> <appender-ref ref="DEBUG_FILE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="ERROR_FILE" /> </root> </springProfile> </configuration>
注意::loback
配置文件中git
<logger name="cn.zhangbox.springboot" level="debug"/>
name
的屬性值必定要是當前工程的java
代碼的完整目錄,由於mybatis
打印的日誌級別是debug
級別的,所以須要配置debug
級別日誌掃描的目錄。程序員
建立Druid配置類
在工程java
代碼目錄下建立config
的目錄在下面建立DruidDBConfig
類加入如下代碼:web
@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()); Map<String, String> initParams = new HashMap<String, String>(); //忽略過濾的形式 initParams.put("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"); filterRegistrationBean.setInitParameters(initParams); //設置過濾器過濾路徑 filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } }
**注意:**這裏ServletRegistrationBean
配置bean中經過addInitParameter
設置了管控臺的用戶名密碼都是root
,能夠在這裏進行自定義配置也能夠將這裏的用戶名密碼經過轉移數據庫進行定製化配置實現。
建立實體
在工程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; }
建立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 { List<Student> studentList = 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; } }
建立Service
在工程java
代碼目錄下面建立service
目錄在下面建立StudentService
類加入如下代碼:
public interface StudentService { /** * 查詢全部的學生信息 * * @param sname * @param age * @return */ List<Student> getStudentList(String sname, Integer age); }
建立ServiceImpl
在工程java
代碼目錄下的service
的目錄下面建立impl
目錄在下面建立StudentServiceImpl
類加入如下代碼:
@Service("StudentService") @Transactional(readOnly = true, rollbackFor = Exception.class) public class StudentServiceImpl implements StudentService { @Autowired StudentDao studentDao; @Override public List<Student> getStudentList(String sname, Integer age) { return studentDao.getStudentList(sname,age); } }
建立Dao
在工程java
代碼目錄下建立dao
的目錄在下面建立StudentDao
類加入如下代碼:
public interface StudentDao { List<Student> getStudentList(@Param("sname")String sname, @Param("age")Integer age); }
建立Mapper映射文件
在工程resource
目錄下建立mapper
的目錄在下面建立StudentMapper.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="cn.zhangbox.springboot.dao.StudentDao" > <!-- 查詢全部的學生信息 --> <select id="getStudentList" resultType="cn.zhangbox.springboot.entity.Student"> SELECT s.sno, s.sname, s.sex, s.dept, s.birth, s.age FROM student s WHERE 1 = 1 <if test="sname != null"> and s.sname = #{sname} </if> <if test="age != null"> and s.age = #{age} </if> </select> </mapper>
建立啓動類
@SpringBootApplication @MapperScan("cn.zhangbox.springboot.dao")//配置mybatis接口包掃描 public class SpringBootDruidApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(SpringBootDruidApplication.class, args); } }
啓動項目進行測試:
控制檯打印
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.5.3.RELEASE) 2018-07-07 10:54:52.404 INFO 24084 --- [ main] c.z.s.SpringBootDruidApplication : Starting SpringBootDruidApplication on HP with PID 24084 (C:\Users\Administrator\Desktop\spring-boot-study\spring-boot-druid\target\classes started by Administrator in C:\Users\Administrator\Desktop\spring-boot-study) 2018-07-07 10:54:52.445 INFO 24084 --- [ main] c.z.s.SpringBootDruidApplication : The following profiles are active: dev 2018-07-07 10:54:52.570 INFO 24084 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@53142455: startup date [Sat Jul 07 10:54:52 CST 2018]; root of context hierarchy 2018-07-07 10:54:52.997 INFO 24084 --- [kground-preinit] o.h.validator.internal.util.Version : HV000001: Hibernate Validator 5.3.5.Final 2018-07-07 10:54:53.736 INFO 24084 --- [ 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-07 10:54:54.887 INFO 24084 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 2018-07-07 10:54:54.903 INFO 24084 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat 2018-07-07 10:54:54.905 INFO 24084 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.14 2018-07-07 10:54:55.123 INFO 24084 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2018-07-07 10:54:55.124 INFO 24084 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2554 ms 2018-07-07 10:54:55.522 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'statViewServlet' to [/druid/*] 2018-07-07 10:54:55.525 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2018-07-07 10:54:55.525 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'statViewServlet' to [/druid/*] 2018-07-07 10:54:55.526 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet statViewServlet was not registered (possibly already registered?) 2018-07-07 10:54:55.531 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2018-07-07 10:54:55.531 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2018-07-07 10:54:55.532 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2018-07-07 10:54:55.533 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2018-07-07 10:54:55.533 INFO 24084 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'webStatFilter' to urls: [/*] 2018-07-07 10:54:57.216 INFO 24084 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@53142455: startup date [Sat Jul 07 10:54:52 CST 2018]; root of context hierarchy 2018-07-07 10:54:57.322 INFO 24084 --- [ 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-07 10:54:57.326 INFO 24084 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2018-07-07 10:54:57.328 INFO 24084 --- [ 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-07 10:54:57.376 INFO 24084 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-07-07 10:54:57.376 INFO 24084 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-07-07 10:54:57.451 INFO 24084 --- [ 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-07 10:54:58.066 INFO 24084 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2018-07-07 10:54:58.068 INFO 24084 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'statFilter' has been autodetected for JMX exposure 2018-07-07 10:54:58.069 INFO 24084 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure 2018-07-07 10:54:58.077 INFO 24084 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.alibaba.druid.spring.boot.autoconfigure:name=dataSource,type=DruidDataSourceWrapper] 2018-07-07 10:54:58.081 INFO 24084 --- [ 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-07 10:54:58.101 INFO 24084 --- [ main] o.a.coyote.http11.Http11NioProtocol : Initializing ProtocolHandler ["http-nio-8080"] 2018-07-07 10:54:58.118 INFO 24084 --- [ main] o.a.coyote.http11.Http11NioProtocol : Starting ProtocolHandler ["http-nio-8080"] 2018-07-07 10:54:58.145 INFO 24084 --- [ main] o.a.tomcat.util.net.NioSelectorPool : Using a shared selector for servlet write/read 2018-07-07 10:54:58.172 INFO 24084 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2018-07-07 10:54:58.179 INFO 24084 --- [ main] c.z.s.SpringBootDruidApplication : Started SpringBootDruidApplication in 7.666 seconds (JVM running for 10.386) 2018-07-07 11:00:00.245 INFO 24084 --- [nio-8080-exec-5] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet' 2018-07-07 11:00:00.246 INFO 24084 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2018-07-07 11:00:00.302 INFO 24084 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 56 ms 2018-07-07 11:00:01.606 INFO 24084 --- [nio-8080-exec-5] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
瀏覽器請求測試
本地日誌打印效果
2018-07-07 10:54:52.439 [main] DEBUG cn.zhangbox.springboot.SpringBootDruidApplication - Running with Spring Boot v1.5.3.RELEASE, Spring v4.3.8.RELEASE 2018-07-07 11:00:01.715 [http-nio-8080-exec-5] DEBUG c.z.springboot.dao.StudentDao.getStudentList - ==> Preparing: SELECT s.sno, s.sname, s.sex, s.dept, s.birth, s.age FROM student s WHERE 1 = 1 2018-07-07 11:00:01.881 [http-nio-8080-exec-5] DEBUG c.z.springboot.dao.StudentDao.getStudentList - ==> Parameters: 2018-07-07 11:00:01.931 [http-nio-8080-exec-5] DEBUG c.z.springboot.dao.StudentDao.getStudentList - <== Total: 2
這裏使用logback
配置中將不一樣級別的日誌設置了在不一樣文件中打印,這樣很大程度上方便項目出問題查找問題。
Druid管控臺
源碼地址
Spring Boot整合Druid鏈接池以及Druid監控
寫在最後
歡迎關注、喜歡、和點贊後續將推出更多的spring cloud
教程,敬請期待。 歡迎關注個人微信公衆號獲取更多更全的學習資源,視頻資料,技術乾貨!
公衆號回覆「學習」,拉你進程序員技術討論羣,乾貨資源第一時間分享。
公衆號回覆「視頻」,領取800GJava視頻學習資源。
公衆號回覆「全棧」,領取1T前端,Java,產品經理,微信小程序,Python等資源合集大放送。
公衆號回覆「慕課」,領取1T慕課實戰學習資源。
公衆號回覆「實戰」,領取750G項目實戰學習資源。
公衆號回覆「面試」,領取8G面試實戰學習資源。