Mybatis中配置Mapper的方法

我们知道在Mybatis中定义Mapper信息有两种方式,一种是利用xml写一个对应的包含Mapper信息的配置文件;另一种就是定义一个Mapper接口,然后定义一些相应的操作方法,再辅以相应的操作注解。

现假设我有这样一个实体类:

Java代码 复制代码 收藏代码
  1. package com.tiantian.mybatis.model;
  2. public class User {
  3. private int id;
  4. private String name;
  5. private int age;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getAge() {
  19. return age;
  20. }
  21. public void setAge(int age) {
  22. this.age = age;
  23. }
  24. }
package com.tiantian.mybatis.model; public class User {     private int id;    private String name;    private int age;    public int getId() {       return id;    }    public void setId(int id) {       this.id = id;    }    public String getName() {       return name;    }    public void setName(String name) {       this.name = name;    }    public int getAge() {       return age;    }    public void setAge(int age) {       this.age = age;    }   }

它对应的数据库表结构是这样的:


然后我要利用Mybatis对它做一个简单的增删改查操作,那么如果利用xml配置Mapper的方式来定义的话,我对应的UserMapper.xml文件会是这样:

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.tiantian.mybatis.mapper.UserMapper">
  6. <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyColumn="id">
  7. insert into t_user(name, age) values(#{name}, #{age})
  8. </insert>
  9. <update id="updateUser" parameterType="User">
  10. update t_user set name=#{name}, age=#{age} where id=#{id}
  11. </update>
  12. <select id="findById" parameterType="int" resultType="User">
  13. select * from t_user where id=#{id}
  14. </select>
  15. <delete id="deleteUser" parameterType="int">
  16. delete from t_user where id=#{id}
  17. </delete>
  18. </mapper>
<?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.tiantian.mybatis.mapper.UserMapper">    <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyColumn="id">       insert into t_user(name, age) values(#{name}, #{age})    </insert>       <update id="updateUser" parameterType="User">       update t_user set name=#{name}, age=#{age} where id=#{id}    </update>       <select id="findById" parameterType="int" resultType="User">       select * from t_user where id=#{id}    </select>       <delete id="deleteUser" parameterType="int">       delete from t_user where id=#{id}    </delete></mapper>

如果使用接口加注解的方式,那么我们的UserMapper接口应该这样定义:

Java代码 复制代码 收藏代码
  1. package com.tiantian.mybatis.mapperinterface;
  2. import org.apache.ibatis.annotations.Delete;
  3. import org.apache.ibatis.annotations.Insert;
  4. import org.apache.ibatis.annotations.Select;
  5. import org.apache.ibatis.annotations.Update;
  6. import com.tiantian.mybatis.model.User;
  7. public interface UserMapper {
  8. @Insert("insert into t_user(name, age) values(#{name}, #{age})")
  9. public void insertUser(User user);
  10. @Update("update t_user set name=#{name}, age=#{age} where id=#{id}")
  11. public void updateUser(User user);
  12. @Select("select * from t_user where id=#{id}")
  13. public User findById(int id);
  14. @Delete("delete from t_user where id=#{id}")
  15. public void deleteUser(int id);
  16. }
package com.tiantian.mybatis.mapperinterface; import org.apache.ibatis.annotations.Delete;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.Update; import com.tiantian.mybatis.model.User; public interface UserMapper {     @Insert("insert into t_user(name, age) values(#{name}, #{age})")    public void insertUser(User user);       @Update("update t_user set name=#{name}, age=#{age} where id=#{id}")    public void updateUser(User user);       @Select("select * from t_user where id=#{id}")    public User findById(int id);       @Delete("delete from t_user where id=#{id}")    public void deleteUser(int id);   }

注意看这里我故意把UserMapper接口的namespace也就是它的包名置为与UserMapper.xml的namespace属性不一样。这主要是为了要更好的讲以下的内容。

接下来要做的就是把Mapper信息注册到Mybatis的配置中,告诉Mybatis我们定义了哪些Mapper信息。这主要是在Mybatis的配置文件中通过mappers元素来进行的。在以前版本的Mybatis中我们在Mybatis的配置文件中需要这样定义Mapper信息资源的位置。

Xml代码 复制代码 收藏代码
  1. <mappers>
  2. <mapper resource="com/tiantian/mybatis/mapper/UserMapper1.xml"/>
  3. <mapper url="file:///E:/UserMapper.xml"/>
  4. </mappers>
    <mappers>       <mapper resource="com/tiantian/mybatis/mapper/UserMapper1.xml"/>       <mapper url="file:///E:/UserMapper.xml"/>    </mappers>

这主要是通过mapper元素的resource和url属性来指定的,resource属性指定的是相对于跟类路径下的资源,url属性指定的是通过URL可以获取到的资源。这有一点不好的地方,当我们使用Mapper接口加注解来定义当前Mapper的操作信息时,我们还需要定义一个与它对应的Mapper.xml文件。如:

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.tiantian.mybatis.mapperinterface.UserMapper">
  6. </mapper>
<?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.tiantian.mybatis.mapperinterface.UserMapper"> </mapper>

Java代码 复制代码 收藏代码
  1. package com.tiantian.mybatis.mapperinterface;
  2. import org.apache.ibatis.annotations.Delete;
  3. import org.apache.ibatis.annotations.Insert;
  4. import org.apache.ibatis.annotations.Select;
  5. import org.apache.ibatis.annotations.Update;
  6. import com.tiantian.mybatis.model.User;
  7. public interface UserMapper {
  8. @Insert("insert into t_user(name, age) values(#{name}, #{age})")
  9. public void insertUser(User user);
  10. @Update("update t_user set name=#{name}, age=#{age} where id=#{id}")
  11. public void updateUser(User user);
  12. @Select("select * from t_user where id=#{id}")
  13. public User findById(int id);
  14. @Delete("delete from t_user where id=#{id}")
  15. public void deleteUser(int id);
  16. }
package com.tiantian.mybatis.mapperinterface; import org.apache.ibatis.annotations.Delete;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.Update; import com.tiantian.mybatis.model.User; public interface UserMapper {     @Insert("insert into t_user(name, age) values(#{name}, #{age})")    public void insertUser(User user);       @Update("update t_user set name=#{name}, age=#{age} where id=#{id}")    public void updateUser(User user);       @Select("select * from t_user where id=#{id}")    public User findById(int id);       @Delete("delete from t_user where id=#{id}")    public void deleteUser(int id);   }

我发现在现在使用的这个Mybatis3.2.1中这个问题已经得到了改善,现在我们在定义基于接口的定义的Mapper时可以通过一个class属性来指定接口。

Xml代码 复制代码 收藏代码
  1. <mappers>
  2. <mapper class="com.tiantian.mybatis.mapperinterface.UserMapper"/>
  3. </mappers>
    <mappers>       <mapper class="com.tiantian.mybatis.mapperinterface.UserMapper"/>    </mappers>

除了通过class属性指定Mapper接口外,Mybatis还为我们提供了一个可以同时指定多个Mapper接口的方法。在现在的Mybatis版本中我们可以在mappers元素下面定义一个package子元素,用以指定Mapper接口所在的包,这样Mybatis就会把这个包下面的所有Mapper接口都进行注册。

Xml代码 复制代码 收藏代码
  1. <mappers>
  2. <package name="com.tiantian.mybatis.mapperinterface"/>
  3. </mappers>
    <mappers>       <package name="com.tiantian.mybatis.mapperinterface"/>    </mappers>

这里的一个package只针对于一个包。当在多个包里面定义有Mapper接口时,我们需要定义对应的多个package元素。

这四种注册Mapper的方式就是我想在这篇文章中表达的。总结一下:

Xml代码 复制代码 收藏代码
  1. <mappers>
  2. <!-- 通过package元素将会把指定包下面的所有Mapper接口进行注册 -->
  3. <package name="com.tiantian.mybatis.mapperinterface"/>
  4. <!-- 通过mapper元素的resource属性可以指定一个相对于类路径的Mapper.xml文件 -->
  5. <mapper resource="com/tiantian/mybatis/mapper/UserMapper.xml"/>
  6. <!-- 通过mapper元素的url属性可以指定一个通过URL请求道的Mapper.xml文件 -->
  7. <mapper url="file:///E:/UserMapper.xml"/>
  8. <!-- 通过mapper元素的class属性可以指定一个Mapper接口进行注册 -->
  9. <mapper class="com.tiantian.mybatis.mapperinterface.UserMapper"/>
  10. </mappers>
    <mappers>       <!-- 通过package元素将会把指定包下面的所有Mapper接口进行注册 -->       <package name="com.tiantian.mybatis.mapperinterface"/>       <!-- 通过mapper元素的resource属性可以指定一个相对于类路径的Mapper.xml文件 -->       <mapper resource="com/tiantian/mybatis/mapper/UserMapper.xml"/>       <!-- 通过mapper元素的url属性可以指定一个通过URL请求道的Mapper.xml文件 -->       <mapper url="file:///E:/UserMapper.xml"/>       <!-- 通过mapper元素的class属性可以指定一个Mapper接口进行注册 -->       <mapper class="com.tiantian.mybatis.mapperinterface.UserMapper"/>    </mappers>

当使用mapper元素进行Mapper定义的时候需要注意:mapper的三个属性resource、url和class对于每个mapper元素只能指定一个,要么指定resource属性,要么指定url属性,要么指定class属性,不能都指定,也不能都不指定。

下面将对上面的代码给出一些对应的测试代码。先贴出测试对应的Mybatis的配置文件:

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <properties resource="config/jdbc.properties"></properties>
  7. <typeAliases>
  8. <package name="com.tiantian.mybatis.model"/>
  9. </typeAliases>
  10. <environments default="development">
  11. <environment id="development">
  12. <transactionManager type="JDBC" />
  13. <dataSource type="POOLED">
  14. <property name="driver" value="${jdbc.driver}" />
  15. <property name="url" value="${jdbc.url}" />
  16. <property name="username" value="${jdbc.username}" />
  17. <property name="password" value="${jdbc.password}" />
  18. </dataSource>
  19. </environment>
  20. </environments>
  21. <mappers>
  22. <package name="com.tiantian.mybatis.mapperinterface"/>
  23. <mapper resource="com/tiantian/mybatis/mapper/UserMapper.xml"/>
  24. </mappers>
  25. </configuration>
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>     <properties resource="config/jdbc.properties"></properties>    <typeAliases>       <package name="com.tiantian.mybatis.model"/>    </typeAliases>    <environments default="development">       <environment id="development">           <transactionManager type="JDBC" />           <dataSource type="POOLED">              <property name="driver" value="${jdbc.driver}" />              <property name="url" value="${jdbc.url}" />              <property name="username" value="${jdbc.username}" />              <property name="password" value="${jdbc.password}" />           </dataSource>       </environment>    </environments>    <mappers>       <package name="com.tiantian.mybatis.mapperinterface"/>       <mapper resource="com/tiantian/mybatis/mapper/UserMapper.xml"/>    </mappers></configuration>

1.对于使用xml方式定义的UserMapper.xml,然后直接使用SqlSession访问定义在其中的statement的测试:

Java代码 复制代码 收藏代码
  1. package com.tiantian.mybatis.test;
  2. import org.apache.ibatis.session.SqlSession;
  3. import org.apache.ibatis.session.SqlSessionFactory;
  4. import org.junit.Before;
  5. import org.junit.Test;
  6. import com.tiantian.mybatis.model.User;
  7. import com.tiantian.mybatis.util.Util;
  8. /**
  9. *
  10. * 这个类主要用来测试直接使用SqlSession访问定义在UserMapper.xml文件中的statement
  11. *
  12. */
  13. public class UserMapperTest {
  14. SqlSessionFactory sqlSessionFactory = null;
  15. @Before
  16. public void before() {
  17. sqlSessionFactory = Util.getSqlSessionFactory();
  18. }
  19. @Test
  20. public void testInsert() {
  21. SqlSession sqlSession = sqlSessionFactory.openSession();
  22. try {
  23. User user = new User();
  24. user.setName("张三");
  25. user.setAge(30);
  26. sqlSession.insert("com.tiantian.mybatis.mapper.UserMapper.insertUser", user);
  27. sqlSession.commit();
  28. } finally {
  29. sqlSession.close();
  30. }
  31. }
  32. @Test
  33. public void testUpdate() {
  34. SqlSession sqlSession = sqlSessionFactory.openSession();
  35. try {
  36. User user = new User();
  37. user.setId(1);
  38. user.setName("李四");
  39. user.setAge(34);
  40. sqlSession.update("com.tiantian.mybatis.mapper.UserMapper.updateUser", user);
  41. sqlSession.commit();
  42. } finally {
  43. sqlSession.close();
  44. }
  45. }
  46. @Test
  47. public void testFind() {
  48. SqlSession sqlSession = sqlSessionFactory.openSession();
  49. try {
  50. User user = sqlSession.selectOne("com.tiantian.mybatis.mapper.UserMapper.findById", 1);
  51. System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());
  52. } finally {
  53. sqlSession.close();
  54. }
  55. }
  56. @Test
  57. public void testDelele() {
  58. SqlSession sqlSession = sqlSessionFactory.openSession();
  59. try {
  60. sqlSession.delete("com.tiantian.mybatis.mapper.UserMapper.deleteUser", 2);
  61. sqlSession.commit();
  62. } finally {
  63. sqlSession.close();
  64. }
  65. }
  66. }
