SpringBoot+Mybatis+PostMan(一):搭建spring boot項目並實現對數據庫的增刪改查操作。


Springboot+Mybatis+redis+postman項目實戰總目錄*

SpringBoot+Mybatis+PostMan(二):SpringBoot + Mybatis分頁查詢實現

SpringBoot+Mybatis+PostMan(三):學習過濾器

SpringBoot+Mybatis+PostMan(四):學習攔截器

SpringBoot+Mybatis+PostMan(五):token登陸認證過程一(token生成與認證)

SpringBoot+Mybatis+PostMan(五):token登陸認證過程二(redis緩存引入)

SpringBoot+Mybatis+PostMan(六):token登陸認證過程三(redis封裝與干掉原來session,避免用戶重復登陸)

番外篇:SpringBoot 用戶注冊時經MD5加密存入數據庫

 

 

第二篇章:用戶角色權限訪問控制

 

SpringBoot+Mybatis+PostMan(七):用戶角色權限訪問控制入門(數據模擬實現,不帶數據庫)

 

SpringBoot+Mybatis+PostMan(八):用戶角色權限訪問控制一(數據庫用戶角色表查詢組合)

 

SpringBoot+Mybatis+PostMan(九):用戶角色權限訪問控制二(加入資源表和資源角色對應表)

 

SpringBoot+Mybatis+PostMan(十):用戶角色權限訪問控制三(禁用session、啟用token並集成redis)

 

 

環境:

idea 2019

版本 2.4.0

數據庫:dbeaver、mysql

前端實現:postman

一、首先配置一下基本環境。

1. 新建項目,引入相關依賴:

<dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
<!--        mybatis配置-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
<!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <!--mysql jdbc驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--web驅動-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--test驅動-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--valid注解依賴-->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
<!--charset引入-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2</version>
        </dependency>

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.2</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-collections</groupId>
                    <artifactId>commons-collections</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.6</version>
        </dependency>
 
         

 

 

2. Mybatis配置:

@Configuration
public class MyBatisConfig {

    /**
     * Mapper掃描配置. 自動掃描將Mapper接口生成代理注入到Spring.
     */
    @Bean
    public static MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        // 注意這里的掃描路徑: 1.不要掃描到自定義的Mapper; 2.定義的路徑不要掃描到tk.mybatis.mapper(如定義**.mapper).
        // 兩個做法都會導致掃描到tk.mybatis的Mapper,就會產生重復定義的報錯.
        mapperScannerConfigurer.setBasePackage("*.example.**.mapper");
        return mapperScannerConfigurer;
    }

}

3. application.properties中數據源配置、mapper包映射設置:

#數據源配置
spring.datasource.url=jdbc:mysql://47.100.59.91:3306/testdemo
spring.datasource.username=root
spring.datasource.password= Aa12345&_

#mybatis映射配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=testdemo.system.dto
mybatis.configuration.map-underscore-to-camel-case=true

4. 項目結構如下:

 

 

 5. 前端代碼承接部分要實現兩個類,分別是Result和Results類。

package testdemo.util;

import testdemo.base.Result;

/**
 * Result生成工具類
 */
public class Results {

    protected Results() {}

    public static Result newResult() {
        return new Result();

    }

    public static Result newResult(boolean success) {
        return new Result(success);
    }

    //
    // 業務調用成功
    // ----------------------------------------------------------------------------------------------------
    public static Result success() {
        return new Result();
    }

    public static Result success(String msg) {
        return new Result(true, null, msg);
    }

    public static Result success(String code, String msg) {
        return new Result(true, code, msg);
    }

    public static Result successWithStatus(Integer status) {
        return new Result(true, status);
    }

    public static Result successWithStatus(Integer status, String msg) {
        return new Result(true, status, null, msg);
    }

    public static Result successWithData(Object data) {
        return new Result(true, null, null, data);
    }

    public static Result successWithData(Object data, String msg) {
        return new Result(true, null, msg, data);
    }

    public static Result successWithData(Object data, String code, String msg) {
        return new Result(true, code, msg, data);
    }

    //
    // 業務調用失敗
    // ----------------------------------------------------------------------------------------------------
    public static Result failure() {
        return new Result(false);
    }

    public static Result failure(String msg) {
        return new Result(false, null, msg);
    }

    public static Result failure(String code, String msg) {
        return new Result(false, code, msg);
    }

    public static Result failureWithStatus(Integer status) {
        return new Result(false, status);
    }

    public static Result failureWithStatus(Integer status, String msg) {
        return new Result(false, status, null, msg);
    }

    public static Result failureWithData(Object data) {
        return new Result(false, null, null, data);
    }

    public static Result failureWithData(Object data, String msg) {
        return new Result(false, null, msg, data);
    }

    public static Result failureWithData(Object data, String code, String msg) {
        return new Result(false, code, msg, data);
    }

}
package testdemo.base;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.io.Serializable;

/**
 * 前端返回對象
 */
public class Result implements Serializable {
    private static final long serialVersionUID = 1430633339880116031L;

