国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MyBatis查詢數(shù)據(jù)庫(3)

這篇具有很好參考價值的文章主要介紹了MyBatis查詢數(shù)據(jù)庫(3)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?前言??

??????SSM專欄更新中,各位大佬覺得寫得不錯,支持一下,感謝了!??????

Spring + Spring MVC + MyBatis_冷兮雪的博客-CSDN博客

前面我們講解了MyBatis增刪改查基本操作,下面我們來深入了解MyBatis其中不同和需要注意的地方。

一、查詢操作??

1、單表查詢??

下面我們來實現(xiàn)?下根據(jù)用戶 id 查詢用戶信息的功能

UserController?實現(xiàn)代碼如下:

//url 路徑名直接全部小寫即可
    @RequestMapping("/getuserbyid")
    public Userinfo geUserById(Integer id){
        if (id==null)
            return null;
        return userService.getUserById(id);
    }

?UserMapper?實現(xiàn)代碼如下:

/**
     * 根據(jù)用戶id查詢用戶信息
     * @param id
     * @return
     */
    Userinfo getUserById(@Param("id") Integer id);

UserMapper.xml?實現(xiàn)代碼如下:

<select id="getUserById" resultType="com.example.ssmdemo1.entity.Userinfo">
        select * from userinfo where id=${id}
</select>

Ⅰ、參數(shù)占位符 #{} 和 ${}??

  • #{}:預(yù)編譯處理。

  • ${}:字符直接替換。

預(yù)編譯處理是指:MyBatis 在處理#{}時,會將 SQL 中的 #{} 替換為?號,使用?PreparedStatement 的 set 方法來賦值。直接替換:是MyBatis 在預(yù)處理 ${} 時,就會把 ${} 替換成變量的值。

上面代碼我們使用的是${},去傳遞Integer(整數(shù))類型的參數(shù)時,是沒有問題的,但如果傳遞的是String類型的話,程序就會報錯。

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

下面我們通過 根據(jù)用戶名查詢用戶(getUserByName)來看看

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

?這就直接報錯了,說是沒有admin這個用戶,這是因為${}是直接替換值(不會管你是什么類型,都直接替換),而SQL語句中字符串需要使用單引號,這就會查詢不到,報錯。

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

正確SQL:?

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

兩者區(qū)別總結(jié):

1、#{}:安全參數(shù)占位符

  • #{}是MyBatis的預(yù)編譯語句中的參數(shù)占位符,用于傳遞參數(shù)值。它會自動進(jìn)行參數(shù)值的類型轉(zhuǎn)換和防止SQL注入攻擊。
  • 在使用#{}時,MyBatis會將參數(shù)值通過JDBC的PreparedStatement接口進(jìn)行預(yù)編譯,參數(shù)值會被當(dāng)做字符串類型處理,然后由JDBC驅(qū)動來負(fù)責(zé)將其轉(zhuǎn)換成對應(yīng)的數(shù)據(jù)庫類型,這樣可以避免SQL注入問題。
  • 例子:SELECT * FROM users WHERE id = #{userId}

2、${}:字符串替換占位符

  • ${}是字符串替換占位符,用于直接將參數(shù)的值替換到SQL語句中。在使用${}時,參數(shù)值會被直接替換進(jìn)SQL語句中,不會進(jìn)行預(yù)編譯或類型轉(zhuǎn)換。
  • 由于${}直接替換參數(shù)值到SQL語句中,可能存在SQL注入的風(fēng)險,因此不建議在動態(tài)SQL中使用${}來傳遞用戶輸入的參數(shù)。
  • 例子:SELECT * FROM users WHERE id = ${userId}

那這為什么還有${}去傳遞參數(shù)呢?全部使用#{}不是更好?

Ⅱ、${}優(yōu)點??

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

在進(jìn)行排序時(需要傳遞關(guān)鍵字時)需要使用到${},而?#{sort} 就不能實現(xiàn)排序查詢了,因為使用?#{sort} 查詢時, 如果傳遞的值為 String 則會加單引號,就會導(dǎo)致 sql 錯誤。

UserMapper接口:

//根據(jù)id查詢用戶 并且進(jìn)行排序
    List<Userinfo> getAllByOrder(@Param("order") String order);