package com.tiantian.mybatis.test; import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Before;import org.junit.Test; import com.tiantian.mybatis.model.User;import com.tiantian.mybatis.util.Util; /** * * 这个类主要用来测试直接使用SqlSession访问定义在UserMapper.xml文件中的statement * */public class UserMapperTest {     SqlSessionFactory sqlSessionFactory = null;       @Before    public void before() {       sqlSessionFactory = Util.getSqlSessionFactory();    }       @Test    public void testInsert() {       SqlSession sqlSession = sqlSessionFactory.openSession();       try {           User user = new User();           user.setName("张三");           user.setAge(30);           sqlSession.insert("com.tiantian.mybatis.mapper.UserMapper.insertUser", user);           sqlSession.commit();       } finally {           sqlSession.close();       }    }       @Test    public void testUpdate() {       SqlSession sqlSession = sqlSessionFactory.openSession();       try {           User user = new User();           user.setId(1);           user.setName("李四");           user.setAge(34);           sqlSession.update("com.tiantian.mybatis.mapper.UserMapper.updateUser", user);           sqlSession.commit();       } finally {           sqlSession.close();       }    }       @Test    public void testFind() {       SqlSession sqlSession = sqlSessionFactory.openSession();       try {           User user = sqlSession.selectOne("com.tiantian.mybatis.mapper.UserMapper.findById", 1);           System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());       } finally {           sqlSession.close();       }    }       @Test    public void testDelele() {       SqlSession sqlSession = sqlSessionFactory.openSession();       try {           sqlSession.delete("com.tiantian.mybatis.mapper.UserMapper.deleteUser", 2);           sqlSession.commit();       } finally {           sqlSession.close();       }    }   }

