目錄html
從SSM(spring spring MVC mybatis)到spring bootjava
本文前置知識點,spring, mybatis, tomcat等,這部分細節不在細講mysql
spring是一個你們族,spring MVC, spring boot都是其中的一部分web
其中spring 提供了著名的IOC 和 AOPspring
IOC就是所謂控制反轉,我要一個類,我不去本身new,而去拿一個,這樣咱們就能夠中框架的自動裝配或者是xml配置下降耦合,提升效率。sql
AOP是面向切面編程,一種編程思路,咱們須要修改沒寫邏輯不去修改代碼,而是添加執行該函數前作什麼。減小對原代碼的修改需求。數據庫
spring MVC是一個web模塊,在原來的SSM框架中,用戶瀏覽器請求,交給spring MVC處理,返回頁面。而如何處理,咱們單獨出來一個業務層。這部分來寫咱們的邏輯代碼。apache
而業務層又但願不用管數據庫相關的問題,就多出了一個dao層,也就是數據可持久化層。編程
而spring boot視乎只是代替了原SSM層中 spring MVC的做用。他們對業務的抽象是同樣的。瀏覽器
首先我須要準備
打開網站後填寫信息,在右側依賴添加
Web, DevTools, Aspects, Thymeleaf, Mysql, MyBatis
DevTools:熱部署
Thymeleaf: 一種控制器數據交互方式
Mysql,MyBatis 數據庫依賴
點擊建立後,會自動下載一個包,用IDEA打開包裏面的pom.xml便可打開項目
等待項目加載。。。
初始目錄以下
cwl@cwl-PC:~/web/spring boot init$ tree . ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── example │ │ └── demo │ │ └── DemoApplication.java │ └── resources │ ├── application.properties │ ├── static │ └── templates └── test └── java └── com └── example └── demo └── DemoApplicationTests.java 14 directories, 6 files
wenda數據庫下的test表 +----------+----------+ | username | password | +----------+----------+ | cwl | cwl | +----------+----------+
最終咱們須要實現一個頁面訪問數據庫的過程
用戶發起瀏覽器請求頁面,被咱們交給控制器處理
咱們添加項目結構文件夾
咱們在main.java.com.example.demo目錄下建立四個文件夾
controller
dao
model
service
在main.resources下建立文件夾mapper後面放咱們的映射文件
controller是咱們的控制器,咱們在controller目錄下建立一個類
MainController表明咱們的主頁控制器
一個普通的類,咱們須要在類上面添加註解@Controller
而後編寫一個方法,getMainWeb以下
MainController.java
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @RequestMapping(path = "/", method = RequestMethod.GET) @ResponseBody public String getMainWeb() { return "main"; } }
@Controller表明咱們這是一個控制器
@RequestMapping(path = "/", method = RequestMethod.GET)
表明咱們瀏覽器訪問「/"路徑會被交給這個方法
@ResponseBody 表示返回的是字符串。也就是頁面的字符串,
到這裏咱們已經配置完頁面了,都是因爲咱們引入了數據庫模塊,可是咱們沒有配置數據庫,依舊跑步起來。因此咱們作先在appilcation.properties下填上一下內容,具體須要配置成你本地的參數
# mysql 配置 # 數據庫配置 wenda是數據庫的名字 spring.datasource.url=jdbc:mysql://localhost/wenda spring.datasource.username=root spring.datasource.password=1143316492 ## Mybatis 配置 # model要改爲模型的包 # 映射的包 mybatis.typeAliasesPackage=com.webdemo.demo.model mybatis.mapperLocations=classpath:mapper/*.xml
數據庫部分咱們先放一邊,這麼作只是爲了框架不報錯
這樣運行項目輸入localhost:8080 就能訪問到一個只有」main「字符串的頁面,咱們能夠吧main換成html代碼的字符串,當時這樣未免太麻煩了。
因而:
咱們在resources目錄下templates建立home.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Home</title> </head> <body> <h1>This is home pages</h1> </body> </html>
MainController.java
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @RequestMapping(path = "/", method = RequestMethod.GET) //@ResponseBody public String getMainWeb() { return "home"; } }
注意上面咱們註釋掉的部分,那部分的註釋咱們是告訴框架咱們返回的是字符串,去掉後,框架就會去templates下面去找home文件。前綴後綴的具體細節能夠在application.properties裏面配置。
到這裏咱們解決了Controller層的問題。
另外還有一些Controller層的細節
如何交互數據,這裏咱們用的是thymeleaf模板的內容
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @RequestMapping(path = "/", method = RequestMethod.GET) //@ResponseBody public String getMainWeb(Model model) { model.addAttribute("message", "this is main page"); return "home"; } }
咱們修改MainController的內容,注意咱們添加了一個參數列表,調用了一個addAttribute.這個意思是咱們加入了一個映射,在頁面中咱們去message的值會編程後面那個字符串。具體怎麼取,就是thymeleaf的定義了,咱們在html頁面中修改
<h1 th:text="${message}"></h1>
這樣控制層和頁面的數據交互解決了。更多細節咱們去查那個框架便可。
數據訪問層,dao層,有人人用mapper層,實際上是一個意思,爲了方便,咱們演示的時候直接從控制層調用數據庫部分
咱們添加模型類User數據,放在model文件夾下,類型根據咱們的數據庫來,這部分是Mybatis的知識,這裏不在贅述。
package com.example.demo.model; public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
在dao目錄下咱們建立UserDao的接口
package com.example.demo.dao; import com.example.demo.model.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; @Mapper @Repository public interface UserDao { @Select({"select username, password from test where username = #{name}"}) User getUserByUsername(String name); }
一些註解的說明
@Component ——表示一個自動掃描 component @Repository ——表示持久化層的 DAO component @Service ——表示業務邏輯層的 Service component @Controller ——表示表示層的 Controller component
@Mapper通過個人測試無效,不知道什麼回事,若是隻這樣寫會加載不到這個bean
另外一種解決方法是在入口處手動配置
package com.example.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.demo.dao") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
上面的@MapperScan
而後在Controller層
package com.example.demo.controller; import com.example.demo.dao.UserDao; import com.example.demo.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @Autowired UserDao userDao; @RequestMapping(path = "/", method = RequestMethod.GET) public String getMainWeb(Model model) { User user = userDao.getUserByUsername("cwl"); System.out.println(user.getUsername() + " " + user.getPassword()); return "home"; } }
上面的userDao是一個接口,可是咱們的框架會給咱們自動裝載爲bean
@Selcet替咱們實現方法,可是更復雜的部分須要用mapper手動寫
咱們註釋掉剛剛的@select
在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.example.demo.dao.UserDao"> <resultMap id="userResultMap" type="com.example.demo.model.User"> <result column="username" property="username" /> <result column="password" property="password" /> </resultMap> <select id="getUserByUsername" parameterType="com.example.demo.model.User" resultMap="userResultMap"> select * from test where username = #{name} </select> </mapper>
到這裏咱們核心問題都解決了,上面咱們雖然經過controller調用dao層,可是核心已經出來了,添加業務中間層已經不是框架的問題了,不在細講了。
最後項目結構
. ├── demo.iml ├── mvnw ├── mvnw.cmd ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └── demo │ │ │ ├── controller │ │ │ │ └── MainController.java │ │ │ ├── dao │ │ │ │ └── UserDao.java │ │ │ ├── DemoApplication.java │ │ │ ├── model │ │ │ │ └── User.java │ │ │ └── service │ │ └── resources │ │ ├── application.properties │ │ ├── mapper │ │ │ └── UserMapper.xml │ │ ├── static │ │ └── templates │ │ └── home.html │ └── test │ └── java │ └── com │ └── example │ └── demo │ └── DemoApplicationTests.java └── target ├── classes │ ├── application.properties │ ├── com │ │ └── example │ │ └── demo │ │ ├── controller │ │ │ └── MainController.class │ │ ├── dao │ │ │ └── UserDao.class │ │ ├── DemoApplication.class │ │ └── model │ │ └── User.class │ ├── mapper │ │ └── UserMapper.xml │ └── templates │ └── home.html ├── generated-sources │ └── annotations ├── generated-test-sources │ └── test-annotations └── test-classes └── com └── example └── demo └── DemoApplicationTests.class