繼上篇文章:Spring-Boot入門之環境搭建。此次咱們整合SpringBoot-Mybatis實現簡單的CRUD業務。html
需求:前端
項目源碼請看個人Github倉庫:教你優雅的入門Spring Boot框架vue
若是以爲不錯就點擊右上角star鼓勵一下筆者吧(#^.^#)java
技術棧mysql
測試環境git
項目設計github
. ├── db -- sql文件 ├── mvnw ├── mvnw.cmd ├── pom.xml -- 項目依賴 └── src ├── main │ ├── java │ │ └── cn │ │ └── tycoding │ │ ├── SpringbootApplication.java -- Spring Boot啓動類 │ │ ├── controller -- MVC-WEB層 │ │ ├── entity -- 實體類 │ │ ├── interceptor -- 自定義攔截器 │ │ ├── mapper -- mybatis-Mapper層接口 │ │ └── service -- service業務層 │ └── resources -- Spring Boot資源文件 │ ├── application.yml -- Spring Boot核心配置文件 │ ├── mapper -- Mybatis Mapper層配置文件 │ ├── static -- 前端靜態文件 │ └── templates -- Thymeleaf模板引擎識別的HTML頁面目錄 └── test -- 測試文件
開始實戰Spring Boot項目,首先,你須要將Spring Boot工程搭建出來。web
Spring Boot工程搭建請看個人博客:Spring Boot入門之工程搭建redis
Spring Boot提供了不少應用啓動器,分別用來支持不一樣的功能,說白了就是pom.xml
中的依賴配置,由於Spring Boot的自動化配置特性,咱們並不需再考慮項目依賴版本問題,使用Spring Boot的應用啓動器,它能自動幫咱們將相關的依賴所有導入到項目中。spring
咱們這裏介紹幾個常見的應用啓動器:
spring-boot-starter
: Spring Boot的核心啓動器,包含了自動配置、日誌和YAMLspring-boot-starter-aop
: 支持AOP面向切面編程的功能,包括spring-aop和AspecJspring-boot-starter-cache
: 支持Spring的Cache抽象spring-boot-starter-artermis
: 經過Apache Artemis支持JMS(Java Message Service)的APIspring-boot-starter-data-jpa
: 支持JPAspring-boot-starter-data-solr
: 支持Apache Solr搜索平臺,包括spring-data-solrspring-boot-starter-freemarker
: 支持FreeMarker模板引擎spring-boot-starter-jdbc
: 支持JDBC數據庫spring-boot-starter-Redis
: 支持Redis鍵值儲存數據庫,包括spring-redisspring-boot-starter-security
: 支持spring-securityspring-boot-starter-thymeleaf
: 支持Thymeleaf模板引擎,包括與Spring的集成spring-boot-starter-web
: 支持全棧式web開發,包括tomcat和Spring-WebMVCspring-boot-starter-log4j
: 支持Log4J日誌框架spring-boot-starter-logging
: 引入Spring Boot默認的日誌框架LogbackSpring Boot項目(即Maven項目),固然擁有最基礎的Maven項目結構。除此以外:
Spring Boot項目中不包含webapp(webroot)目錄。
Spring Boot默認提供的靜態資源目錄須要置於classpath下,且其下的目錄名稱要符合必定規定。
Spring Boot默認不提倡用XML配置文件,主張使用YML做爲配置文件格式,YML有更簡潔的語法。固然也可使用.properties做爲配置文件格式。
Spring Boot官方推薦使用Thymeleaf做爲前端模板引擎,而且Thymeleaf默認將templates做爲靜態頁面的存放目錄(由配置文件指定)。
Spring Boot默認將resources
做爲靜態資源的存放目錄,存放前端靜態文件、項目配置文件。
Spring Boot規定resources
下的子級目錄名要符合必定規則,通常咱們設置resources/static
爲前端靜態(JS,CSS)的存放目錄;設置resources/templates
做爲HTML頁面的存放目錄。
Spring Boot指定的Thymeleaf模板引擎文件目錄/resources/templates
是受保護的目錄,想當與以前的WEB-INF文件夾,裏面的靜態資源不能直接訪問,通常咱們經過Controller映射訪問。
建議將Mybatis-Mapper的XML映射文件放於resources/
目錄下,我這裏設爲resources/mapper
目錄,且src/main/java/Mapper
下的Mapper層接口要使用@Mapper
註解標識,否則mybatis找不到接口對應的XML映射文件。
SpringBootApplication.java
爲項目的啓動器類,項目不須要部署到Tomcat上,由SpringBoot提供的服務器部署項目(運行啓動器類便可);且SpringBoot會自動掃描該啓動器同級和子級下用註解標識的Bean。
Spring Boot不建議使用JSP頁面,若是想使用,請自行百度解決辦法。
上面說了Spring Boot提供的存放HTML靜態頁面的目錄resources/templates
是受保護的目錄,訪問其中的HTML頁面要經過Controller映射,這就間接規定了你須要配置Spring的視圖解析器,且Controller類不能使用@RestController
標識。
首先: 我想特殊強調的是:SpringBoot不是對Spring功能上的加強,而是提供了一種快速使用Spring的方式。必定要切記這一點。
學習SpringBoot框架,只是爲了更簡便的使用Spring框架,咱們在SSM階段學習的知識如今放在Spring Boot框架上開發是徹底適用的,咱們學習的大多數是SpringBoot的自動化配置方式。
由於Spring Boot框架的一大優點就是自動化配置,從pom.xml的配置中就能明顯感覺到。
因此這裏推薦一下我以前的SSM階段整合項目: SSM詳細入門整合案例 SSM+Redis+Shiro+Solr+Vue.js整合項目
本項目的依賴文件請看Github倉庫:spring-boot/pom.xml
本項目數據庫表設計請看GitHub倉庫:spring-boot/db/
請運行項目前,先把數據庫表結構建好
以前已經說過:SpringBoot框架不是對Spring功能上的加強,而是提供了一種快速使用Spring的方式
因此說,SpringBoot整合Mybatis的思想和Spring整合Mybatis的思想基本相同,不一樣之處有兩點:
1.Mapper接口的XML配置文件變化。以前咱們使用Mybatis接口代理開發,規定Mapper映射文件要和接口在一個目錄下;而這裏Mapper映射文件置於resources/mapper/
下,且置於src/main/java/
下的Mapper接口須要用@Mapper
註解標識,否則映射文件與接口沒法匹配。
2.SpringBoot建議使用YAML做爲配置文件,它有更簡便的配置方式。因此整合Mybatis在配置文件上有必定的區別,但最終都是那幾個參數的配置。
關於YAML的語法請自行百度,我這裏也僅僅是知足基本的配置需求,不涉及那種不易理解的語法。
本例詳細代碼請看GitHub倉庫:spring-boot/resources/application.yml
在Spring階段用XML配置mybatis無非就是配置:1.鏈接池;2.數據庫url鏈接;3.mysql驅動;4.其餘初始化配置
spring: datasource: name: springboot type: com.alibaba.druid.pool.DruidDataSource #druid相關配置 druid: #監控統計攔截的filters filter: stat #mysql驅動 driver-class-name: com.mysql.jdbc.Driver #基本屬性 url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true username: root password: root #配置初始化大小/最小/最大 initial-size: 1 min-idle: 1 max-active: 20 #獲取鏈接等待超時時間 max-wait: 60000 #間隔多久進行一次檢測,檢測須要關閉的空閒鏈接 time-between-eviction-runs-millis: 60000 #mybatis配置 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: cn.tycoding.entity
注意:空格表明節點層次;註釋部分用#
標記
解釋
咱們實現的是spring-mybatis的整合,包含mybatis的配置以及datasource數據源的配置固然屬於spring配置中的一部分,因此須要在spring:
下。
mapper-locations
至關於XML中的<property name="mapperLocations">
用來掃描Mapper層的配置文件,因爲咱們的配置文件在resources
下,因此須要指定classpath:
。
type-aliases-package
至關與XML中<property name="typeAliasesPackase">
別名配置,通常取其下實體類類名做爲別名。
datasource
數據源的配置,name
表示當前數據源的名稱,相似於以前的<bean id="dataSource">
id屬性,這裏能夠任意指定,由於咱們無需關注Spring是怎麼注入這個Bean對象的。
druid
表明本項目中使用了阿里的druid鏈接池,driver-class-name:
至關於XML中的<property name="driverClassName">
;url
表明XML中的<property name="url">
;username
表明XML中的<property name="username">
;password
表明XML中的<property name="password">
;其餘druid的私有屬性配置再也不解釋。這裏注意druid鏈接池和c3p0鏈接池在XML的<property>的name中就不一樣,在此處SpringBoot的配置中固然名稱也不一樣。
若是Spring整合Mybtis的配置你已經很熟悉了,那麼這個配置你確定也很眼熟,從英文名稱上就很容易區分出來。這裏須要注意的就是YAML語法規定不一樣行空格表明了不一樣的層級結構。
既然完成了SpringBoot-Mybatis基本配置下面咱們實戰講解如何實現基本的CRUD。
1.在
src/main/java/cn/tycoding/entity/
下新建User.java
實體類
public class User implements Serializable { private Long id; //編號 private String username; //用戶名 private String password; //密碼 //getter/setter }
2.在
src/main/java/cn/tycoding/service/
下建立BaseService.java
通用接口,目的是簡化service層接口基本CRUD方法的編寫。
public interface BaseService<T> { // 查詢全部 List<T> findAll(); //根據ID查詢 List<T> findById(Long id); //添加 void create(T t); //刪除(批量) void delete(Long... ids); //修改 void update(T t); }
以上就是我對Service層基本CRUD接口的簡易封裝,使用了泛型類,其繼承接口指定了什麼泛型,T就表明什麼類。
3.在
src/main/java/cn/tycoding/service/
下建立UserService.java
接口:
public interface UserService extends BaseService<User> {}
4.在
src/main/java/cn/tycoding/service/impl/
下建立UserServiceImpl.java
實現類:
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> findAll() { return userMapper.findAll(); } //其餘方法省略 }
5.在
src/main/java/cn/tycoding/mapper/
下建立UserMapper.java
Mapper接口類:
@Mapper public interface UserMapper { List<User> findAll(); }
如上,咱們必定要使用@Mapper
接口標識這個接口,否則Mybatis找不到其對應的XML映射文件。
6.在
src/main/resources/mapper/
下建立UserMapper.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="cn.tycoding.mapper.UserMapper"> <!-- 查詢全部 --> <select id="findAll" resultType="cn.tycoding.entity.User"> SELECT * FROM tb_user </select> </mapper>
7.在
src/main/java/cn/tycoding/controller/admin/
下建立UserController.java
@RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/findAll") public List<User> findAll() { return userService.findAll(); } }
8.運行
src/main/java/cn/tycoding/SpringbootApplication.java
的main方法,啓動springboot
在瀏覽器上訪問localhost:8080/findAll
便可獲得一串JSON數據。
看了上面一步步的講解。你應該明白了,其實和SSM階段的CRUD基本相同,這裏我就再也不舉例其餘方法。
下面咱們講解一下不一樣的地方:
由於Thymeleaf指定的目錄src/main/resources/templates/
是受保護的目錄,其下的資源不能直接經過瀏覽器訪問,可使用Controller映射的方式訪問,怎麼映射呢?
1.在application.yml中添加配置
spring: thymeleaf: prefix: classpath:/templates/ check-template-location: true suffix: .html encoding: UTF-8 mode: LEGACYHTML5 cache: false
指定Thymeleaf模板引擎掃描resources
下的templates
文件夾中已.html
結尾的文件。這樣就實現了MVC中關於視圖解析器的配置:
<!-- 配置視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean>
是否是感受方便不少呢?但這裏須要注意的是:classpath:
後的目錄地址必定要先加/
,好比目前的classpath:/templates/
。
2.在Controller添加映射方法
@GetMapping(value = {"/", "/index"}) public String index() { return "home/index"; }
這樣,訪問localhost:8080/index
將直接跳轉到resources/templates/home/index.html
頁面。
首先咱們須要在application.yml中配置pageHelper插件
pagehelper: pagehelperDialect: mysql reasonable: true support-methods-arguments: true
我這裏使用了Mybatis的PageHelper分頁插件,前端使用了ElementUI自帶的分頁插件:具體的教程請查看個人博客:SpringMVC+ElementUI實現分頁查詢
核心配置:
UserServiceImp.java
public PageBean findByPage(Goods goods, int pageCode, int pageSize) { //使用Mybatis分頁插件 PageHelper.startPage(pageCode, pageSize); //調用分頁查詢方法,其實就是查詢全部數據,mybatis自動幫咱們進行分頁計算 Page<Goods> page = goodsMapper.findByPage(goods); return new PageBean(page.getTotal(), page.getResult()); }
這裏涉及的無非就是SpringMVC的文件上傳,詳細的教程請參看個人博客:SpringMVC實現文件上傳和下載
由於本項目中前端使用了ElementUI+Vue.JS技術,因此前端的文件上傳和回顯教程請看個人博客:SpringMVC+ElementUI實現圖片上傳和回顯
除了代碼的編寫,這裏還要在application.yml中進行配置:
spring: servlet: multipart: max-file-size: 10Mb max-request-size: 100Mb
這就至關於SpringMVC的XML配置:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="500000"/> </bean>
本項目,咱們先不整合Shiro和Spring Security這些安全框架,使用Spring AOP切面編程思想實現簡單的登陸攔截:
@Component @Aspect public class MyInterceptor { @Pointcut("within (cn.tycoding.controller..*) && !within(cn.tycoding.controller.admin.LoginController)") public void pointCut() { } @Around("pointCut()") public Object trackInfo(ProceedingJoinPoint joinPoint) throws Throwable { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); User user = (User) request.getSession().getAttribute("user"); if (user == null) { attributes.getResponse().sendRedirect("/login"); //手動轉發到/login映射路徑 } return joinPoint.proceed(); } }
解釋
關於Spring AOP的切面編程請自行百度,或者你也能夠看個人博客:Spring AOP思想。咱們須要注意如下幾點
必定要熟悉AspectJ的切點表達式,在這裏:..*
表示其目錄下的全部方法和子目錄方法。
若是進行了登陸攔截,即在session中沒有獲取到用戶的登陸信息,咱們可能須要手動轉發到login
頁面,這裏訪問的是login
映射。
基於2,必定要指定Object返回值,若AOP攔截的Controller return了一個視圖地址,那麼原本Controller應該跳轉到這個視圖地址的,可是被AOP攔截了,那麼原來Controller仍會執行return,可是視圖地址卻找不到404了。
切記必定要調用proceed()方法,proceed():執行被通知的方法,如不調用將會阻止被通知的方法的調用,也就致使Controller中的return會404。
<br/>
若是你們有興趣,歡迎你們加入個人Java交流技術羣:671017003 ,一塊兒交流學習Java技術。博主目前一直在自學JAVA中,技術有限,若是能夠,會盡力給你們提供一些幫助,或是一些學習方法,固然羣裏的大佬都會積極給新手答疑的。因此,別猶豫,快來加入咱們吧!
<br/>
If you have some questions after you see this article, you can contact me or you can find some info by clicking these links.