2.对于使用Mapper接口加对应的注解来定义的Mapper信息直接使用SqlSession访问Mapper接口中使用注解定义好的statement的测试:

Java代码 复制代码 收藏代码
  1. package com.tiantian.mybatis.test;
  2. import org.apache.ibatis.session.SqlSession;
  3. import org.apache.ibatis.session.SqlSessionFactory;
  4. import org.junit.Before;
  5. import org.junit.Test;
  6. import com.tiantian.mybatis.model.User;
  7. import com.tiantian.mybatis.util.Util;
  8. /**
  9. *
  10. *这个类是测试直接使用SqlSession访问UserMapper接口中使用注解定义好的statement
  11. *
  12. */
  13. public class UserMapperTest2 {
  14. SqlSessionFactory sqlSessionFactory = null;
  15. @Before
  16. public void before() {
  17. sqlSessionFactory = Util.getSqlSessionFactory();
  18. }
  19. @Test
  20. public void testInsert() {
  21. SqlSession sqlSession = sqlSessionFactory.openSession();
  22. try {
  23. User user = new User();
  24. user.setName("张三");
  25. user.setAge(30);
  26. sqlSession.insert("com.tiantian.mybatis.mapperinterface.UserMapper.insertUser", user);
  27. sqlSession.commit();
  28. } finally {
  29. sqlSession.close();
  30. }
  31. }
  32. @Test
  33. public void testUpdate() {
  34. SqlSession sqlSession = sqlSessionFactory.openSession();
  35. try {
  36. User user = new User();
  37. user.setId(1);
  38. user.setName("李四");
  39. user.setAge(34);
  40. sqlSession.update("com.tiantian.mybatis.mapperinterface.UserMapper.updateUser", user);
  41. sqlSession.commit();
  42. } finally {
  43. sqlSession.close();
  44. }
  45. }
  46. @Test
  47. public void testFind() {
  48. SqlSession sqlSession = sqlSessionFactory.openSession();
  49. try {
  50. User user = sqlSession.selectOne("com.tiantian.mybatis.mapperinterface.UserMapper.findById", 1);
  51. System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());
  52. } finally {
  53. sqlSession.close();
  54. }
  55. }
  56. @Test
  57. public void testDelele() {
  58. SqlSession sqlSession = sqlSessionFactory.openSession();
  59. try {
  60. sqlSession.delete("com.tiantian.mybatis.mapperinterface.UserMapper.deleteUser", 3);
  61. sqlSession.commit();
  62. } finally {
  63. sqlSession.close();
  64. }
  65. }
  66. }