UserMapper.xml:

<select id="getAllByOrder" resultType="com.example.ssmdemo1.entity.Userinfo">
        select * from userinfo order by id ${order}
</select>
單元測試:
@Test
    void getAllByOrder() {
        List<Userinfo> list = userMapper.getAllByOrder("asc");
        System.out.println(list);

    }

單元測試成功:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

Ⅲ、SQL 注入問題???

UserMapper接口:

Userinfo login(@Param("username")String username,@Param("password")String password);

UserMapper.xml:

<select id="login" resultType="com.example.ssmdemo1.entity.Userinfo">
        select *from userinfo where usernaem='${username}' and password='${password}'
</select>

因為${}是直接引用,所以我們加上了單引號。?這樣就和使用#{}是一樣的了

單元測試:

@Test
    void login() {
        String username="2";
        String password="2";
        Userinfo userinfo=userMapper.login(username,password);
        System.out.println("用戶登錄"+(userinfo==null?"失敗":"成功"));
    }

?可以看到此時用戶是登錄成功的:?

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

但是這樣寫有SQL注入的風(fēng)險,我們修改代碼如下,然后運行代碼

@Test
    void login() {
        String username="2";
        String password="'or 1 ='1";
        Userinfo userinfo=userMapper.login(username,password);
        System.out.println("用戶登錄"+(userinfo==null?"失敗":"成功"));
    }

單元測試:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

可以看到上面單元測試失敗了,但仔細(xì)看,是因為返回了5個Userinfo對象,但我只需要接收一個

所以報錯了,如果接受的是List<Userinfo>就不會報錯了

UserMapper接口:

List<Userinfo> login(@Param("username")String username, @Param("password")String password);

單元測試:

@Test
    void login() {
        String username="2";
        String password="' or 1='1";
        List<Userinfo> userinfo=userMapper.login(username,password);
        System.out.println("用戶登錄"+(userinfo==null?"失敗":"成功"));
    }

單元測試成功:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

可以看到這是非??膳碌?,居然把我所有用戶信息返回了(數(shù)據(jù)庫中一共有五個用戶),也就是說,你想使用哪個用戶登錄就可以使用哪個用戶登錄。

如果使用#{},可能存在這個問題嗎?

<select id="login" resultType="com.example.ssmdemo1.entity.Userinfo">
        select *from userinfo where username=#{username} and password=#{password}
</select>

?單元測試失敗:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

?結(jié)論:用于查詢的字段,盡量使用?#{} 預(yù)查詢的方式,而需要傳遞關(guān)鍵字時,使用${}

Ⅳ、like查詢??

在使用like查詢時,使用#{}會報錯,下面我們來看看是怎么回事。

UserMapper接口:

List<Userinfo> getListByName(@Param("username")String username);

UserMapper.xml:

<select id="getListByName" resultType="com.example.ssmdemo1.entity.Userinfo">
        select * from userinfo where username like '%#{username}%'
</select>

單元測試:

@Test
    void getListByName() {
        String username="n";
        List<Userinfo> list=userMapper.getListByName(username);
        System.out.println("list:"+list);
    }

?運行報錯:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

這是因為使用#{}會當(dāng)作字符串進(jìn)行替換,就變成下面這樣了

select * from userinfo where username like '%'n'%'

我們替換${}試試:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

但是前面說了使用${}有SQL注入的風(fēng)險,所有這是不能直接使用?${},可以考慮使用?mysql 的內(nèi)置函數(shù) concat() 來處理,實現(xiàn)代碼如下:?

