项目中Mybatis、Proxool配置以及dao层的封装实例

Proxool数据库连接池管理工具包 Proxool是一种轻量级的Java JDBC连接池库,它的目标是提供简单易用的连接池功能,同时在性能上也不甘落后。相比于其他连接池技术,Proxool不仅能够高效地管理数据库连接,而且提供了更加灵活的配置选项,这对于需要精细控制数据库访问的场景尤其重要。在本文中,我们将深入了解Proxool的工作原理、版本更新、配置方法以及它支持的数据库系统,为IT专业人士提供一个全面的Proxool学习与应用指南。 阅读详情

一、准备工作:

1.数据库:项目中使用Mysql作为数据库

2.需要的相关jar,这里主要列出Mybatis、Proxool、Mysql相关jar:

mybatis-3.1.1.jar,mysql-connector-java-5.0.5-bin.jar、proxool-0.9.1.jar、proxool-cglib.jar


二、开始配置文件

1.Mybatis配置文件mybatis-config.xml

   <?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>
 <typeAliases>
  <typeAlias type="cn.com.test.ms.factory.ProxoolDataSourceFactory" alias="mysqlproxool"/><!--proxool连接池数据源,自定义-->
 </typeAliases>
 <environments default="development">
 

<!--连接池-->

 <environment id="proxool">  <!-- 修改这里以后必须同步修改application.properties文件mybatis_environment属性的值 -->
    <transactionManager type="JDBC" /> 
    <dataSource type="mysqlproxool"> 
    </dataSource> 
  </environment> 

<!--jdbc-->
  <environment id="mysql"> <!-- 修改这里以后必须同步修改application.properties文件mybatis_environment属性的值 -->
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver" />
   
    <property name="url" value="jdbc:mysql://172.0.0.1:3306/test?

autoReconnect=true&amp;failOverReadOnly=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
   
    <!-- 在任意时间存在的活动(也就是正在使用)连接的数量 -->
    <property name="poolMaximumActiveConnections" value="200"/>
   
    <!-- 任意时间存在的空闲连接数
    <property name="poolMaximumIdleConnections" value="5"/> -->
   
   </dataSource>
  </environment>
 </environments>
 <mappers>

 
  <mapper resource="cn/com/pkit/ms/model/User.xml" />


 </mappers>
</configuration>


2.Proxool配置文件proxool.xml


<?xml version="1.0" encoding="UTF-8" ?>
<something-else-entirely>
 <proxool>
  <alias>mysqlproxool</alias>
  <driver-class>com.mysql.jdbc.Driver</driver-class>
  <driver-url>jdbc:mysql://172.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</driver-url>
  <driver-properties>
   <property name="user" value="root" />
   <property name="password" value="root" />
  </driver-properties>
  <!-- proxool 自动侦察各个连接状态的时间间隔 ( 毫秒 ),侦察到空闲的连接就马上回收 , 超时的销毁 -->
  <house-keeping-sleep-time>60000</house-keeping-sleep-time>
  <!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数 , 超过这个请求数的用户连接就不会被接受 -->
  <!-- <maximum-new-connections>20</maximum-new-connections> -->
  <simultaneous-build-throttle>20</simultaneous-build-throttle>
  <!-- 最少保持的空闲连接数
  <prototype-count>5</prototype-count>-->
  <!-- 允许最大连接数 , 超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由 maximum-new-connections
   决定 -->
  <maximum-connection-count>500</maximum-connection-count>
  <!-- 最小连接数 -->
  <minimum-connection-count>5</minimum-connection-count> -->
  <!-- 在分配连接前后是否进行有效性测试 -->
  <test-before-use>true</test-before-use>
  <!--<test-after-use>true</test-after-use>-->
  <!-- 用于测试的 SQL -->
  <house-keeping-test-sql>select 1 from dual</house-keeping-test-sql>


<!-- 表示连接的最大活动时间,默认5分钟<maximum-active-time>300000</maximum-active-time>-->
 <maximum-active-time>18000000</maximum-active-time><!-- 300分钟 -->

 </proxool>
</something-else-entirely>


3.application.properties,选择使用jdbc 或者 连接池proxool


mybatis_environment=proxool
#mybatis_environment=mysql


三、代码


1.proxool数据源ProxoolDataSourceFactory

package cn.com.test.ms.factory;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.datasource.DataSourceFactory;
import org.logicalcobwebs.proxool.ProxoolDataSource;

public class ProxoolDataSourceFactory implements DataSourceFactory {

