IDEA2019開發Spring Boot整合Mybatis實現User的CRUD(增讀更刪)

    本實例適合剛開始學習spring boot的有一定開發基礎的同學們,使用當前比較流行的IntelliJ IDEA 2019開發工具,利用spring boot框架,採用Java語言,結合MySQL數據庫設計實現用戶User的增加、讀取、更新、刪除。首先,我們先了解一下基本概念。

    Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力於在蓬勃發展的快速應用開發領域(rapid application development)成爲領導者。Spring框架是Java平臺上的一種開源應用框架,提供具有控制反轉特性的容器。而SpringBoot是一個全新開源的輕量級框架。它基於Spring4.0設計,不僅繼承了Spring框架原有的優秀特性,而且還通過簡化配置來進一步簡化了Spring應用的整個搭建和開發過程。另外SpringBoot通過集成大量的框架使得依賴包的版本衝突,以及引用的不穩定性等問題得到了很好的解決。

    IntelliJ IDEA是java編程語言開發的集成環境。IntelliJ在業界被公認爲最好的java開發工具,尤其在智能代碼助手、代碼自動提示、重構、J2EE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創新的GUI設計等方面的功能可以說是超常的。DEA是JetBrains公司的產品,這家公司總部位於捷克共和國的首都布拉格,開發人員以嚴謹著稱的東歐程序員爲主,支持HTML,CSS,PHP,MySQL,Python等。

    MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java對象)映射成數據庫中的記錄。MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。

  好了,簡單瞭解了這些概念後,下面我們進入主題。

開發工具

IntelliJ IDEA 2019.1.1 x64

新建工程

選擇左側的Spring Initializr,jdk要求1.8及以上,選擇默認的Default下一步:

我們可以不改這些信息直接下一步,如果想改名字可以自己修改Group及Artifact,和最下邊的package包名,這裏我把Group改成com,Artifact改爲sjzeis,選擇下一步。

選擇項目所需要的依賴,這個頁面是選擇你工程中需要用到的依賴,因爲我們的目標是web項目使用mybatis所以在web模塊中勾選Spring Web,在SQL中依次勾選Jdbc API、Mybatis Framework、Mysql Driver。然後下一步直到finish即可。

接着項目就會下載我們需要的依賴,如果之前沒有下過,可能會稍等幾分鐘。

配置項目相關信息

來看下建好後的pom.xml文件,上一步選擇的依賴,在pom.xml文件中 已經自動添加到我們的文件中了。下面爲本項目的pom.xml文件內容。

<?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 https://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.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com</groupId>
    <artifactId>sjzeis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sjzeis</name>
    <description>sjzeis project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- jdbc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

修改配置文件

    Spring Boot通過pom.xml中引入模塊化的Stater,使得常規的開發場景可以很快把應用搭建起來。在使用Spring Boot的過程中,除了可以在pom.xml中配置一些內容外,一些項目相關的配置也可以在application.properties中通過配置來完成。

    application.properties文件爲默認項目配置文件,默認爲空的,我們可以在配置文件中配置端口、名字等一般屬性,也可以配置自定義屬性、參數引用、多環境配置等,可以參考 https://www.jianshu.com/p/c023083f51b4 一文說明介紹。 application.properties文件在項目-src-main-resources下。

     本項目如果使用application.properties文件,可以在文件中添加端口、數據源、mydatis等相關數據,下面爲文件內容。

server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

    但是還是習慣yml標記語言文件的天然的樹狀結構,通常以.yml爲後綴的文件,是一種直觀的能夠被電腦識別的數據序列化格式,並且容易被人類閱讀。在IDEA下書寫起來也比較方便,其實SpringBoot底層會把application.yml文件解析爲application.properties。所以將本項目原有的application.properties文件重構-重命名爲:application_bak.properties,或者直接刪除即可,這樣項目不再加載該文件。接下來創建application.yml和application-dev.yml配置文件。在一個項目中可以配置多套環境,便於在團隊開發中可以做到項目的分離獨自開發,再整合的形式。在Spring Boot中多環境配置文件名需要滿足application-{profile}.properties的格式,其中{profile}對應你的環境標識,比如:

  • application-dev.properties:開發環境
  • application-test.properties:測試環境
  • application-prod.properties:生產環境