<select id="findUserByName3" resultType="com.example.demo.model.User">
     select * from userinfo where username like concat('%',#{username},'%')
</select>

單元測試成功:?

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

?在使用like查詢時應(yīng)該搭配concat()函數(shù)使用。

2、多表查詢??

如果是增、刪、改返回搜影響的行數(shù),那么在 UserMapper.xml 中是可以不設(shè)置返回的類型的,如:

    <insert id="add">
        insert into userinfo(username,password) values(#{username},#{password})
    </insert>
    <delete id="delById">
        delete from userinfo where id=#{id}
    </delete>
    <update id="upUserName">
        update userinfo set username=#{username} where id=#{id}
    </update>

然而即使是最簡單查詢用戶的名稱也要設(shè)置返回的類型,否則會出現(xiàn)如下錯誤:

查詢不設(shè)置返回類型的錯誤示例演示:

controller 代碼:

@RequestMapping("/getname")
public String getNameById(Integer id) {
     return userService.getNameById(id);
}
UserMapper.xml 實現(xiàn)代碼:
<select id="getNameById">
        select username from userinfo where id=#{id}
</select>

訪問接口執(zhí)行結(jié)果如下:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

顯示運行了?個查詢但沒有找到結(jié)果映射,也就是說對于 <select> 查詢標(biāo)簽來說至少需要兩個屬性:

  • id 屬性:用于標(biāo)識實現(xiàn)接口中的那個方法;

  • 結(jié)果映射屬性:結(jié)果映射有兩種實現(xiàn)標(biāo)簽:<resultMap> 和 <resultType>。

Ⅰ、返回類型:resultType ???

絕大數(shù)查詢場景可以使? resultType 進(jìn)行返回,如下代碼所示:

<select id="getNameById" resultType="java.lang.String">
         select username from userinfo where id=#{id}
</select>
<select id="getUserByName" resultType="com.example.ssmdemo1.entity.Userinfo">
        select * from userinfo where username=#{username}
</select>

它的優(yōu)點是使用方便,直接定義到某個實體類即可。

Ⅱ、返回字典映射:resultMap???

resultMap使用場景:
  • 字段名稱和程序中的屬性名不同的情況,可使用?resultMap 配置映射;

  • ?對?和?對多關(guān)系可以使用?resultMap 映射并查詢數(shù)據(jù)。

當(dāng)程序中的屬性值與數(shù)據(jù)庫中的字段名不一樣時??
@Data
public class Userinfo {
    private Integer id;
    private String name;//數(shù)據(jù)庫名為:username
    private String password;
    private String photo;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
    private Integer state;
}

?我們?nèi)卧獪y試,進(jìn)行用戶的查詢:

@Test
    void getUserByName() {
        Userinfo userinfo=userMapper.getUserByName("admin");
        System.out.println(userinfo);
    }

?打印出來就發(fā)現(xiàn),name沒有被賦值,為null,這就是因為字段名與屬性值不一樣的結(jié)果。

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

這個時候就可以使用?resultMap 了,resultMap 的使用如下:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

?UserMapper.xml:

<resultMap id="baseMap" type="com.example.demo.entity.Userinfo">
        <id column="id" property="id"></id>
        <result column="username" property="name"></result>
        <result column="password" property="password"></result>
        <result column="photo" property="photo"></result>
        <result column="createtime" property="createtime"></result>
        <result column="updatetime" property="updatetime"></result>
        <result column="state" property="state"></result>
</resultMap>
<select id="getUserByName" resultMap="baseMap">
        select * from userinfo where username=#{username}
</select>

這樣查詢的結(jié)果就有值了,如下圖所示:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

或者使用as關(guān)鍵字(數(shù)據(jù)庫重命名)??

如果你一定需要使用resultType,也是可以實現(xiàn)的:

<select id="getUserByName" resultType="com.example.ssmdemo1.entity.Userinfo">
        select id,username as name,password,photo,createtime,updatetime from userinfo where username=#{username}
    </select>

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

Ⅲ、多表查詢??

在多表查詢時,如果使用?resultType 標(biāo)簽,在?個類中包含了另?個對象是查詢不出來被包含的對象的,比如以下實體類:

@Data
public class ArticleInfo {
 private Integer id;
 private String title;
 private String content;
 private LocalDateTime createtime;
 private LocalDateTime updatetime;
 private Integer rcount;
 // 包含了 userinfo 對象
 private UserInfo user;
}

程序的執(zhí)行結(jié)果如下圖所示:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

此時我們就需要使用特殊的手段來實現(xiàn)聯(lián)表查詢了。

通過VO對象??

ArticleInfo

package com.example.ssmdemo1.entity;

import lombok.Data;

import java.time.LocalDateTime;

@Data
public class ArticleInfo {
    private Integer id;
    private String title;
    private String content;
    private LocalDateTime createtime;
    private LocalDateTime updatetime;
    private int uid;
    private Integer rcount;
    private Integer state;
}

VO對象

package com.example.ssmdemo1.entity.vo;

import com.example.ssmdemo1.entity.ArticleInfo;

public class ArticleInfoVO extends ArticleInfo {
    private String username;

    @Override
    public String toString() {
        return "ArticleinfoVO{" +
                "username='" + username + '\'' +
                "} " + super.toString();
    }
}

?ArticleMapper.xml

進(jìn)行多表程序:

<?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.example.ssmdemo1.mapper.ArticleMapper">
    <select id="getById" resultType="com.example.ssmdemo1.entity.vo.ArticleInfoVO">
        select a.*,u.username from articleinfo a
        left join userinfo u on u.id=a.uid
        where a.id=#{id}
    </select>
</mapper>

單元測試:

package com.example.ssmdemo1.mapper;

import com.example.ssmdemo1.entity.vo.ArticleInfoVO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class ArticleMapperTest {
    @Autowired
    private ArticleMapper articleMapper;
    @Test
    void getById() {
        ArticleInfoVO articleInfoVO=articleMapper.getById(5);
        System.out.println(articleInfoVO);
    }
}

單元測試成功,查詢到了用戶id為5的 文章表的文章信息 和 用戶表中的用戶名:

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis

大部分時候多表聯(lián)查解決方案:

?聯(lián)表查詢語句(left join/inner)+xxxVO(新建的實體類)就可以解決

MyBatis查詢數(shù)據(jù)庫(3),Spring + Spring MVC + MyBatis,spring boot,java,spring,mybatis文章來源地址http://www.zghlxwxcb.cn/news/detail-627988.html

到了這里,關(guān)于MyBatis查詢數(shù)據(jù)庫(3)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 使用mybatis和dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫

    記錄 :415 場景 :使用mybatis和dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫。 版本 :JDK 1.8,Spring?Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源碼 :https://github.com/baomidou/dynamic-datasource-spring-boot-starter dynamic-datasource-spring-boot-starter :一個基于springboot的快

    2023年04月19日
    瀏覽(23)
  • spring boot shardingsphere mybatis-plus druid mysql 搭建mysql數(shù)據(jù)庫讀寫分離架構(gòu)

    spring boot shardingsphere mybatis-plus druid mysql 搭建mysql數(shù)據(jù)庫讀寫分離架構(gòu)

    ##關(guān)于window mysql主從搭建簡單教程 傳送門?window mysql5.7 搭建主從同步環(huán)境-CSDN博客 ##父pom.xml ##模塊pom.xml ##yml配置 ##mapper.xml ##TestMapper ##TestService ##TestController ##瀏覽器訪問 ##數(shù)據(jù)庫

    2024年01月21日
    瀏覽(26)
  • 使用dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫(MyBatis-3.5.9)

    記錄 :383 場景 :使用dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源,使用MyBatis操作數(shù)據(jù)庫。提供三種示例:一,使用@DS注解作用到類上。二,使用@DS注解作用到方法上。三,不使用注解,使用DynamicDataSourceContextHolder類在方法內(nèi)靈活切換不同數(shù)據(jù)源。 源碼: https://github.com/

    2024年01月20日
    瀏覽(25)
  • spring boot集成mybatis-plus——Mybatis Plus 查詢數(shù)據(jù)(圖文講解)

    spring boot集成mybatis-plus——Mybatis Plus 查詢數(shù)據(jù)(圖文講解)

    ?更新時間 2023-01-03 16:07:12 大家好,我是小哈。 本小節(jié)中,我們將學(xué)習(xí)如何通過 Mybatis Plus 查詢數(shù)據(jù)庫表中的數(shù)據(jù)。 在前面小節(jié)中,我們已經(jīng)定義好了一個用于測試的用戶表, 執(zhí)行腳本如下: 定義一個名為? User ?實體類: 不明白 Mybatis Plus 實體類注解的小伙伴,可參考前面

    2024年02月02日
    瀏覽(23)
  • 【Spring Boot】Spring Boot 配置 Hikari 數(shù)據(jù)庫連接池

    數(shù)據(jù)庫連接池是一個提高程序與數(shù)據(jù)庫的連接的優(yōu)化,連接池它主要作用是提高性能、節(jié)省資源、控制連接數(shù)、連接管理等操作; 程序中的線程池與之同理,都是為了優(yōu)化、提高性能。

    2024年02月11日
    瀏覽(29)
  • 【Spring Boot】通過AOP攔截Spring Boot日志并將其存入數(shù)據(jù)庫

    【Spring Boot】通過AOP攔截Spring Boot日志并將其存入數(shù)據(jù)庫

    在軟件開發(fā)中,常常需要記錄系統(tǒng)運行時的日志。日志記錄有助于排查系統(tǒng)問題、優(yōu)化系統(tǒng)性能、監(jiān)控操作行為等。本文將介紹如何使用Spring Boot和AOP技術(shù)實現(xiàn)攔截系統(tǒng)日志并保存到數(shù)據(jù)庫中的功能。 本文將通過以下步驟實現(xiàn)攔截系統(tǒng)日志并保存到數(shù)據(jù)庫中的功能: 配置數(shù)據(jù)

    2024年02月10日
    瀏覽(21)
  • Spring Boot:數(shù)據(jù)庫的整合

    Spring Boot:數(shù)據(jù)庫的整合

    在 Spring Boot :Web開發(fā)之視圖模板技術(shù)的整合 文章中,介紹了 Spring Boot 整合視圖模板技術(shù)。然而,僅僅整合視圖模板技術(shù)可能還不能滿足所有業(yè)務(wù)需求,因此還需要進(jìn)一步擴(kuò)展 Spring MVC 的默認(rèn)配置。 簡單補(bǔ)充說明 : 擴(kuò)展 Spring Boot 中的 Spring MVC 默認(rèn)配置通常涉及實現(xiàn) WebMvcC

    2024年04月13日
    瀏覽(33)
  • Spring日志完結(jié)篇,MyBatis操作數(shù)據(jù)庫(入門)

    Spring日志完結(jié)篇,MyBatis操作數(shù)據(jù)庫(入門)

    目錄 Spring可以對日志進(jìn)行分目錄打印 日志持久化(讓日志進(jìn)行長期的保存) MyBatis操作數(shù)據(jù)庫(優(yōu)秀的持久層框架) MyBatis的寫法 開發(fā)規(guī)范: 單元測試的寫法 傳遞參數(shù) 他的意思是說spring相關(guān)只打印INFO級別的標(biāo)準(zhǔn),但是他也能獲取到debug級別的日志 日志設(shè)置顏色(只能控制控制

    2024年02月04日
    瀏覽(44)
  • 【JavaEE & Spring】MyBatis 操作數(shù)據(jù)庫(基礎(chǔ)操作)

    【JavaEE & Spring】MyBatis 操作數(shù)據(jù)庫(基礎(chǔ)操作)

    使?MyBatis完成簡單的增刪改查操作, 參數(shù)傳遞. 掌握MyBatis的兩種寫法: 注解 和 XML?式 掌握MyBatis 相關(guān)的?志配置 在應(yīng)?分層學(xué)習(xí)時, 我們了解到web應(yīng)?程序?般分為三層,即:Controller、Service、Dao . 之前的案例中,請求流程如下: 瀏覽器發(fā)起請求, 先請求Controller, Controller接收

    2024年01月24日
    瀏覽(19)
  • Spring Security-查詢數(shù)據(jù)庫認(rèn)證

    Spring Security-查詢數(shù)據(jù)庫認(rèn)證

    整合mybatis-plus 完成數(shù)據(jù)庫操作 1.引入相關(guān)依賴 再父工程中 增加 mybatis-plus lombok mysql 相關(guān)依賴及版本號 再子項目中 引入? 2.創(chuàng)建表 user_info 3.創(chuàng)建實體類 4.整合mybatis-plus ,創(chuàng)建接口 繼承 BaseMapper 5.創(chuàng)建service 即UserDetailsService 接口實現(xiàn)類 6. 再啟動類增加 mapperscan 或 再 4的接口增

    2024年01月18日
    瀏覽(57)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包