SpringBoot使用Mybatis注解實(shí)現(xiàn)分頁(yè)動(dòng)態(tài)sql開(kāi)發(fā)教程
一、環(huán)境配置
1.引入mybatis依賴
compile( //SpringMVC 'org.springframework.boot:spring-boot-starter-web', "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.3", //Mybatis依賴及分頁(yè)插件 "org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1", "com.github.pagehelper:pagehelper:4.1.0", 'mysql:mysql-connector-java' )
2.數(shù)據(jù)源配置
spring: datasource: username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql:///mybatis?characterEncoding=utf8&useSSL=false //根據(jù)resources目錄下的schema.sql自動(dòng)建表,可省略 schema: classpath:schema.sql //根據(jù)resources目錄下的data.sql自動(dòng)插入假數(shù)據(jù),可省略 data: classpath:data.sql
3.分頁(yè)插件配置
@Configuration public class CommonConfiguration { /** * 注冊(cè)MyBatis分頁(yè)插件PageHelper */ @Bean public PageHelper pageHelper() { PageHelper pageHelper = new PageHelper(); Properties p = new Properties(); p.setProperty("offsetAsPageNum", "true"); p.setProperty("rowBoundsWithCount", "true"); p.setProperty("reasonable", "true"); pageHelper.setProperties(p); return pageHelper; } }
4.配置SpringBoot掃描Mybatis倉(cāng)儲(chǔ),有兩種配置方式
在啟動(dòng)類上加入@MapperScan,填寫(xiě)Mapper接口所在的包名,SpringBoot就會(huì)自動(dòng)將該包中的Mapper接口進(jìn)行加載
@MapperScan(basePackages = "com.kingboy.repository") @SpringBootApplication public class KingboySpringbootDataApplication { public static void main(String[] args) { SpringApplication.run(KingboySpringbootDataApplication.class, args); } }
在Mapper接口上加上@Mapper注解,SpringBoot就會(huì)自動(dòng)夾在該Mapper接口
@Mapper public interface UserMapper { @Insert("INSERT INTO `user` VALUES (#{id}, #{nickName}, #{phoneNumber}, #{sex}, #{age}, #{birthday}, #{status})") @Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id") void saveUser(User user); }
這兩種方式都可以,根據(jù)項(xiàng)目結(jié)構(gòu)進(jìn)行選擇即可,也可以結(jié)合私用。
5.配置駝峰屬性自動(dòng)映射
mybatis: configuration: map-underscore-to-camel-case: true
例如實(shí)體中屬性為phoneNumber,數(shù)據(jù)庫(kù)屬性為phone_number,Mybatis默認(rèn)是不能自動(dòng)轉(zhuǎn)換的,通常我們要自定義以下結(jié)果集映射
@Result(column = "phone_number", property = "phoneNumber")
然而這樣很不方便,當(dāng)我們加上以上配置之后,Mybatis在映射結(jié)果時(shí),會(huì)自動(dòng)轉(zhuǎn)換,去掉下劃線,變n為大寫(xiě)N。
6.設(shè)置mybatis日志打印,在配置文件中加入如下配置
logging: level: #Mapper所在的包 com.kingboy.repository: debug
開(kāi)啟日志有三種方式,可以參考我的另一篇博客
logback中顯示mybatis查詢?nèi)罩疚募?xiě)入的方法
二、Mybatis注解
Mybatis提供了四個(gè)注解,先簡(jiǎn)單了解一下,后面的完整示例中演示了相應(yīng)的實(shí)例
@Insert(“sql”) 增
@Delete(“sql”) 刪
@Update(“sql”) 改
@Select(“sql”) 查
三、方法參數(shù)讀取
1.普通參數(shù)讀取
在方法參數(shù)前使用@Param注解對(duì)參數(shù)進(jìn)行標(biāo)記,在sql中使用#{屬性名}來(lái)讀取屬性。
示例
//刪除用戶,根據(jù)用戶ID和名稱刪除用戶 @Delete("DELETE FROM `user` WHERE id = #{id} AND nick_name = #{nickName}") void delete(@Param(value = "id") Long id, @Param(value = "nickName") String nickName);
2.對(duì)象參數(shù)讀取
直接在sql中使用#{屬性名}來(lái)讀取屬性
示例
@Insert("INSERT INTO `user` VALUES (#{id}, #{nickName}, #{phoneNumber}, #{sex}, #{age}, #{birthday}, #{status})") @Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id") void saveUser(User user);
這里補(bǔ)充一點(diǎn),@Options注解和@Insert注解結(jié)合使用,可以將保存后的主鍵設(shè)置到user實(shí)體中。也就是說(shuō)保存前user的id是沒(méi)值的,
保存后mybatis會(huì)自動(dòng)將數(shù)據(jù)庫(kù)中的主鍵設(shè)置到user的id屬性上,keyColumn = "id"為數(shù)據(jù)庫(kù)主鍵名,keyProperty = "id"為實(shí)體的主鍵屬性名。
四、分頁(yè)插件的使用
分頁(yè)插件單獨(dú)拿出來(lái)說(shuō),是因?yàn)轫?xiàng)目實(shí)戰(zhàn)中發(fā)現(xiàn)很多同學(xué)都使用錯(cuò)了,所以著重強(qiáng)調(diào)一下。
分頁(yè)插件的核心類是PageHelper,這個(gè)類提供了很多的靜態(tài)方法,其中我們最常用的是PageHelper.startPage(int page, int size)這個(gè)方法,返回com.github.pagehelper.Page對(duì)象,
該對(duì)象包含了包含了查詢結(jié)果result, 當(dāng)前頁(yè)pageNum,每頁(yè)大小pageSize, 總條數(shù)total等信息,可以獲取這些信息返回給前端。需要注意的是,PageHelper的頁(yè)數(shù)是從1開(kāi)始的。
我們來(lái)看一段實(shí)際的代碼操作,這里就不寫(xiě)service層了。
//controller RestController @RequestMapping(value = "/user") public class UserController { @Resource UserRepository userRepository; @GetMapping @Transactional(readOnly = true) public Page get(@RequestParam Integer page, @RequestParam Integer size) { //分頁(yè)并查詢 Page<User> pageInfo = PageHelper.startPage(page, size); List<User> users = userRepository.listUser(); //獲取分頁(yè)信息演示, 實(shí)際項(xiàng)目中一般會(huì)封裝為自己的返回體。 int pageNum = pageInfo.getPageNum(); int pageSize = pageInfo.getPageSize(); long total = pageInfo.getTotal(); List<User> result = pageInfo.getResult();//和上面的users結(jié)果相同 return pageInfo; } } //repository @Mapper public interface UserRepository { //分頁(yè)查詢用戶 @Select("SELECT * FROM `user`") List<User> listUser(); }
五、動(dòng)態(tài)標(biāo)簽
熟悉Mybatis的同學(xué)一定對(duì)Mybatis的動(dòng)態(tài)SQL很了解,解決了我們編寫(xiě)動(dòng)態(tài)SQL的很多痛點(diǎn)。接下來(lái)介紹以下Mybatis常用的動(dòng)態(tài)sql的注解寫(xiě)法,其實(shí)和xml是幾乎完全一致的。
首先在注解中使用動(dòng)態(tài)sql時(shí),我們需要為sql加上<script></script>
標(biāo)簽,這時(shí)候mybatis才會(huì)解析里面的標(biāo)簽。
1.<if test="條件判斷">sql</if>
用來(lái)對(duì)參數(shù)進(jìn)行判斷,若為真,則包裹的sql語(yǔ)句生效。條件中可以使用and作連接
//分頁(yè)查詢用戶,如果sex有值,則查詢相應(yīng)sex的所有用戶,sex沒(méi)值則查詢所有 @Select("<script>SELECT * FROM `user` <if test='sex != null'>where sex = #{sex}</if><script>") List<User> listUser(Sex sex);//sex是一個(gè)枚舉類型,值為BOY,GIRL
2.<foreach item = 'item' index = 'index' collection='list' separator=',', open='(', close=')'>sql</foreach>
循環(huán)參數(shù)中的集合參數(shù)進(jìn)行操作,和java中的for循環(huán)比較類似,不過(guò)多了open/close/separator三個(gè)參數(shù)。
open
是在操作之前加上一個(gè)"("
close
是在操作之后加上一個(gè)")"
separator
是每個(gè)元素間的分割符
需要注意的是,collection的值只能是list或者collection
示例
@Select("<script>" + "SELECT * FROM `user` WHERE id in " + "<foreach item='item' collection='list' open='(' close=')' separator=','>" + "#{item}" + "</foreach>" + "</script>") List<User> listUserByIds(List<Long> ids);
例如傳入的ids為[2,4,6]生成的sql如下:
SELECT * FROM `user` WHERE id in ( 2 , 4, 6 )
3.<set></set>
更新實(shí)體屬性要用到的標(biāo)簽,一般我們使用動(dòng)態(tài)sql更新用戶信息 update user set username = ?, age = ?,時(shí)要處理最后一個(gè)逗號(hào)的問(wèn)題,那么使用set標(biāo)簽就可以自動(dòng)幫我們處理這個(gè)逗號(hào)。
示例
//使用set標(biāo)簽進(jìn)行動(dòng)態(tài)set,要注意條件判斷:沒(méi)被刪除的用戶才可以更新數(shù)據(jù) @Update("<script>" + "UPDATE `user` " + "<set>" + "<if test='nickName != null'>nick_name = #{nickName}, </if>" + "<if test='age != null'>age = #{age}, </if>" + "<if test='phoneNumber != null'>phone_number = #{phoneNumber}, </if>" + "<if test='birthday != null'>birthday = #{birthday}, </if>" + "<if test='status != null'>status = #{status}, </if>" + "<if test='sex != null'>sex = #{sex}, </if>" + "</set>" + "WHERE id = #{id} AND status != 'DELETE';" + "</script>") void updateUser(User user);
4.<where></where>
和更新數(shù)據(jù)時(shí)遇到的問(wèn)題一樣,我們?cè)趧?dòng)態(tài)查詢時(shí)也要?jiǎng)討B(tài)拼接查詢條件,最前邊一個(gè)查詢條件是沒(méi)有AND或者OR的,以前通常使用1 = 1避開(kāi)這個(gè)問(wèn)題,那么現(xiàn)在可以使用標(biāo)簽自動(dòng)幫我們處理。
示例
/** * 根據(jù)條件查詢用戶 * 注意其中nickName模糊查詢的處理方法 * 注意其中關(guān)于生日的區(qū)間判斷, < > * @param userQueryDTO * @return */ @Select("<script>" + "SELECT * FROM `user`" + "<where>" + "<bind name='nickName' value=\"'%' + nickName + '%'\" />" + "<if test='nickName != null'>AND nick_name like #{nickName}</if>" + "<if test='phoneNumber !=null'>AND phone_number = #{phoneNumber}</if>" + "<if test='sex !=null'>AND sex = #{sex}</if>" + "<if test='age !=null'>AND age = #{age}</if>" + "<if test='fromBirthday !=null'>AND birthday > #{fromBirthday}</if>" + "<if test='toBirthday !=null'>AND birthday < #{toBirthday}</if>" + "<if test='status !=null'>AND status = #{status}</if>" + "</where>" + "</script>") List<User> queryByCondition(UserQueryDTO userQueryDTO);
5.<bind name='新屬性' value="'%' + 原屬性 + '%'" />
在模糊查詢時(shí),我們通常使用 where name like %金% 這樣的方式來(lái)進(jìn)行查詢(當(dāng)然這樣效率很低,不推薦),但是在mybatis里面我們直接寫(xiě) where name like %#{name}% 是不行的,
會(huì)生成 where name like %'金'% 這樣的sql, 很明顯是不行的。有兩種方式可以處理。
1)、傳入的屬性上加上%號(hào),例如傳入的name就為 %金% ,這樣可以解決,但是不方便。
2)、使用bind標(biāo)簽,我們可以在sql中加入一行賦值操作
<bind name='newName' value="'%' + name + '%'" />
示例:參照上一個(gè)示例。
6.<choose><when test='條件1'></when><when test='條件2'></when><otherwise></otherwise></choose>
這個(gè)java中的switch比較像,如果條件1成立,就執(zhí)行條件1中的語(yǔ)句,剩下的不執(zhí)行。條件1不成立就判斷條件2,如果條件2還不成立就執(zhí)行otherwise中的sql。
示例
/** * 如果age有值,通過(guò)age查詢 * 如果age沒(méi)有值,則通過(guò)sex查詢 * 如果age和sex都沒(méi)值,則查詢所有status為UNLOCK的用戶 * @param age * @param sex * @return */ @Select("<script>" + "SELECT * FROM `user`" + "<where>" + "<choose>" + "<when test='age != null'>AND age = #{age}</when>" + "<when test='sex != null'>AND sex = #{sex}</when>" + "<otherwise>AND status = 'UNLOCK'</otherwise>" + "</choose>" + "</where>" + "</script>") List<User> getByOrderCondition(@Param("age") Integer age, @Param("sex") Sex sex);
六、完整示例
其中的用戶實(shí)體等沒(méi)有貼出來(lái),太亂了,完整示例代碼可以參考文章開(kāi)頭的github項(xiàng)目。
UserController
package com.kingboy.controller.user; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.kingboy.common.utils.page.PageParam; import com.kingboy.common.utils.page.PageResult; import com.kingboy.common.utils.page.PageResultFactory; import com.kingboy.common.utils.result.ApiResult; import com.kingboy.domain.user.Sex; import com.kingboy.domain.user.Status; import com.kingboy.domain.user.User; import com.kingboy.dto.user.UserQueryDTO; import com.kingboy.repository.user.UserRepository; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * @author kingboy--KingBoyWorld@163.com * @date 2017/12/30 下午11:59 * @desc 用戶接口. */ @RestController @RequestMapping(value = "/user") public class UserController { @Resource UserRepository userRepository; @Resource PageResultFactory pageResultFactory; /** * 保存單個(gè)用戶 * http://localhost:8080/user * {"nickName":"kingboy","age":"26","sex":"BOY","phoneNumber":"13132296607","birthday":"2011-12-12 12:12","status":"UNLOCK"} * @param user * @return */ @PostMapping public ApiResult save(@RequestBody User user) { userRepository.saveUser(user); return ApiResult.success(user); } /** * 批量保存 * http://localhost:8080/user/list * [ * {"nickName":"kingboy","age":"26","sex":"BOY","phoneNumber":"13132296607","birthday":"2011-12-12 12:12","status":"UNLOCK"}, * {"nickName":"kingboy","age":"26","sex":"BOY","phoneNumber":"13132296607","birthday":"2011-12-12 12:12","status":"UNLOCK"}, * {"nickName":"kingboy","age":"26","sex":"BOY","phoneNumber":"13132296607","birthday":"2011-12-12 12:12","status":"UNLOCK"} * ] * @param users * @return */ @PostMapping(value = "/list") public ApiResult save(@RequestBody List<User> users) { userRepository.saveUserList(users); return ApiResult.success(users); } /** * 更新單個(gè)用戶 * http://localhost:8080/user * {"id":"1","nickName":"kingboy","age":"26","sex":"BOY","phoneNumber":"13132296607","birthday":"2011-12-12 12:12","status":"UNLOCK"} * @return */ @PutMapping public ApiResult update(@RequestBody User user) { userRepository.updateUser(user); return ApiResult.success("success"); } /** * 刪除用戶 * http://localhost:8080/user/1 * @return */ @DeleteMapping("/{id}") public ApiResult remove(@PathVariable Long id) { //軟刪除 userRepository.remove(id, Status.DELETE); //硬刪除 //userRepository.delete(id); return ApiResult.success("success"); } /** * 通過(guò)ID獲取用戶 * http://localhost:8080/user/1 * @return */ @GetMapping("/{id}") public ApiResult get(@PathVariable Long id) { User user = userRepository.get(id); return ApiResult.success(user); } /** * 分頁(yè)查詢用戶集合 * http://localhost:8080/user * 需要注意的是PageHelper是從1開(kāi)始分頁(yè),而Hibernate/Jpa是從0開(kāi)始分頁(yè)的 * @return */ @GetMapping @Transactional(readOnly = true) public ApiResult get(@ModelAttribute PageParam pageParam) { //分頁(yè)并查詢 Page<User> pageInfo = PageHelper.startPage(pageParam.getPage(), pageParam.getSize()); List<User> users = userRepository.listUser(); //實(shí)際使用時(shí),最后一個(gè)參數(shù)傳入要轉(zhuǎn)換的類型DTO PageResult<User> result = pageResultFactory.createAndConvert(pageParam.getMybatisPage(), pageInfo.getTotal(), users, User.class); return ApiResult.success(result); } /** * 通過(guò)id集合查詢用戶,這里就不做分頁(yè)了。 * http://localhost:8080/user/ids * [1,3] * @return */ @PostMapping("/ids") public ApiResult getUserByIds(@RequestBody List<Long> ids) { List<User> users = userRepository.listUserByIds(ids); return ApiResult.success(users); } /** * 通過(guò)查詢條件賴查詢用戶,這里也不做分頁(yè)了 * http://localhost:8080/user/query * { * "nickName":"i", * "fromBirthday":"1999-12-31 12:12", * } * @param userQueryDTO * @return */ @PostMapping("/query") public ApiResult queryUser(@RequestBody UserQueryDTO userQueryDTO) { List<User> users = userRepository.queryByCondition(userQueryDTO); return ApiResult.success(users); } /** * 根據(jù)條件的順序來(lái)查詢用戶 * http://localhost:8080/user/query?age=24 * 演示choose標(biāo)簽的用法:如果傳入age就按年齡查詢用戶,age沒(méi)有傳入就按照sex賴查詢用戶。如果兩者都沒(méi)有傳入,那就查詢所有status沒(méi)有凍結(jié)的用戶 * 類似如下: * switch(value) { * case age: * //查詢age * break; * case sex: * //查詢sex * break; * default: * //查詢status * break; * } */ @GetMapping("/query") public ApiResult findUserByOrderCondition(@RequestParam(required = false) Integer age, @RequestParam(required = false) Sex sex) { List<User> users = userRepository.getByOrderCondition(age, sex); return ApiResult.success(users); } }
UserRepository
package com.kingboy.repository.user; import com.kingboy.domain.user.Sex; import com.kingboy.domain.user.Status; import com.kingboy.domain.user.User; import com.kingboy.dto.user.UserQueryDTO; import org.apache.ibatis.annotations.*; import java.util.List; /** * @author kingboy--KingBoyWorld@163.com * @date 2017/12/31 上午12:01 * @desc 用戶倉(cāng)儲(chǔ). */ public interface UserRepository { /** * 添加用戶 * @Options返回在數(shù)據(jù)庫(kù)中主鍵,自動(dòng)賦值到user的id字段中 * keyProperty = "id"的默認(rèn)值為id,可以省略 */ @Insert("INSERT INTO `user` VALUES (#{id}, #{nickName}, #{phoneNumber}, #{sex}, #{age}, #{birthday}, #{status})") @Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id") void saveUser(User user); /** * 批量保存用戶 * @param users */ @Insert("<script>" + "INSERT INTO `user` VALUES " + "<foreach item = 'item' index = 'index' collection='list' separator=','>" + "(#{item.id}, #{item.nickName}, #{item.phoneNumber}, #{item.sex}, #{item.age}, #{item.birthday}, #{item.status})" + "</foreach>" + "</script>") @Options(useGeneratedKeys = true) void saveUserList(List<User> users); //使用set標(biāo)簽進(jìn)行動(dòng)態(tài)set,要注意條件判斷:沒(méi)被刪除的用戶才可以更新數(shù)據(jù) @Update("<script>" + "UPDATE `user` " + "<set>" + "<if test='nickName != null'>nick_name = #{nickName}, </if>" + "<if test='age != null'>age = #{age}, </if>" + "<if test='phoneNumber != null'>phone_number = #{phoneNumber}, </if>" + "<if test='birthday != null'>birthday = #{birthday}, </if>" + "<if test='status != null'>status = #{status}, </if>" + "<if test='sex != null'>sex = #{sex}, </if>" + "</set>" + "WHERE id = #{id} AND status != 'DELETE';" + "</script>") void updateUser(User user); //刪除用戶,軟刪除 @Update("UPDATE `user` SET status = #{status} WHERE id = #{id}") void remove(@Param(value = "id") Long id, @Param(value = "status") Status status); //刪除用戶,硬刪除 @Delete("DELETE FROM `user` WHERE id = #{id}") void delete(@Param(value = "id") Long id); /** * 查詢用戶 * 單個(gè)參數(shù)時(shí),@Param注解可以省略 * 在配置中指定了駝峰映射,所以@Results的結(jié)果映射可以省略,不是駝峰類型的仍然需要寫(xiě)結(jié)果映射。 */ @Select("SELECT * FROM `user` WHERE id = #{id}") @Results({ @Result(column = "nick_name", property = "nickName"), @Result(column = "phone_number", property = "phoneNumber") }) User get(Long id); //分頁(yè)查詢用戶 @Select("SELECT * FROM `user`") List<User> listUser(); /** * 通過(guò)id集合查詢用戶 * @param ids * @return */ @Select("<script>" + "SELECT * FROM `user` WHERE id in " + "<foreach item='item' collection='list' open='(' close=')' separator=','>" + "#{item}" + "</foreach>" + "</script>") List<User> listUserByIds(List<Long> ids); /** * 根據(jù)條件查詢用戶 * 注意其中nickName模糊查詢的處理方法 * 注意其中關(guān)于生日的區(qū)間判斷 * @param userQueryDTO * @return */ @Select("<script>" + "SELECT * FROM `user`" + "<where>" + "<bind name='nickName' value=\"'%' + nickName + '%'\" />" + "<if test='nickName != null'>AND nick_name like #{nickName}</if>" + "<if test='phoneNumber !=null'>AND phone_number = #{phoneNumber}</if>" + "<if test='sex !=null'>AND sex = #{sex}</if>" + "<if test='age !=null'>AND age = #{age}</if>" + "<if test='fromBirthday !=null'>AND birthday > #{fromBirthday}</if>" + "<if test='toBirthday !=null'>AND birthday < #{toBirthday}</if>" + "<if test='status !=null'>AND status = #{status}</if>" + "</where>" + "</script>") List<User> queryByCondition(UserQueryDTO userQueryDTO); /** * 如果age有值,通過(guò)age查詢 * 如果age沒(méi)有值,則通過(guò)sex查詢 * 如果age和sex都沒(méi)值,則查詢所有status為UNLOCK的用戶 * @param age * @param sex * @return */ @Select("<script>" + "SELECT * FROM `user`" + "<where>" + "<choose>" + "<when test='age != null'>AND age = #{age}</when>" + "<when test='sex != null'>AND sex = #{sex}</when>" + "<otherwise>AND status = 'UNLOCK'</otherwise>" + "</choose>" + "</where>" + "</script>") List<User> getByOrderCondition(@Param("age") Integer age, @Param("sex") Sex sex); }
以上就是SpringBoot使用Mybatis注解實(shí)現(xiàn)分頁(yè)動(dòng)態(tài)sql開(kāi)發(fā)教程的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Mybatis注解分頁(yè)動(dòng)態(tài)sql教程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 基于AQS實(shí)現(xiàn)自定義同步器的示例
這篇文章主要介紹了Java 基于AQS實(shí)現(xiàn)自定義同步器的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03java實(shí)現(xiàn)隨機(jī)森林RandomForest的示例代碼
本篇文章主要介紹了java實(shí)現(xiàn)隨機(jī)森林RandomForest的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08使用jdbcTemplate查詢返回自定義對(duì)象集合代碼示例
這篇文章主要介紹了使用jdbcTemplate查詢返回自定義對(duì)象集合代碼示例,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02java實(shí)現(xiàn) 二叉搜索樹(shù)功能
這篇文章主要介紹了java實(shí)現(xiàn) 二叉搜索樹(shù)功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法(二)
這篇文章主要介紹了SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法(二),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Spring security 如何開(kāi)放 Swagger 訪問(wèn)權(quán)限
這篇文章主要介紹了Spring security 如何開(kāi)放 Swagger 訪問(wèn)權(quán)限操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09SpringCloud 服務(wù)網(wǎng)關(guān)路由規(guī)則的坑及解決
這篇文章主要介紹了SpringCloud 服務(wù)網(wǎng)關(guān)路由規(guī)則的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07