application.yml爲主加載配置文件,內容如下:

spring:
  profiles:
    active: dev

application-dev.yml爲主環境說明文件,內容如下:

server:
  port: 8080
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: root
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml

    項目在加載時自動加載application.yml配置文件,根據配置文件中的spring.profiles.active=dev,就會再加載application-dev.yml配置文件中的內容。上面文件配置了端口號8080,數據源的驅動類、地址、登錄用戶名和口令,以及mybatis映射mapper路徑的指定。特別需要注意的是:本項目中driver-class-name: com.mysql.cj.jdbc.Driver,是新版本org.springframework.boot和org.mybatis.spring.boot中規定的驅動,老版本的寫driver-class-name: com.mysql.jdbc.Driver

項目編寫及業務流程

User數據庫的定義

創建User實體類實現業務流程

    一、創建項目路徑包來,展示業務流程。在項目src-main-java-com-sjzeis下分別創建包:controller、entity、mapper、service,用來實現控制層、實體層、映射層、業務層。這裏面簡單介紹一下業務流程及各層業務的作用如下:

    1. entity實體層(別名: model層 ,domain層),用於存放我們的實體類,與數據庫中的屬性值基本保持一致,實現set和get的方法。如:user表的實體User。

    2. mapper映射層(別名:dao層),用於對數據庫進行數據持久化操作,他的方法語句是直接針對數據庫操作的,主要實現一些增刪改查操作,在mybatis中方法主要與*Mapper.xml內相互一一映射。如:public interface UserMapper {...}。

    3. service業務層,用於給controller層的類提供接口進行調用。一般就是自己寫的方法封裝起來,就是聲明一下,存放業務邏輯處理,也是一些關於數據庫處理的操作,但不是直接和數據庫打交道,他有接口還有接口的實現方法,在接口的實現方法中需要導入mapper層,mapper層是直接跟數據庫打交道的,他也是個接口,只有方法名字,具體實現在mapper.xml文件裏,service是供我們使用的方法。如:public class UserService {...}。

    4. controller控制層(別名:web 層),用於負責具體模塊的業務流程控制,需要調用service邏輯設計層的接口來控制業務流程。因爲service中的方法是我們使用到的,controller控制器導入service層,因爲service中的方法是我們使用到的,controller通過接收前端傳過來的參數進行業務操作,在返回一個指定的路徑或者數據表。如:public class UserController {...}。

 二、在src-main-resources下創建mapper包用於存放*Mapper.xml文件

項目結構如圖:

如果想直接創建對應的包而不是目錄,可以在java目錄上點擊鼠標右鍵,選擇標記目標目錄爲-測試源 根,如圖:

創建entity實體類User

package com.sjzeis.entity;

public class User {
    private int userid;
    private String username;
    private String password;

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

創建Mapper映射操作UserMapper類

package com.sjzeis.mapper;

import com.sjzeis.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {
    public List<User> findAllUser();
    public List<User> findUserByUserId(int userid);
}

創建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="com.sjzeis.mapper.UserMapper">
    <resultMap id="result" type="com.sjzeis.entity.User">
        <result column="userid" jdbcType="INTEGER" property="userid" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="VARCHAR" property="password" />
    </resultMap>

    <select id="findAllUser" resultType="com.sjzeis.entity.User">
        select  * from users;
    </select>

    <select id="findUserByUserId" resultType="com.sjzeis.entity.User">
        select * from users where userid=#{userid};
    </select>
</mapper>

注意該文件放在resources目錄下的mapper包中,具體包名位置(namespace)要和上邊的映射UserMapper類對應 。

創建service業務UserService類

package com.sjzeis.service;

import com.sjzeis.entity.User;
import com.sjzeis.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired(required=false)
    public UserMapper userMapper;

    public List<User> findAllUser(){
        return userMapper.findAllUser();
    }

    public List<User> findUserByUserId(int userid){
        return userMapper.findUserByUserId(userid);
    }
}

創建 controller控制層UserController類

package com.sjzeis.controller;

