【優雅寫程式碼系統】springboot+mybatis+pagehelper+mybatisplus+druid教你如何優雅寫程式碼
阿新 • • 發佈:2020-06-11
[TOC]
> springboot 融合了很多外掛。springboot相比spring來說有一下有點
- 自動配置: 針對很多spring的應用程式,springboot提供了很多自動配置
- 起步依賴: 告訴springboot你需要什麼,他就會引入需要的庫
- 命令列介面:springboot的可選特性
- Autuator: 監控springboot專案的執行情況
# spring基本搭建
- springboot的配置很簡單。在pom中繼承springboot的pom .然後依賴一下pom就可以繼承所需的jar了
```xml
org.springframework.boot
spring-boot-starter-parent
2.0.3.RELEASE
```
```xml
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
```
- 出了jar外。我們pom中配置一個外掛就行了
```xml
org.springframework.boot
spring-boot-maven-plugin
```
# 整合mybatis
【詳見feature/0002/spring-mybatis 分支】
- 之前我們梳理過mybatis的執行機制及注意點。javaweb的開發時離不開spring的。一個完整的框架是離不開spirng的。所以spring整合mybatis勢在必行。我們下面實現如何在spring下融合mybatis及其優秀的一些外掛搭建架構
# pom配置
- 我們在springboot專案的pom中繼續新增我們mybatis的jar就完成了第一步。
- 一個是mybatis與spring的整合jar 。 開啟springboot載入mybatis專案
- 一個是spring的aopjar包。主要是實現mybatis的事務問題
- 一個是mysql的jar包。這裡主要看你自己的需求。如果你的專案中使用oracle那麼久加入oracle的座標就行了
- druid是管理資料的資料來源
```xml
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
org.springframework.boot
spring-boot-starter-aop
mysql
mysql-connector-java
com.alibaba
druid
1.1.10
```
# mybatis配置
- 上面的pom設定已經準備了mybatis開發階段的基本jar。 有了上述的包就可以搭建mybatis . 正常我們在我們的springboot專案中配置一個bean配置的類 `MybatisConfig`
## 設定資料來源
```java
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource primaryDataSource() {
// 這裡為了演示,暫時寫死 。 實際上是可以通過autoConfigure裝配引數的
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://192.168.44.130:3306/others?useUnicode=true&characterEncoding=utf8");
return dataSource;
}
```
- 在springboot中我們只需要在方法上新增`Bean`註解,就相當於我們在spring的xml中配置的bean標籤。在java程式碼中我們可以進行我們業務處理。個人理解感覺更加的可控。 因為我們使用的mysql。所以這裡我們簡單的使用druid的資料來源
## 設定sqlsessionfactory
```java
@Bean
public SqlSessionFactory primarySqlSessionFactory() {
SqlSessionFactory factory = null;
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(primaryDataSource());
sqlSessionFactoryBean.setConfigLocation(new DefaultResourceLoader().getResource("classpath:mybatis-primary.xml"));
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/com/github/zxhtom.**./*.xml"));
factory = sqlSessionFactoryBean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return factory;
}
```
- 在mybatis中sqlsesson是我們操作資料庫最直接的java類。管理sqlsession就是上面的sqlsessionFactory 。 所以我們配置它也是必須的。因為和spring整合。Mybatis的SqlsessionFactory交由給spring的SqlsessionfactoryBean管理。所以我們先構建SqlSessionFactoryBean。然後配置必須的資料來源、Configuration、mybatis的xml路徑等等資訊
- SqlSessionFactoryBean 設定出了spring的FactoryBean屬性意外。最重要的是可以設定Mybatis的sqlsessionfactory的屬性。上面我們只是簡單的設定了。後期可以根據架構的需求進行不斷的完善。
- 可以設定外掛、快取、別名、對映處理器、事務、環境等等所有mybatis的配置
## 設定掃描
```java
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactory(primarySqlSessionFactory());
//每張表對應的*.java,interface型別的Java檔案
mapperScannerConfigurer.setBasePackage("com.github.zxhtom.**.mapper");
return mapperScannerConfigurer;
}
```
- springboot 中我們的mapper介面也是交由spring來掃描的。之前mybatis程式我們是一個一個手動加入的。spring的特性可以直接掃描指定路徑的所有java類。這裡我們就設定了一下mapper的路徑。
## 設定開啟事務
- 優秀的架構沒有事務是能使用的。我們配置事務也是很簡單的。在springboot中我們推薦使用java程式碼來配置事務的。下面的配置我們為了容易閱讀。配置在TransactionConfig類中
```java
@Bean
public DataSourceTransactionManager primaryTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
```
- 首先是配置事務管理器。事務管理的是資料來源。所以這裡我們需要將MybatisConfig中的DataSource載入進來。這裡不多說
- 然後配置我們的通知點
```java
@Bean
public TransactionInterceptor txAdvice() {
DefaultTransactionAttribute txAttr_REQUIRED = new DefaultTransactionAttribute();
txAttr_REQUIRED.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
DefaultTransactionAttribute txAttr_REQUIRED_READONLY = new DefaultTransactionAttribute();
txAttr_REQUIRED_READONLY.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
txAttr_REQUIRED_READONLY.setReadOnly(true);
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
source.addTransactionalMethod("add*", txAttr_REQUIRED);
source.addTransactionalMethod("save*", txAttr_REQUIRED);
source.addTransactionalMethod("delete*", txAttr_REQUIRED);
source.addTransactionalMethod("update*", txAttr_REQUIRED);
source.addTransactionalMethod("exec*", txAttr_REQUIRED);
source.addTransactionalMethod("set*", txAttr_REQUIRED);
source.addTransactionalMethod("get*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("query*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("find*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("list*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("count*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("is*", txAttr_REQUIRED_READONLY);
return new TransactionInterceptor(primaryTransactionManager(), source);
}
```
- 最後我們配置一下我們的切面、切點
```java
@Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
}@Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
}
```
- 最後說明下。TransactionConfig這個類因為配置事務、攔截所以我們需要加入如下註解在雷傷
```java
@Configuration
@Aspect
@EnableTransactionManagement
```
## 資源放行
- 以上就是mybatis基本的一個配置了。但是這個時候還是不能使用的。因為我們的mapper對應的xml是放在java目錄下的。正常src下都是java。xml檔案在maven編譯時不放行的。我們需要特殊處理下
- 在pom的build下加入放行配置
```xml
src/main/java
**/*.xml
**/*.properties
**/*.yaml
true
src/main/resources
**/*.*
false
```
- 加入如下配置後別忘記了clean一下在執行。防止快取。clean之後看看target下檔案
![](http://oytmxyuek.bkt.clouddn.com/20200610001.jpg)
## 測試
- 為了方便測試我們需要編寫測試類。
```java
@SpringBootTest(classes = Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestDataSource {
@Autowired
private TestMapper testMapper;
@Test
public void test() {
List