package com.tiantian.mybatis.test; import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Before;import org.junit.Test; import com.tiantian.mybatis.model.User;import com.tiantian.mybatis.util.Util; /** * *这个类是测试直接使用SqlSession访问UserMapper接口中使用注解定义好的statement * */public class UserMapperTest2 {        SqlSessionFactory sqlSessionFactory = null;             @Before       public void before() {              sqlSessionFactory = Util.getSqlSessionFactory();       }             @Test       public void testInsert() {              SqlSession sqlSession = sqlSessionFactory.openSession();              try {                     User user = new User();                     user.setName("张三");                     user.setAge(30);                     sqlSession.insert("com.tiantian.mybatis.mapperinterface.UserMapper.insertUser", user);                     sqlSession.commit();              } finally {                     sqlSession.close();              }       }             @Test       public void testUpdate() {              SqlSession sqlSession = sqlSessionFactory.openSession();              try {                     User user = new User();                     user.setId(1);                     user.setName("李四");                     user.setAge(34);                     sqlSession.update("com.tiantian.mybatis.mapperinterface.UserMapper.updateUser", user);                     sqlSession.commit();              } finally {                     sqlSession.close();              }       }             @Test       public void testFind() {              SqlSession sqlSession = sqlSessionFactory.openSession();              try {                     User user = sqlSession.selectOne("com.tiantian.mybatis.mapperinterface.UserMapper.findById", 1);                     System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());              } finally {                     sqlSession.close();              }       }             @Test       public void testDelele() {              SqlSession sqlSession = sqlSessionFactory.openSession();              try {                     sqlSession.delete("com.tiantian.mybatis.mapperinterface.UserMapper.deleteUser", 3);                     sqlSession.commit();              } finally {                     sqlSession.close();              }       }      }

