Spring Cloud + Vue前后端分離-第3章 SpringBoot項目技術整合
3-1 集成持久層框架Mybatis
ORM:對象關系映射,Hibernate是全自動ORM,Mybatis是半自動ORM,Mybatis可以操作的花樣更多,是首選的持久層框架
System模塊集成Mybatis框架
utf8是三個字節,支持的字符有限。MySQL在5.5.3之后增加了這個utf8mb4的編碼,支持更多字符,例如emoji小表情。
數據庫準備工作2: 創建courseimooc數據庫專用的用戶,用戶名可以叫courseimooc或其他
在實際開發中,我們會創建不同權限的用戶,比如只能查詢數據,或者只能做增刪改查??
生成的sql語句
GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create View, Delete, Drop, Event, Execute, Grant Option, Index, Insert, Lock Tables, References, Select, Show View, Trigger, Update ON `courseimooc`.* TO `courseimooc`@`localhost`;
修改一下名稱,說明只能本機訪問?
雙擊courseimooc@localhost,這個報錯先不理會
進入courseimooc,新建一張表
現在 關閉連接,再打開,就不會報錯了!
1.集成mybatis框架,啟動成功
Maven父子模塊增加jar包依賴: 先在父pom.xml中增加jar包依賴,再在子pom.xml中增加jar包依賴,子pom.xml中不帶版本號
?
選中這個單詞,Alt + 回車 ,然后點擊Save 'courseimooc' to dictionary?
Alt+Enter可以幫助解決大多數的錯誤報警等
單詞就不會出現波浪線
如果啟動報錯,加上spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Mybatis使用示例
#增加TestMapper.xml,放在 reources/mapper目錄下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.course.system.mapper.TestMapper"><select id="list" resultType="com.course.system.domain.Test">select `id`,`name` from`test`</select>
</mapper>
application.properties
spring.application.name=system
server.servlet.context-path=/system
server.port=9001
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/#增加數據庫連接
spring.datasource.url=jdbc:mysql://localhost:3306/courseimooc?characterEncoding=UTF8&autoReconnect=true
spring.datasource.username=courseimooc
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Drivermybatis.mapper-locations=classpath:/mapper/*.xml
TestController.java
package com.course.system.controller;import com.course.system.domain.Test;
import com.course.system.service.TestService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;@RestController
public class TestController {@Resourceprivate TestService testService;@RequestMapping("/test")public List<Test> test(){return testService.list();}
}
Test.java
?TestMapper.java
package com.course.system.mapper;import com.course.system.domain.Test;import java.util.List;public interface TestMapper {public List<Test> list();
}
TestService.java
package com.course.system.service;import com.course.system.domain.Test;
import com.course.system.mapper.TestMapper;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;
@Service
public class TestService {@Resourceprivate TestMapper testMapper;public List<Test> list(){return testMapper.list();}
}
SystemApplication.java
package com.course.system;import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.core.env.Environment;@SpringBootApplication
@EnableEurekaClient
@MapperScan("com.course.system.mapper")
public class SystemApplication {private static final Logger logger = LoggerFactory.getLogger(SystemApplication.class);public static void main(String[] args) {SpringApplication app = new SpringApplication(SystemApplication.class);Environment env = app.run(args).getEnvironment();logger.info("啟動成功!!");logger.info("System地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));}}
1.mybatis使用示例: http://127.0.0.1:9001/system/test
2.增加了三層結構
3-2 項目優化
idea數據庫插件的使用
1.使用database關聯數據庫
?如果不成功,可能是時區的問題,在Advanced中找到serverTimezone設置為UTC
UTC代表的是全球標準時間,如果要用北京時間,可以填Asia/Shanghai
這樣就說明創建好了
?
2.新增數據庫腳本?
設置了idea關聯數據庫后,所有的腳本都可以在idea直接執行,相當于把開發和運維關聯起來了。
集成熱部署DevTools
idea+DevTools熱部署
第1步:增加devtools依賴
第2步:Ctrl+Alt+S 打開設置窗口,編寫代碼時,自動編譯勾選上
勾選Advanced Settings中的Allow auto-make to start even if developed application is currently running?
?然后自己進行測試一下,應該是已經可以了
熱部署的時間會比正常啟動更快,隨著業務的增加,啟動時間會變長,這個差距會越明顯
優化mybatis日志
3-3 搭建服務模塊-server
業務擴展后,需要對表加一個字段,這時,如果要保持實體類和表結構一致,則所有模塊的實體都要改,費時費力
如果采取的策略是,哪個模塊用到新的字段,就改哪實體類,時間長了,所有的實體類和表都對應不上,并且這種策略不能用mybatis代碼生成器
新建公共模塊-server
<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>com.course</groupId><artifactId>course</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.course</groupId><artifactId>server</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><dependencies><!-- 熱部署DevTools --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><!-- 集成mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>
system集成server模塊
總的pom.xml包下加入server依賴
?
重新啟動
集中配置
server作為jar包被依賴,它的resources下的配置文件會和system下的配置文件沖突
spring默認也會讀resources/config下的配置文件
1.將用的配置移動到server
注:server配置文件的路徑要放在resources/config/application.properties,不能和上層的路徑一樣放在resoures根目錄下
3-4 集成mybatis generator
idea集成mybatis generator生成mybatis代碼
步驟1:父pom.xml里增加mybatis-generator插件
這個插件需要連接數據庫獲得表結構,所以需要加驅動包依賴
步驟2:添加配置文件generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat"><!--反引號``:如果表名或者字段名是mysql的關鍵學比如table,from等,這時可以加上反引號,比如:select `date` from `from`--><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/><!-- 生成的實體類添加toString()方法 --><plugin type="org.mybatis.generator.plugins.ToStringPlugin" /><!-- 不生成注釋 --><!-- 默認自動生成的代碼會有一堆英文注釋,大家可以把這段刪除試試--><commentGenerator><property name="suppressAllComments" value="true"/></commentGenerator><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/courseimooc?serverTimezone=Asia/Shanghai"userId="courseimooc"password="courseimooc"></jdbcConnection><!-- domain類的位置 --><javaModelGenerator targetProject="src\main\java"targetPackage="com.course.server.domain"/><!-- mapper xml的位置 --><sqlMapGenerator targetProject="src\main\resources"targetPackage="mapper"/><!-- mapper類的位置 --><javaClientGenerator targetProject="src\main\java"targetPackage="com.course.server.mapper"type="XMLMAPPER" /><!-- type="XMLMAPPER" 有三種生成方式:ANNOTATEDMAPPER(生成的SQL全部在Java中),MIXEDMAPPER (SQL部分在Java中,部分在XML中),XMLMAPPER (生成的SQL全部在XML中)推薦使用: XMLMAPPER,將Java代碼與SQL代碼分離--><table tableName="test" domainObjectName="Test"/></context>
</generatorConfiguration>
步驟3:創建maven啟動命令mybatis-generator:generate -e
generatorConfig.xml是放在server模塊下,所以這里選擇server目錄?
紅色:新文件未交給git管理(未add,未commit);
綠色:已交給git管理未提交(已add,未commit);
藍色:有修改未提交;灰色:已刪除未提交
這些是新生成的
解決mapper.xml重復生成代碼的問題
1.解決mapper.xml重復生成代碼的間題<plugin type="org.mybatis.generator.plugins.UnmergeableXmMappersPlugin”/>
業務擴展,表結構發生變動時,需要重新生成持久層代碼。這對編碼有一個要求:生成器生成的四個文件絕對不可以手動修改。后續會再做說明
低端的解決方法:每次手動刪除xml,再執行生成命令。
更好的方法:
<!--覆蓋生成XML文件-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
舊版本解決方案:自己寫Java類,用來啟動生成器,而不是用Maven命令啟動。在java類里刪除表xmI文件,再執行生成代碼
原來的xml會被覆蓋,所以絕對不要在生成的xml手動修改代碼,因為下次再生成時,手動修改的代碼會被覆蓋掉
example使用示例
通過Example,可以幫我們寫入where,order by,distinct等,需要熟練掌握,可以極大提高單表的開發效率
啟動EurekaApplication、SystemApplication
小技巧:Ctrl+Alt+V,快速生成個變量
根據id升序asc
根據id降序desc
要按多個條件查詢的話,在表達式的后面繼續.andXXX,后續會再作介紹
??是jdbc占位符,可用于防注入攻擊。mybatis底層也是idbc實現的
使用Example可以快速完成單表的增刪改查,熟練掌握后對代碼開發效率將有一個質的飛躍?