 protected ProxoolDataSource dataSource;
 
 public ProxoolDataSourceFactory(){
  dataSource = new ProxoolDataSource("mysqlproxool");  // alias参考proxool.xml 中标签<alias>的值
 }
 @Override
 public void setProperties(Properties props) {
 }

 @Override
 public DataSource getDataSource() {
  return dataSource;
 }

}


2.mybatis获取session工具类MybatisUtils

package cn.com.test.ms.util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 数据库CRUD 工具类
 * @author Administrator
 *
 */
public final class MybatisUtils {

 private static final String CONFIG_FILE = "mybatis-config.xml";
 private static final Logger logger = LoggerFactory.getLogger(MybatisUtils.class);
 private static final ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
 private static TransactionFactory transactionFactory = new JdbcTransactionFactory();
 private static SqlSessionFactory sqlSessionFactory = null;
 private static final String MYBATIS_ENVIRONMENT = ApplicationPropUtil.getValue("mybatis_environment");
 
 private MybatisUtils(){
 
 }
 
 static {
  buildSessionFactory();
 }
 
 /**
  * 获取session
  * @return SqlSession
  */
 public static SqlSession getSession(){
  SqlSession session = threadLocal.get();
  if (session == null){
   if(sqlSessionFactory == null){
    buildSessionFactory();
      }
   session = sqlSessionFactory != null ? sqlSessionFactory.openSession() : null;
   threadLocal.set(session);
  }
  
  return session;
 }
 
 /**
  * 关闭session
  */
 public static void closeSession(){
  SqlSession session = threadLocal.get();
  if (session != null){
   session.close();
   threadLocal.set(null);
  }
 }
 
 public static TransactionFactory getTransactionFactory(){
  return transactionFactory;
 }
 
 public static SqlSessionFactory getSessionFactory(){
  if (sqlSessionFactory == null){
   buildSessionFactory();
  }
  return sqlSessionFactory;
 }
 
 
 private static void buildSessionFactory(){
  if (sqlSessionFactory == null){
   InputStream inputStream = null;
   try {
    inputStream = Resources.getResourceAsStream(CONFIG_FILE);
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, MYBATIS_ENVIRONMENT);
//    addMapper(sqlSessionFactory);
   } catch (IOException e) {
    logger.error("读取mybatis-config.xml文件时出现异常,异常信息:" + e.getMessage());
    e.printStackTrace();
   } catch (Exception e){
    logger.error("创建SessionFactory失败,异常信息:" + e.getMessage());
    e.printStackTrace();
   } finally{
    if (inputStream != null){
     try {
      inputStream.close();
     } catch (IOException e) {
      e.printStackTrace();
     }
     inputStream = null;
    }
   }
  }
 }
 
// private static void addMapper(SqlSessionFactory sqlSessionFactory){
//  if (sqlSessionFactory != null){
//   sqlSessionFactory.getConfiguration().addMapper(MerchantInfoContentDao.class);
//  }
// }
 
}


3.读取properties工具类ApplicationPropUtil


package cn.com.test.ms.util;

import java.io.IOException;
import java.util.Properties;
/**
 * application.properties 工具
 * @author Administrator
 *
 */
public final class ApplicationPropUtil {

 private static final String NAME = "application.properties";
 
 //private static final String DEFAULT_KEY = "secret_key";
 
 private static final Properties AppProp = new Properties();
 
