SpringBoot整合Mybatis實現簡單的CRUD

繼上篇文章:Spring-Boot入門之環境搭建。此次咱們整合SpringBoot-Mybatis實現簡單的CRUD業務。html

需求:前端

  • 詳解SpringBoot工程的構建、與SSM項目在工程搭建上的不一樣。
  • 實現SpringBoot-Mybatis整合征服數據庫。
  • 解決頁面跳轉,詳解與SSM階段的不一樣。
  • 實現分頁查詢,使用PaheHelper插件和ElementUI分頁控件。
  • 實現文件上傳。
  • 使用Spring AOP切面編程實現簡易的實現登陸攔截工程。

項目源碼請看個人Github倉庫:教你優雅的入門Spring Boot框架vue

若是以爲不錯就點擊右上角star鼓勵一下筆者吧(#^.^#)java

教你優雅的入門Spring Boot框架

技術棧mysql

  • 後端: SpringBoot + Mybatis
  • 前端: Vue.JS + ElementUI

測試環境git

  • IDEA + SpringBoot-2.0.5

項目設計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應用啓動器

Spring Boot提供了不少應用啓動器,分別用來支持不一樣的功能,說白了就是pom.xml中的依賴配置,由於Spring Boot的自動化配置特性,咱們並不需再考慮項目依賴版本問題,使用Spring Boot的應用啓動器,它能自動幫咱們將相關的依賴所有導入到項目中。spring

咱們這裏介紹幾個常見的應用啓動器:

  • spring-boot-starter: Spring Boot的核心啓動器,包含了自動配置、日誌和YAML
  • spring-boot-starter-aop: 支持AOP面向切面編程的功能,包括spring-aop和AspecJ
  • spring-boot-starter-cache: 支持Spring的Cache抽象
  • spring-boot-starter-artermis: 經過Apache Artemis支持JMS(Java Message Service)的API
  • spring-boot-starter-data-jpa: 支持JPA
  • spring-boot-starter-data-solr: 支持Apache Solr搜索平臺,包括spring-data-solr
  • spring-boot-starter-freemarker: 支持FreeMarker模板引擎
  • spring-boot-starter-jdbc: 支持JDBC數據庫
  • spring-boot-starter-Redis: 支持Redis鍵值儲存數據庫,包括spring-redis
  • spring-boot-starter-security: 支持spring-security
  • spring-boot-starter-thymeleaf: 支持Thymeleaf模板引擎,包括與Spring的集成
  • spring-boot-starter-web: 支持全棧式web開發,包括tomcat和Spring-WebMVC
  • spring-boot-starter-log4j: 支持Log4J日誌框架
  • spring-boot-starter-logging: 引入Spring Boot默認的日誌框架Logback

Spring Boot項目結構設計

Spring Boot項目(即Maven項目),固然擁有最基礎的Maven項目結構。除此以外:

  1. Spring Boot項目中不包含webapp(webroot)目錄。

  2. Spring Boot默認提供的靜態資源目錄須要置於classpath下,且其下的目錄名稱要符合必定規定。

  3. Spring Boot默認不提倡用XML配置文件,主張使用YML做爲配置文件格式,YML有更簡潔的語法。固然也可使用.properties做爲配置文件格式。

  4. Spring Boot官方推薦使用Thymeleaf做爲前端模板引擎,而且Thymeleaf默認將templates做爲靜態頁面的存放目錄(由配置文件指定)。

  5. Spring Boot默認將resources做爲靜態資源的存放目錄,存放前端靜態文件、項目配置文件。

  6. Spring Boot規定resources下的子級目錄名要符合必定規則,通常咱們設置resources/static爲前端靜態(JS,CSS)的存放目錄;設置resources/templates做爲HTML頁面的存放目錄。

  7. Spring Boot指定的Thymeleaf模板引擎文件目錄/resources/templates是受保護的目錄,想當與以前的WEB-INF文件夾,裏面的靜態資源不能直接訪問,通常咱們經過Controller映射訪問。

  8. 建議將Mybatis-Mapper的XML映射文件放於resources/目錄下,我這裏設爲resources/mapper目錄,且src/main/java/Mapper下的Mapper層接口要使用@Mapper註解標識,否則mybatis找不到接口對應的XML映射文件。

  9. SpringBootApplication.java爲項目的啓動器類,項目不須要部署到Tomcat上,由SpringBoot提供的服務器部署項目(運行啓動器類便可);且SpringBoot會自動掃描該啓動器同級和子級下用註解標識的Bean。

  10. Spring Boot不建議使用JSP頁面,若是想使用,請自行百度解決辦法。

  11. 上面說了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整合Mybatis

以前已經說過: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

注意:空格表明節點層次;註釋部分用#標記

解釋

  1. 咱們實現的是spring-mybatis的整合,包含mybatis的配置以及datasource數據源的配置固然屬於spring配置中的一部分,因此須要在spring:下。

  2. mapper-locations至關於XML中的<property name="mapperLocations">用來掃描Mapper層的配置文件,因爲咱們的配置文件在resources下,因此須要指定classpath:

  3. type-aliases-package至關與XML中<property name="typeAliasesPackase">別名配置,通常取其下實體類類名做爲別名。

  4. datasource數據源的配置,name表示當前數據源的名稱,相似於以前的<bean id="dataSource">id屬性,這裏能夠任意指定,由於咱們無需關注Spring是怎麼注入這個Bean對象的。

  5. 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.javaMapper接口類:

@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>

使用Spring AOP切面編程實現簡單的登陸攔截器

本項目,咱們先不整合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思想。咱們須要注意如下幾點

  1. 必定要熟悉AspectJ的切點表達式,在這裏:..*表示其目錄下的全部方法和子目錄方法。

  2. 若是進行了登陸攔截,即在session中沒有獲取到用戶的登陸信息,咱們可能須要手動轉發到login頁面,這裏訪問的是login映射。

  3. 基於2,必定要指定Object返回值,若AOP攔截的Controller return了一個視圖地址,那麼原本Controller應該跳轉到這個視圖地址的,可是被AOP攔截了,那麼原來Controller仍會執行return,可是視圖地址卻找不到404了。

  4. 切記必定要調用proceed()方法,proceed():執行被通知的方法,如不調用將會阻止被通知的方法的調用,也就致使Controller中的return會404。

Preview

<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.

相關文章
相關標籤/搜索