    /**
     * 成功與否標志
     */
    private boolean success = true;
    /**
     * 返回狀態碼,為空則默認200.前端需要攔截一些常見的狀態碼如403、404、500等
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Integer status;
    /**
     * 編碼,可用於前端處理多語言,不需要則不用返回編碼
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String code;
    /**
     * 相關消息
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String msg;
    /**
     * 相關數據
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Object data;


    public Result() {}

    public Result(boolean success) {
        this.success = success;
    }

    public Result(boolean success, Integer status) {
        this.success = success;
        this.status = status;
    }

    public Result(boolean success, String code, String msg){
        this(success);
        this.code = code;
        this.msg = msg;
    }

    public Result(boolean success, Integer status, String code, String msg) {
        this.success = success;
        this.status = status;
        this.code = code;
        this.msg = msg;
    }

    public Result(boolean success, String code, String msg, Object data){
        this(success);
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

6. 實現枚舉類BaseEnum和BaseEnums。

package testdemo.constants;


import testdemo.base.BaseEnum;

import java.util.HashMap;
import java.util.Map;

/**
 * 基礎枚舉值
 */
public enum BaseEnums implements BaseEnum<String, String> {

    SUCCESS("request.success", "請求成功"),

    FAILURE("request.failure", "請求失敗"),

    OPERATION_SUCCESS("operation.success", "操作成功"),

    OPERATION_FAILURE("operation.failure", "操作失敗"),

    ERROR("system.error", "系統異常"),

    NOT_FOUND("not_found", "請求資源不存在"),

    FORBIDDEN("forbidden", "無權限訪問"),

    VERSION_NOT_MATCH("record_not_exists_or_version_not_match", "記錄版本不存在或不匹配"),

    PARAMETER_NOT_NULL("parameter_not_be_null", "參數不能為空");

    private String code;

    private String desc;

    private static Map<String, String> allMap = new HashMap<>();

    BaseEnums(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    static {
        for(BaseEnums enums : BaseEnums.values()){
            allMap.put(enums.code, enums.desc);
        }
    }

    @Override
    public String code() {
        return code;
    }

    @Override
    public String desc() {
        return desc;
    }

    public String desc(String code) {
        return allMap.get(code);
    }

}
package testdemo.base;

/**
 * 基礎枚舉接口
 */
public interface BaseEnum<K, V> {

    /**
     * 獲取編碼
     *
     * @return 編碼
     */
    K code();

    /**
     * 獲取描述
     *
     * @return 描述
     */
    V desc();

}

7. 還有常量設置constants。

package testdemo.constants;

import com.google.common.base.Charsets;

import java.nio.charset.Charset;

/**
 * 系統級常量類
 */
public class Constants {

    public static final String APP_NAME = "spring";

    /**
     * 系統編碼
     */
    public static final Charset CHARSET = Charsets.UTF_8;

    /**
     * 標識:是/否、啟用/禁用等
     */
    public interface Flag {

        Integer YES = 1;

        Integer NO = 0;
    }

    /**
     * 操作類型
     */
    public interface Operation {
        /**
         * 添加
         */
        String ADD = "add";
        /**
         * 更新
         */
        String UPDATE = "update";
        /**
         * 刪除
         */
        String DELETE = "delete";
    }

    /**
     * 性別
     */
    public interface Sex {
        /**
         * 男
         */
        Integer MALE = 1;
        /**
         * 女
         */
        Integer FEMALE = 0;
    }

}

8. 接下來就是數據庫設計。

數據庫名字是testdemo,數據庫表名叫sys-user。

先創建一個數據庫,然后創建用戶表。

USE testdemo;
CREATE TABLE `testdemo`.`user` (
    `id` bigint NOT NULL AUTO_INCREMENT,
    `username` varchar(255) NULL,
    `passwprd` varchar(255) NULL,
    PRIMARY KEY (`id`)
);

插入幾條數據:

基本准備做好了,接下來就進入代碼編寫了。

二、實現數據庫表數據單條查詢和多條查詢。

1. UserController.java中代碼如下:

 @Autowired
    UserService userService ;

    /*
    * 查詢所有條數據
    * */
    @GetMapping("/select")
    public Result select(){
        List<User> userList = userService.select();
        return Results.successWithData(userList,
                BaseEnums.SUCCESS.code(),BaseEnums.SUCCESS.desc());
    }

    /*
    * 查詢某條數據
    * */
    @GetMapping("/selectOne")
    public Result selectOne(@RequestParam("id") String id){

        return Results.successWithData(userService.selectOne(id),
                BaseEnums.SUCCESS.code(),BaseEnums.SUCCESS.desc());
    }

2. UserService接口中聲明方法。

/*
     * 通過id查詢用戶
     * */
    public List<User> select();

    /*
    * 查詢某一條數據
    * */
    public User selectOne(String id);

3. UserServiceImp類繼承UserService,並完成數據傳遞。

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper userMapper ;
    @Override
    public User selectOne(String id){
        return userMapper.selectOne(id) ;
    }