3.对于使用Mapper接口加注解定义好的Mapper信息通过SqlSession获取其对应的Mapper接口来操作其中定义好的statement的测试:

Java代码 复制代码 收藏代码
  1. package com.tiantian.mybatis.test;
  2. import org.apache.ibatis.session.SqlSession;
  3. import org.apache.ibatis.session.SqlSessionFactory;
  4. import org.junit.Before;
  5. import org.junit.Test;
  6. import com.tiantian.mybatis.mapperinterface.UserMapper;
  7. import com.tiantian.mybatis.model.User;
  8. import com.tiantian.mybatis.util.Util;
  9. /**
  10. *
  11. *这个类是测试使用SqlSession获取UserMapper接口来执行使用注解定义在UserMapper接口中的statement
  12. *
  13. */
  14. public class UserMapperTest3 {
  15. SqlSessionFactory sqlSessionFactory = null;
  16. @Before
  17. public void before() {
  18. sqlSessionFactory = Util.getSqlSessionFactory();
  19. }
  20. @Test
  21. public void testInsert() {
  22. SqlSession sqlSession = sqlSessionFactory.openSession();
  23. try {
  24. User user = new User();
  25. user.setName("张三");
  26. user.setAge(30);
  27. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  28. userMapper.insertUser(user);
  29. sqlSession.commit();
  30. } finally {
  31. sqlSession.close();
  32. }
  33. }
  34. @Test
  35. public void testUpdate() {
  36. SqlSession sqlSession = sqlSessionFactory.openSession();
  37. try {
  38. User user = new User();
  39. user.setId(1);
  40. user.setName("李四");
  41. user.setAge(34);
  42. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  43. userMapper.updateUser(user);
  44. sqlSession.commit();
  45. } finally {
  46. sqlSession.close();
  47. }
  48. }
  49. @Test
  50. public void testFind() {
  51. SqlSession sqlSession = sqlSessionFactory.openSession();
  52. try {
  53. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  54. User user = userMapper.findById(1);
  55. System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());
  56. } finally {
  57. sqlSession.close();
  58. }
  59. }
  60. @Test
  61. public void testDelele() {
  62. SqlSession sqlSession = sqlSessionFactory.openSession();
  63. try {
  64. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  65. userMapper.deleteUser(5);
  66. sqlSession.commit();
  67. } finally {
  68. sqlSession.close();
  69. }
  70. }
  71. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值