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中前后端完整的數據庫增刪改查實現。
至此,結束。