import com.sjzeis.entity.User;
import com.sjzeis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getAllUser")
    public List<User> findAll(){
        return userService.findAllUser();
    }

    @RequestMapping("/getUserByUserID/{userid}")
    public List<User> findUserByUserId(@PathVariable int userid){
        return userService.findUserByUserId(userid);
    }
}

最終框架結構

測試 

通過點擊IDEA右上角的啓動按鈕,或者在SjzeisApplication類中鼠標右鍵選擇運行啓動main方法,來啓動項目。

地址欄輸入 http://localhost:8080/user/getAllUser/,顯示如下:

地址欄輸入 http://localhost:8080/user/getUserByUserID/1,顯示如下:

    通過測試的數據顯示,項目測試成功!

    以上爲spring boot 整合mybatis實現的User讀取,接下來是添加UserMapper類的增加、更新和刪除方法,配置UserMapper.xml文件,添加UserService和UserController相關功能。完整代碼如下。

完整UserMapper類

package com.sjzeis.mapper;

import com.sjzeis.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {
    public List<User> findAllUser();
    public List<User> findUserByUserId(int userid);
    public List<User> findUserByUsername(String username);
    public int insertUser(User user);
    public int updateUser(User user);
    public int deleteUser(User user);
}

完整UserService類

package com.sjzeis.service;

        import com.sjzeis.entity.User;
        import com.sjzeis.mapper.UserMapper;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Service;

        import java.util.List;

@Service
public class UserService {
    @Autowired(required=false)
    public UserMapper userMapper;

    public List<User> findAllUser(){
        return userMapper.findAllUser();
    }

    public List<User> findUserByUserId(int userid){
        return userMapper.findUserByUserId(userid);
    }

    public List<User> findUserByUsername(String username){
        return userMapper.findUserByUsername(username);
    }

    public User insertUser(User user){
        userMapper.insertUser(user);
        return user;
    }

    public int updateUser(User user){
        return userMapper.updateUser(user);
    }

    public int deleteUser(User user){
        return userMapper.deleteUser(user);
    }
}

完整UserController類

package com.sjzeis.controller;

import com.sjzeis.entity.User;
import com.sjzeis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getAllUser")
    public List<User> findAll(){
        return userService.findAllUser();
    }

    @RequestMapping("/getUserByUserID/{userid}")
    public List<User> findUserByUserId(@PathVariable int userid){
        return userService.findUserByUserId(userid);
    }

    @RequestMapping("/getUserByUsername/{username}")
    public List<User> findUserByUsername(@PathVariable String username){
        return userService.findUserByUsername(username);
    }

    @RequestMapping("/insertUser")
    public User insertUser(User user){
        return userService.insertUser(user);
    }

    @RequestMapping("/updateUser")
    public int updateUser(User user){
        return userService.updateUser(user);
    }

    @RequestMapping("/deleteUser")
    public int deleteUser(User user){
        return userService.deleteUser(user);
    }
}

完整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="com.sjzeis.mapper.UserMapper">
    <resultMap id="result" type="com.sjzeis.entity.User">
        <result column="userid" jdbcType="INTEGER" property="userid" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="VARCHAR" property="password" />
    </resultMap>

    <select id="findAllUser" resultType="com.sjzeis.entity.User">
        select  * from users;
    </select>

    <select id="findUserByUserId" resultType="com.sjzeis.entity.User">
        select * from users where userid=#{userid};
    </select>
    
    <select id="findUserByUsername" resultType="com.sjzeis.entity.User">
        select * from users where username=#{username};
    </select>

    <insert id="insertUser" parameterType="com.sjzeis.entity.User" keyProperty="userid" useGeneratedKeys="true">
        insert into users(username,password) values (#{username},#{password});
    </insert>

    <update id="updateUser" parameterType="com.sjzeis.entity.User">
        update users set username=#{username},password=#{password} where userid=#{userid};
    </update>

    <delete id="deleteUser" parameterType="com.sjzeis.entity.User">
        delete from users where userid=#{userid};
    </delete>
</mapper>

 啓動項目運行測試如下。

以上爲本實例的簡單講解,後續會講一些@註解的使用,以及實例的詳細介紹,敬請期待!

本實例代碼下載:https://download.csdn.net/download/u011924274/11995379

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章