一、生成
springboot選擇
spring-boot-starter-parent -> 2.2.11.RELEASE
java -> 1.8
mybatis-spring-boot-starter -> 2.1.4
mysql-connector-java -> 5.1.38
dependencies選擇
spring web
Mysql driver
Mybatis Framework
二、目錄
三、代碼
application.yml
services/SaleOrderService
package com.njbdqn.sales.services; import com.njbdqn.sales.dao.SaleOrderDAO; import com.njbdqn.sales.entity.SalesOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class SaleOrderService { @Autowired private SaleOrderDAO sodao; public List<SalesOrder> mypage(int page,int size){ Map map = new HashMap(); map.put("rows",(page-1)*size); map.put("pageSize",size); return sodao.findDataByRow(map); } }
entity/SalesOrder:實體類
public class SalesOrder { private int customer_sk; private int product_sk; private String d_date; private int paynum; private double paymoney; private int countnum; private double countmoney; => 這樣不好!實力類不要下划線! => 改成 private int customerSk; private int productSk; private String dDate; private int paynum; private double paymoney; private int countnum; private double countmoney;
dao/SaleOrderDAO
package com.njbdqn.sales.dao; import com.njbdqn.sales.entity.SalesOrder; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Map; public interface SaleOrderDAO { @Select("select customer_sk as customerSk,product_sk as productSk,paynum from dm_sales_order_count limit ${rows},${pageSize}") public List<SalesOrder> findDataByRow(Map map); }
controller/SaleCtrl
package com.njbdqn.sales.controller; import com.njbdqn.sales.entity.SalesOrder; import com.njbdqn.sales.services.SaleOrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("/sale") // 模塊名 public class SaleCtrl { @Autowired private SaleOrderService sos; @RequestMapping("/findSaleCount") //接口名 public List<SalesOrder> fsc(int page,int size){ return sos.mypage(page,size); } }
最外層啟動類:SalesApplication
@SpringBootApplication @MapperScan("com.njbdqn.sales.dao") public class SalesApplication { public static void main(String[] args) { SpringApplication.run(SalesApplication.class, args); } }
注意點:
- 實體類不允許寫下划線!!!!!
-
啟動類一定是最外邊的
- sql語句的空格問題
- @RestController => 產生json到前台,適用於ajax交互場景
- 掃描只能掃描dao的接口 @MapperScan("com.njbdqn.sales.dao")
四、訪問
http://localhost:8080/sale/findSaleCount?page=1&size=10
五、性能調優
測試以下接口性能,如瞬時負載測試:https://www.cnblogs.com/sabertobih/p/14105551.html
調優思路
1)連接池:使用Druid
pom中加入:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.14</version> </dependency>
application.yml改成:
spring:
datasource:
druid:
url: jdbc:mysql://192.168.56.111:3306/sales_source
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
initial-size: 20
min-idle: 20
max-active: 50
max-wait: 60000
test-on-borrow: true
pool-prepared-statements: true
use-global-data-source-stat: true
connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
2)SQL語句本身調優:EXPLAIN分析執行計划
3)更改MYSQL配置
4)MYSQL作為數據庫可能本身不合理 ——— MYSQL吞吐太慢!
考慮換一個數據庫:
-
- Redis:讀寫速度極快,性能極高,可以存JSON對象,相當於大HashMap
- mongoDB:面向文檔存儲,吞吐量也很變態
鑒於Redis優點,
>>> 把MYSQL數據遷移到Redis上,操作見:https://www.cnblogs.com/sabertobih/p/14101970.html
>>> SpringBoot暴露接口+Redis,操作見:https://www.cnblogs.com/sabertobih/p/14106243.html
>>> 再次使用Jmeter測試工具測接口響應速度,發現速度快了10倍!!!
但Redis缺點是:無法執行復雜查詢
結合Redis優缺點的解決方案:
1)使用MYSQL做復雜查詢,結果存放在Redis中用於大量高速讀寫
2)利用Redis做物理化標准索引表,詳見:https://www.cnblogs.com/sabertobih/p/14106031.html