一、MyBatis和druid簡介
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。國內最近流行的還有MyBatis-Plus,對Mybatis進行了增強,單表的增刪改查可以省略xml文件,本文不作MyBatis-Plus使用介紹。
Druid針對Oracle和MySql做了特別優化,比如Oracle的PSCache內存占用優化,MySql的ping檢測優化。Druid在監控、可擴展性、穩定性和性能方面都有明顯的優勢。Druid提供了Filter-Chain模式的擴展API,可以自己編寫Filter攔截JDBC中的任何方法,可以在上面做任何事情,比如說性能監控、SQL審計、用戶名密碼加密、日志等等。
二、准備數據庫
DROP DATBASE IF EXISTS test ; CREATE DATBASE test CHARACTER SET UTF8 ; CREATE TABLE user ( uid BIGINT AUTO_INCREMENT , `name` VARCHAR(50) not NULL, age TINYINT not NULL, PRIMARY KEY(uid) ) ; INSERT INTO user(`name`,age) VALUES ('小明',23) ; INSERT INTO user(`name`,age) VALUES ('小李',25) ; INSERT INTO user(`name`,age) VALUES ('小偉',26) ;
三、配置druid
1、添加依賴,修改pom.xml
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.4</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.5</version> </dependency>
2、配置yml
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource # 配置當前要使用的數據源的操作類型 driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驅動程序類 url: jdbc:mysql://47.52.199.52:3306/test?useUnicode=true&characterEncoding=utf8# 數據庫連接地址
username: test # 數據庫用戶名
password: Zhuxing520@ # 數據庫連接密碼
filer: wall,stat dbcp2: # 進行數據庫連接池的配置 min-idle: 5 # 數據庫連接池的最小維持連接數 initial-size: 5 # 初始化提供的連接數 max-total: 5 # 最大的連接數 max-wait-millis: 200 # 等待連接獲取的最大超時時間
3、測試類
@RunWith(SpringRunner.class) @SpringBootTest @WebAppConfiguration public class DemoApplicationTests {
@Resource
private DataSource dataSource;
@Test
public void testConnection() throws Exception {
System.out.println(this.dataSource);
}
}
四、配置Mybatis
1、添加mybatis依賴
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency>
2、配置yml
mybatis: config-location: classpath:mapper/mybatis.cfg.xml # mybatis配置文件所在路徑 type-aliases-package: com.example.demo.po # 定義所有實體類的別名所在包 mapper-locations: classpath:mapper/*Mapper.xml # 所有的mapper映射文件
3、Mybatis配置文件
mybatis.cfg.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 進行Mybatis的相應的環境的屬性定義 --> <settings> <!-- 在本項目之中開啟二級緩存 --> <setting name="cacheEnabled" value="true"/> </settings> </configuration>
4、UserMapper.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="com.example.demo.dao.UserDao"> <select id="findAll" resultType="UserPO"> SELECT * FROM user; </select> </mapper>
5、實體類UserPO.java
package com.example.demo.po; public class UserPO { private Long uid; private String name; private Integer age; public Long getUid() { return uid; } public void setUid(Long uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "UserPO{" + "uid=" + uid + ", name='" + name + '\'' + ", age=" + age + '}'; } }
6、mapp對應的接口Dao文件
package com.example.demo.dao; import com.example.demo.po.UserPO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserDao { public List<UserPO> findAll() ; }
7、測試類
@RunWith(SpringRunner.class) @SpringBootTest @WebAppConfiguration public class DemoApplicationTests { @Resource private UserDao userDao; @Test public void getAllUser(){ System.out.println(userDao.findAll()); } }
五、mybatis配置sql日志
1、引入依賴
在項目之中去引入 logback 的依賴程序文件:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
2、添加配置文件
將 logback.xml 配置文件拷貝到 src/main/resources 目錄之中
<?xml version="1.0" encoding="UTF-8" ?> <configuration scan="true"> <property name="APP" value="${project.artifactId}" /> <property name="LOG_HOME" value="/data/www/log/${APP}" /> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n</pattern> </encoder> </appender> <appender name="DETAIL" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false"> <File>${LOG_HOME}/${APP}_detail.log</File> <encoder> <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${APP}_detail.log.%d{yyyyMMdd}</fileNamePattern> </rollingPolicy> </appender> <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false"> <File>${LOG_HOME}/${APP}_access.log</File> <encoder> <pattern>%d{yy-MM-dd.HH:mm:ss.SSS};%X{ServiceId};%m%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${APP}_access.log.%d{yyyyMMdd}</fileNamePattern> </rollingPolicy> </appender> <logger name="ACCESS"> <appender-ref ref="ACCESS" /> </logger> <logger name="druid.sql.Statement" level="DEBUG" /> <logger name="com.example.demo.dao" level="TRACE" /> <root level="INFO"> <appender-ref ref="DETAIL" /> <appender-ref ref="CONSOLE" /> </root> </configuration>
添加sql打印:
<logger name="druid.sql.Statement" level="DEBUG" />
<logger name="com.example.demo.dao" level="TRACE" />
六、事務配置及用法
在需要的配置事務的方法上配置@Transactional
@Transactional public void addUser(){ UserPO userPO1 = new UserPO(); userPO1.setName("王小飛"); userPO1.setAge(24); userDao.save(userPO1); UserPO userPO2 = new UserPO(); userPO1.setName("王小飛1"); userPO1.setAge(24); userDao.save(userPO1); addUser1(); }
七、druid 監控
druid 數據庫連接池之所以使用非常廣泛,其最主要的原因在於它可以直接提供性能監控。那么本次來針對於當前已經實現好 的 druid 配置來進行性能監控的處理配置。
如果要想進行 Druid 的性能的監控操作,則需要做一些基礎配置,例如:你訪問的 IP 地址是否是白名單。
1、基礎配置類DruidConfig.java
package com.example.demo.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class DruidConfig { @Bean public ServletRegistrationBean druidServlet() { // 主要實現WEB監控的配置處理 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean( new StatViewServlet(), "/druid/*"); // 現在要進行druid監控的配置處理操作 servletRegistrationBean.addInitParameter("allow", "127.0.0.1,192.168.1.159"); // 白名單 servletRegistrationBean.addInitParameter("deny", "192.168.1.200"); // 黑名單 servletRegistrationBean.addInitParameter("loginUsername", "admin"); // 用戶名 servletRegistrationBean.addInitParameter("loginPassword", "123456"); // 密碼 servletRegistrationBean.addInitParameter("resetEnable", "false"); // 是否可以重置數據源 return servletRegistrationBean ; } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean() ; filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); // 所有請求進行監控處理 filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*"); return filterRegistrationBean ; } @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource druidDataSource() { return new DruidDataSource(); } }
2、運行測試
訪問http://localhost:8080/druid,使用admin,123456賬號密碼登陸

