在創建項目之前先說一下ide的問題,從學習軟件開始一直到一個月之前,開發用的IDE都是Eclipse,對,就是這個遠古時代的開發工具,在使用過程中雖然總是遇到各種bug,但內心里還是存在着一絲理解的想法的,因為自己寫的代碼也會存在很多bug,有些甚至很低端,所以開發工具存在問題也是有情可原的。而且還免費,還要什么自行車呢?但是最近工作中發現同事里大部分都在用Idea,雖然只是開發工具的不同而已,不過在具體使用的過程中還是存在很多問題的,比如:由於開發工具的驗證方式不同,很多在Eclipse中寫的代碼沒有問題,但是到了Idea中就會出現檢查異常,最簡單的例子,在eclipse中的這段代碼就是沒有問題的,但是到了Idea中就會存在問題。
所以為了工作順利,果斷跳入Idea的坑。因此,這里的項目開發工具也是Idea,下面進入正題。
之前說過,這個項目使用Springboot框架整合Mybatis,數據庫使用mysql,是一個典型的springboot項目。除了典型的mysql、mybatis、web等依賴之外還加了lombok這個依賴,很實用。
一路下一步直到項目創建完成。完成之后打開pom文件,添加數據庫連接池驅動,這里實用阿里的druid連接池。代碼如下:
<?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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.hatten</groupId> <artifactId>hihi-video</artifactId> <version>0.0.1-SNAPSHOT</version> <name>hihi-Video</name> <description>a video website like bilibili</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
這里需要注意:依賴文件的版本一定要合適,尤其是MySQL數據庫版本、druid、mybaits、jdbc的版本一定要合適,自己當時創建項目的時候就因為版本的問題,搞了好長時間。所以項目創建完成之后一定要及時做測試,發現問題及時解決。
准備工作完成,可以着手寫代碼了。
第一步:創建Application啟動類,這也是SpringBoot相比於傳統的Spring框架的優勢,直接一個main方法啟動,不需要再配置Tomcat了,因為springboot內集成了一個Tomcat,所以也就不會出現之前的寫了代碼沒編譯、即使編譯了也沒部署Tomcat直接走緩存的情況。
package com.hatten.hihivideo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.hatten.hihivideo.dao") @SpringBootApplication public class HiHiVideoApplication { public static void main(String[] args) { SpringApplication.run(HiHiVideoApplication.class, args); } }
這是一個典型的springboot整合mybatis的啟動類,其中@SpringBootApplication注解是在springboot2.0中出現的注解,表示這是一個啟動類也是一個配置類。@MapperScan包掃描注解,功能相當於配置文件中的包掃描,用於標注mapper或者稱為dao接口的包路徑,可以配置多個,需要用“,”隔開。也可以不適用這個注解,但需要在每一個dao接口上加一個@Mapper注解,表示這是一個交給Spring管理的Bean,這里為了省事直接用包掃描。
第二步:在java下創建controller、service、dao、entity、utils幾個包,分別用於存放*Controller類、*Service類、*Dao接口、實體類、工具類。在resources下新建mapper目錄,用於存放*Dao.xml文件,目錄結構如下:
這里需要注意:Application啟動類一定要放在最外層目錄,這樣整個項目才能啟動起來。
第三步:編輯application.properties文件,這是springboot項目中唯一的配置文件,所有的配置都會放在這個文件中,當然如果配置日志或者其他功能也可以通過添加相應的配置文件的方式實現。application也可以通過yml文件的形式配置,只是形式上的不同,每有太大差別。配置文件如下:
server.port=8080 server.servlet.context-path=/ #配置數據源 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/hihi_video?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT spring.datasource.username=root spring.datasource.password=root #配置靜態資源存放路徑 spring.resources.static-locations=classpath:/static/ #配置mapper.xml文件路徑 mybatis.mapper-locations=classpath:/mapper/*.xml #下划線對應駝峰規則 mybatis.configuration.map-underscore-to-camel-case=true
在這個階段需要配置的東西不是很多,主要配置Tomcat端口號、訪問路徑,數據源,mapper文件路徑,靜態資源路徑即可,也可以配置mybatis的下划線駝峰對應規則,用於將數據庫中的字段名和實體類中的屬性名一一對應。
第四步:創建測試類,包括(測試Controller、測試Service、測試Dao、測試實體類、測試mapper.xml文件、測試html文件),分別測試頁面跳轉和數據傳遞功能。代碼如下:
①Controller類:
package com.hatten.hihivideo.controller; import com.hatten.hihivideo.entity.vo.SysResultVo; import com.hatten.hihivideo.service.TestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/test") public class TestController { @Autowired private TestService testService; /** * 測試頁面跳轉 * @return */ @RequestMapping("/page") public String pageTest(){ return "/page/page-test.html"; } /** * 測試數據傳輸 * @return */ @RequestMapping("/get/json") @ResponseBody public SysResultVo getJsonResult(){ return SysResultVo.ok(testService.getJsonResult()); } }
②Service類:
package com.hatten.hihivideo.service; import com.hatten.hihivideo.dao.TestDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class TestService { @Autowired private TestDao testDao; public List getJsonResult(){ List demos=testDao.getJsonResult(); return demos; } }
③Dao接口:
package com.hatten.hihivideo.dao; import org.springframework.stereotype.Component; import java.util.List; @Component public interface TestDao { List getJsonResult(); }
④mapper.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.hatten.hihivideo.dao.TestDao"> <select id="getJsonResult" resultType="com.hatten.hihivideo.entity.HiHiDemo"> select * from hihi_demo </select> </mapper>
⑤實體類:
package com.hatten.hihivideo.entity;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data //省略無參構造、get、set方法
@Accessors(chain = true) //鏈式結構
public class HiHiDemo implements Serializable {
private Integer demoId;
private String demoName;
private String demoDesc;
}
在這里可以看到引入lambok的優勢,不用在寫大段的get和set方法,而且能使用鏈式結構,讓代碼十分簡潔。
⑥html文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Page-Test</title> </head> <body> <h1>Page-Test</h1> <p>This is a page-test-html</p> </body> </html>
第五步:到這里就可以開始測試了,啟動application類,在瀏覽器輸入相應地址進行測試,測試結果如下:
啟動成功!!!!!!!
頁面正常訪問!!!!!!!!!!!!
數據傳輸正常!!!!!!!!!!!!!!!!!!!!!!!!!
對了,應該還需要驗證一下數據庫中的數據是什么樣的才對:
數據也沒有問題,項目環境搭建成功!!!!之后就可以着手開發了。。。。這才剛剛是個開始,而已。
============================分割線,以下有知識點=====================================
關於代碼中的SysResult類,它的作用就是向前端頁面傳遞數據,對數據進行一次封裝,並加入一些狀態信息或者消息,方便前后端交互用的。在實際開發過程中每個公司應該都會使用自己公司的代碼,我的代碼是這樣的,可以當做參考:
package com.hatten.hihivideo.entity.vo; import java.io.Serializable; public class SysResultVo implements Serializable { private static final long serialVersionUID = -7368493786259905794L; /** * 狀態碼 */ private int state = 1;//1-OK,0-Error /** * 狀態碼對應的消息 */ private String message = "OK"; /** * 要呈現到客戶端的數據 */ private Object data; public SysResultVo() { } public SysResultVo(String message) { this.message = message; } public SysResultVo(Object data) { this.data = data; } public SysResultVo(Throwable e) { this.state = 0; this.message = e.getMessage(); } public int getState() { return state; } public void setState(int state) { this.state = state; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } /** * 靜態方法,用於返回正確數據 * @param data * @return */ public static SysResultVo ok(Object data){ return new SysResultVo(data); } /** * 靜態方法,用於返回錯誤信息 * @param msg * @return */ public static SysResultVo fail(String msg){ SysResultVo result=new SysResultVo(); result.setState(0); result.setMessage(msg); return result; } }
=======================代碼已更新至GitHub,並持續更新==========================
https://github.com/Mysterious-gt/HiHi-Video.git