 static {
  try {
   AppProp.load(ApplicationPropUtil.class.getClassLoader().getResourceAsStream(NAME));
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 public static String getValue(String key){
  return AppProp.getProperty(key);
 }
 
 /**
  * 获取加密密钥
  * @return
  */
// public static String getDefaultValue(){
//  return getValue(DEFAULT_KEY);
// }
 
}


4.数据访问superDao

package cn.com.test.ms.dao.impl;

import java.sql.SQLException;
import java.util.List;

import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.wmf.tools.web.WebPage;

import cn.com.pkit.ms.util.MybatisUtils;

public class SuperDao{
 
 protected <T> List<T> selectList(String arg0, Object arg1) throws SQLException{
  SqlSession session = MybatisUtils.getSession();
  List<T> retList = null;
  if (session != null){
   retList = session.selectList(arg0, arg1);
  }
  MybatisUtils.closeSession();
  return retList;
 }
 
 protected long selectCount(String p,Object params) throws SQLException{
  SqlSession session = MybatisUtils.getSession();
  if(session!=null){
   Number total =(Number)session.selectOne(p,params);
   if(total==null) return 0;
   return total.longValue();
  }
  MybatisUtils.closeSession(); 
  return 0;
 }
 protected <T> List<T> selectList(String arg0) throws SQLException{
  SqlSession session = MybatisUtils.getSession();
  List<T> retList = null;
  if (session != null){
   retList = session.selectList(arg0);
  }
  MybatisUtils.closeSession();
  return retList;
 }
 
 protected <T> T selectOne(String arg0, Object arg1) throws SQLException{
  SqlSession session = MybatisUtils.getSession();
  T ret = null;
  if (session != null){
   ret = session.selectOne(arg0, arg1);
  }
  MybatisUtils.closeSession();
  return ret;
 }
 
 protected boolean save(String arg0, Object arg1) throws SQLException{
  SqlSession session = MybatisUtils.getSession();
  boolean ret = false;
  if (session != null){
   int affectedRows = session.insert(arg0, arg1);
   if (affectedRows > 0){
    ret = true;
   }
  }
  MybatisUtils.closeSession();
  return ret;
 }
 
 protected boolean update(String arg0, Object arg1) throws SQLException{
  SqlSession session = MybatisUtils.getSession();
  boolean ret = false;
  if (session != null){
   int affectedRows = session.update(arg0, arg1);
   if (affectedRows > 0){
    ret = true;
   }
  }
  MybatisUtils.closeSession();
  return ret;
 }
}


5.接口dao  UserDao


package cn.com.test.ms.dao;

import java.sql.SQLException;
import java.util.List;

import cn.com.test.ms.model.User;

public interface UserDao {
 
 /**
  * 查询用户
  * @param userId 用户编号
  * @return
  * @throws SQLException
  */
 User queryUser(String userId) throws SQLException;
 
}


6.接口daoimpl

package cn.com.test.ms.dao.impl;

import java.sql.SQLException;
import java.util.List;

import cn.com.test.ms.dao.UserDao;
import cn.com.test.ms.model.User;

public class UserDaoImpl extends SuperDao implements UserDao {

 @Override
 public User queryUser(String userId) throws SQLException {
  return selectOne("cn.com.pkit.ms.model.User.queryUser", userId);
 }

}


7.model  User

package cn.com.test.ms.model;

import java.io.Serializable;

public class User implements Serializable {

 /**
  *
  */
 private static final long serialVersionUID = -8709376412981684384L;

 private int id;
 private String userId;
 private String loginName;


 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getUserId() {
  return userId;
 }

 public void setUserId(String userId) {
  this.userId = userId;
 }

 public String getLoginName() {
  return loginName;
 }

 public void setLoginName(String loginName) {
  this.loginName = loginName;
 }

 @Override
 public String toString() {
  return "User [id=" + id + ", userId=" + userId + ", loginName="
    + loginName + "]";
 }

}


8.User.xml

<?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="cn.com.test.ms.model.User" >
 
 <resultMap type="cn.com.test.ms.model.User" id="User">
  <result property="id" column="ID" />
  <result property="userId" column="UserID" />
  <result property="loginName" column="LoginName" />
 </resultMap>
 
 <select id="queryUser" parameterType="java.lang.String" resultMap="User">
  <![CDATA[
   select t1.ID as ID,t1.UserID as UserID,
   t1.LoginName as LoginName from t_user t1 where t1.UserID=#{userId}
  ]]>
 </select>
 
</mapper>

 

结束

proxool与mybatis整合例子 Proxool & Mybatis整合的配置及例子(无spring依赖) 立即下载

相关推荐

【CTFWP】ctfshow-web40

CTFWP:ctfshow-web40

LongL_GuYu的博客 1863

proxool数据库连接池用法

proxool项目已经很久没人维护了.但使用者确依然广泛。他最诱人的地方是提供了一个监控管理页面.这是与其他开源数据库连接池不同的地方所在.但这个功能也不是特别强大,因为DBCP也有类似的接口,只是我们需要自己写GUI而已. 下面我们循序渐进,通过以下几种方式来进行分析.以下所有代码,都经过本人亲自运行测试. 一 准备工作 下载项目,http://proxool.sourceforge.ne...

报喜鸟 319

【AI蛋白预测实战】零门槛在Colab上运行AlphaFold2全流程解析

本文为零基础用户提供了在谷歌Colab平台上运行AlphaFold2进行蛋白质结构预测的完整实战指南。通过ColabFold项目,用户无需本地高性能硬件,即可免费利用云端GPU完成从序列输入到3D结构生成和结果可视化的全流程,大幅降低了AI蛋白预测的技术门槛。

mqtt6iot的博客 913

mybatis+proxool 实现第三方数据库连接池

mybatis不直接支持第三方的数据库连接池,需要自己建DataSourceFactory。 用到的jar:mybatis-3.0.4.jar、proxool-0.9.1.jar、proxool-cglib.jar等。 ProxoolDataSourceFactory.java代码如下: public class ProxoolDataSourceFactory implements Dat

xiaotom5的专栏 1825

基于STM32设计的老人防摔倒报警设备(OneNet)_65

本文设计了一种基于STM32单片机的智能老人防摔倒报警设备。该系统结合MPU6050陀螺仪传感器实时监测老人的姿态变化,检测摔倒事件;通过SIM800C通信模块发送短信通知紧急联系人,并将GPS定位信息上传至云端平台,确保家属能够及时了解老人的准确位置。

1万+

Linkage Mapper 工具参数详解——Building Network and Map Linkages

此文档用于解析使用LinkageMapper各输入输出参数详情以及可能的影响,并介绍了如何解释模型输出结果和输出参数,适合刚入手的人。篇幅很长很啰嗦,是因为每个参数都解释的万分细致。

sumuses的博客 6119

Proxool & Mybatis整合的配置及例子(无spring依赖)

         Proxool是一个非常优秀的数据库连接池组件, 下面介绍如何在无spring容器的环境下让Mybatis调用Proxool管理的数据库连接.        首先,我们定义ProxoolUtils工具类,提供loadProxool方法加载数据库连接池.package com.freestyle.common.db.proxool; /*** * Proxool工具类 * @a...

rocklee的专栏 963

手把手教你学Simulink——基于Simulink的输入输出线性化精确转矩控制

由于IOFL控制律中实时引入了当前状态的反馈(id​,iq​,ωe​),电感的变化被非线性项自动补偿,转矩仅出现微小幅度的波动(< 2%),展现出极强的参数鲁棒性。:电压方程中的耦合项(ωe​Lq​iq​和 −ωe​Ld​id​)仅通过前馈补偿,当转速 ωe​较高时,微小的前馈误差会导致显著的d-q轴电流交叉耦合;其中,ud​,uq​为定子电压,id​,iq​为定子电流,Rs​为定子电阻,Ls​为定子电感,ωe​为电角速度,ψf​为永磁体磁链,p为极对数。(步长 Ts​=10μs,即100ns?

MHD0815的博客 85

proxool mysql 驱动_proxool 数据库连接池 取得datasource | 学步园

普通配置proxool.xml文件:dbjdbc:mysql://localhost:3306/ttcom.mysql.jdbc.Driver900020510010代码:/*** 普通配置文件实现方式,用的是proxool.xml的配置*/ProxoolDataSource proxoolDataSource = null;try {Class.forName("org.logicalcobwe...

weixin_42465030的博客 279

【Python爬虫系列】_005.浏览器开发者工具(详解)

Elements(元素)分析当前页面节点,用来辅助书写BS或者XPath这里面的数据与源代码有区别,不一定准确(避坑)Console(控制台)这个除了查看错误信息、打印调试信息(console.log())、写一些测试脚本以外,还可以当作Javascript API查看用例如我想查看console都有哪些方法和属性,我可以直接在Console中输入"console"并执行后续学js逆向的时候需要用到Sources(源代码)与在网页页面,鼠标右键——查看网页源代码 内容一致。

weixin_50296259的博客 423

手把手教你从入门到精通C# 操作MySql数据库

本文是《C#操作MySql数据库从入门到精通》专栏的导读,帮助大家知道学习本专栏能够获取什么!

qq_34059233的博客 1935

Maven项目集成MyBatis框架

看前必读:本人目前正在学习SSM框架的相关内容,此博客多为博主的笔记。基于Maven项目构建SSM的顺序分别是:① Spring; ② Spring MVC;③ MyBatis,所以在开始读本篇博客之前,可以先去看一看本人所写的集成Spring和Spring MVC框架的两篇博客。 Maven项目集成Spring框架:https://blog.csdn.net/zqq_2016/article/details/114703395 Maven项目集成Spring MVC框架:https://blog.c...

zqq_2016的博客 797

dify安装ollama插件及OLLAMA模型添加失败问题完整解决方法

plugin_daemon-1 | 2025/05/10 17:37:36 stdio.go:160: [INFO]plugin langgenius/ollama:0.0.6: Installed model: ollama 提示ollama安装成功,再添加模型就不会有问题了。安装dify1.2.0和1.3.1均出现OLLAMA插件安装失败或插件安装后添加模型失败的问题,具体表现为一是添加ollama插件时没反应,需要二次添加才成功;二是添加模型时点保存报500错误或点保存后没反应,无法成功添加。

symstandsun的博客 9080

Spring下 mybatis 多数据源配置

  本文非原创!  Spring下 mybatis 多数据源配置 介绍 本文描述了以 mybatis 作为持久层框架使用 Spring的声明式事务时,如何配置多个数据源(即连接多个数据库),使用 Spring 的注解方式迚行依赖的注入和事务的管理。并且利用 mybatis 的spring 插件自动扫描和装配 Mapper 接口。 先来看一个mybatis 的单数据源配置 &lt...

yinhong2006的专栏 139

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

springMvc中配置多个数据源

首先声明,我采用的是myBatis连接的数据库哈 1. 我们需要在配置数据库相关信息, 如果有多个数据库,复制一份下面的配置,修改DBPool1 名字和driver-url ,user, password jdbc-mysql.proxool.alias=DBPool1 jdbc-mysql.proxool.driver-class=com.mysql.jdbc.Driver jdbc...

weixin_30263277的博客 528

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring下mybatis 多数据源配置

描述以 mybatis 作为持久层框架使用 Spring 的声明式事务时,如何配置多个数据源(即连接多个数据库),使用 Spring 的注解方式进行依赖的注入和事务的管理。并 且利用 mybatis的spring插件自动扫描和装配 Mapper接口。    先来看一个 mybatis的单数据源配置                                       

hdkylaowu的专栏 613

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring 与 MyBatis 的整合

1.整合思路   思路:将MyBatis框架中使用到的核心组件配置到Spring容器中,交给Spring来创建和管理。   具体来说是将需要自行编码通过SqlSessionFactoryBuilder读取配置文件、构建SqlSessionFactory,进而获得SqlSession实例,满足业务逻辑对象对于数据访问的需要的工作交由Spring来完成,发挥Spring框架Bean容器的作用,接管组件...

MinSunshine的博客 663

MyBatis与Spring的整合

1.Spring对MyBaits的整合思路 作为Bea容器,Spring框架提供了IoC机制,可以接管所有组件的创建工作并进行依赖管理因而整合的主要工作就是把 MyBatis框架使用中所涉及的核心组件配置到Spring容器中,交给Spring来创建和管理。 2. MyBatis与Spring的整合 对于任何持久化解决方案,数据库连接都是首先要解决的问题。在Spring中,数据源作为一个重要的组件可...

lyw1220019546的博客 212

Spring下mybatis多数据源配置

转载自http://wenku.baidu.com/view/3cf8c141336c1eb91a375d8b.html 介绍  本文描述了以mybatis作为持久层框架使用Spring的声明式事务时,如何配置多个数据源(即连接多个数据库),使用Spring的注解方式进行依赖的注入和事务的管理。并且利用mybatis的spring插件自动扫描和装配Mapper接口。   先来看一个myb

u014046328的博客 416

JavaWeb基盘3——数据访问

dao层,也就是数据访问层 1.包含3个部品 dao接口 dao接口的实现 mybatis jdbc 连接池 2.通用dao部品 IBaseDao Dao层必须实现的接口,在IBaseDao实现了最基本的增删改查 IBatchDao 需要批量处理数据 IPagedDao 需要实现分页功能 IAdvanceDao

张永光的博客 2万+

Maven + Spring 整合 Mybatis

运行环境:maven + spring4.0.0 + mybatis3.2.4 + mybatis-spring1.2.2 一、编辑pom.xml配置文件,添加依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xs

dbeautifulLife的博客 425

springboot-druid数据源

    DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP快)。创建项目创建项目如下:在pom.xml中引入依赖jar包&lt;?xml version="1.0" encoding="UT...

奋斗的小鸟专栏 850

spring+mybatis多数据源的配置

解决方案: 多套sqlSessionFactory,针对不同的数据源 数据源 &lt;something-else-entirely&gt; &lt;proxool&gt; &lt;alias&gt;peccancy&lt;/alias&gt; &lt;driver-url&gt;jdbc:oracle:thin:@172.16.60.46:1521:orcl&lt;/d...

飞翔的天空 220
下一篇: Unable to add the follwing facets to project: Axis2 Web Services Extensions, Axis Web Services Core.
chen_erliu
博客等级 码龄14年 7粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值