    @Override
    public List<User> select(){
        return userMapper.select();
    }
}

4. UserMapper中聲明方法,繼續傳遞數據。

@Repository
@Mapper
public interface UserMapper {

    public List<User> select();

    public User selectOne(String id);

}

5. UserMapper.xml中代碼如下:

<mapper namespace="testdemo.system.dao.UserMapper">

    <resultMap id="userMap" type="testdemo.system.dto.User">

        <result property="id" column="id"/>
        <result property="userName" column="username"/>
        <result property="password" column="password"/>

    </resultMap>

    <select id="select" resultMap="userMap">
        select * from sys_user
    </select>

    <select id="selectOne" resultMap="userMap">
        select * from sys_user where id = #{id}
    </select>
</mapper>

這樣一來,后端查詢代碼就完成了,現在利用postman完成前端數據查詢。

6、前端數據查詢

(1). 查詢所有數據

 

 (2). 查詢一條數據

 

 三、插入一條或多條數據。

在上面代碼基礎上添加代碼。

1. UserController.java中:

/*
    * 插入一條數據
    * */
    @PostMapping("/InsertOne")
    public Result InsertOne(@RequestBody User user){
        return Results.successWithData(userService.insertOne(user),
                BaseEnums.SUCCESS.code(),BaseEnums.SUCCESS.desc());
    }

    /*
    * 插入多條數據
    * */
    @PostMapping("/InsertMany")
    public Result InsertMany(@RequestBody List<User> userlist){
        return Results.successWithData(userService.insertMany(userlist),
                BaseEnums.SUCCESS.code(),BaseEnums.SUCCESS.desc());
    }

2. UserService接口中添加方法:

/*
     * 新增一個用戶
     * */
    public Integer insertOne(User user);

    /*
     * 新增多個用戶
     * */
    public Integer insertMany(List<User> userList);

3. UserServiceImpl實現數據傳遞:

@Override
    public Integer insertOne(User user){
        return userMapper.insertOne(user);
    }

    @Override
    public Integer insertMany(List<User> userList){
        return userMapper.insertMany(userList) ;
    }

4. UserMapper.java中:

public Integer insertOne(User user);

public Integer insertMany(List<User> userList);

5. UserMapper.xml中:

<insert id="insertOne">
        insert into sys_user(id,username,password)
            values(#{id},#{userName},#{password})
    </insert>


    <insert id="insertMany">
        insert into sys_user(id,username,password)
            values
            <foreach collection="list" item="user" index="index" separator=",">
                (#{user.id} , #{user.userName},#{user.password})
    </foreach>
    </insert>
上面xml中的user指的是當前對象,因為前面是list,說明user對象有多個,這樣就需要帶上user,表示都是list中哪個user的屬性。這里的user可以隨意命名。
collection="list"中的list和前面UserMapper.java中參數統一,如果沒統一有時候也不會出錯,但是如果想要不統一也能執行不出錯的話,需要進入如下設置:
public Integer insertMany(@Param("list") List<User> userList);

這樣以來兩者也能對應上了。

6. 前端實現:

(1)插入一條數據:

 

 (2)插入多條數據(先把數據表中清空,不然會出現重復插入情況)

 

 四、刪除某條數據

1. UserController.java中:

 /*
    * 刪除某條數據
    * */
    @PostMapping("/DeleteOne")
    public Result DeleteOne(@RequestParam("id") String id){

        return Results.successWithData(userService.deleteOne(id),
                BaseEnums.SUCCESS.code(),BaseEnums.SUCCESS.desc());
    }

2. UserService.java中:

/*
     * 刪除某一條數據
     * */
    public Integer deleteOne(String id);

3. UserServiceImpl.java中:

@Override
    public Integer deleteOne(String id){
        return userMapper.deleteOne(id) ;
    }

4. UserMapper.java中:

 public Integer deleteOne(String id);

5. UserMapper.xml中:

<delete id="deleteOne">
       delete from sys_user where id = #{id}
    </delete>

6.前端實現:

 

 五、更新數據(根據id更新數據)

1. UserController.java

/*
    *按照id更新數據
    * */
    @PostMapping("/UpdateById")
    public Result UpdateById(@RequestBody User user){
        User user1 = userService.selectOne(user.getId()) ;
        System.out.println(user1);

        if(user1!=null){
            return Results.successWithData(userService.updateById(user),
                    BaseEnums.SUCCESS.code(),BaseEnums.SUCCESS.desc());
        }else{
            return Results.failure() ;
        }


    }

2. UserService.java中:

/*
    * 更新數據
    * */
    public Integer updateById(User user) ;

3. UserServiceImpl.java中:

public Integer updateById(User user){
        return userMapper.updateById(user ) ;
    }

4. UserMapper.java中:

public Integer updateById(User user) ;

5. UserMapper.xml中:

<update id="updateById" parameterType="User">
        update sys_user
        set username = #{userName},
            password = #{password}
        where id = #{id}
    </update>

6.前端postman傳參如下:

 

 數據庫更新成功:

以上就是springboot框架+mybatis中前后端完整的數據庫增刪改查實現。

至此,結束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM