JDBC-DBUtils工具类的使用

简化JDBC操作的DBUtils工具类实践 DBUtils是一个流行的Java数据库工具包,旨在简化数据库操作,使开发者能够以更高效、更简洁的方式与数据库进行交互。其核心目标是减少重复代码和提高代码的可读性,利用面向对象的思想,以更优的方式封装JDBC(Java Database Connectivity)操作。通过提供一组简单且强大的工具类,DBUtils帮助开发者从复杂的JDBC编程模式中解脱出来,专注于业务逻辑的实现。它主要通过封装资源管理(如数据库连接、结果集处理等)和提供查询执行机制来达成目标,从而使得数据库操作更加安全、简便。 阅读详情
DBUtils
java编程中数据库操作的实用工具,JDBC的简化开发工具包
三大核心类
QueryRunner 提供对sql语句操作的API
ResultSetHandler 接口,用于定义select操作后封装结果集
DbUtils 提供释放资源与事务处理的方法
主要使用方法: closeQuietly(Connection conn) //释放资源且不会抛出异常


QueryRunner
update(Connection conn,String sql,Object... params)
使用update()方法进行对数据库的增删改,返回int类型数据
这个int类型数据其实就是你执行成功了多少行sql语句
参数:
conn,数据库连接对象
sql,数据库增删改语句
Object... params,可变参数,用来对?占位符需要的参数传递

query(Connection conn, String sql, ResultSetHandler<T> rsh
, Object... params)

使用query方法进行数据库查找,返回T泛型数据
这个T泛型数据其实就是保存数据的结果集类型
参数:
conn,数据库连接对象
sql,数据库增删改语句
rsh,结果集类型

Object... params,可变参数,用来对?占位符需要的参数传递

ResultSetHandler
接口,用于定义select操作后封装结果集,常用有八大实现类
ArrayHandler:用数组接收查询的第一行结果
Object[] result = qr.query(conn, sql, new ArrayHandler(),params);

ArrayListHandler:用List集合接收多个查询后每行结果的数组对象
List<Object[]> result = qr.query(conn, sql, new ArrayListHandler(), params);

BeanHandler:用一个Bean类接收查询的第一行结果(Bean为自己创建的一个类,下面有例子)
Sort result = qr.query(conn, sql,new BeanHandler<Sort>(Sort.class),params);

BeanListHandler:用List集合接收多个查询后每行结果的Bean类对象
List<Sort> result = qr.query(conn, sql, new BeanListHandler<Sort>(Sort.class), params);

ColumnListHandler:用List集合接收查询的列信息
List<Object> result = qr.query(conn, sql, new ColumnListHandler<>("sname"), params);

ScalarHandler:用普通基本类型或引用类型变量接收一个查询结果
long result = qr.query(conn, sql, new ScalarHandler<>(), params);

MapHandler:用Map集合接收查询的第一行结果,键为列名,值为第一行对应数据
Map<String, Object> result = qr.query(conn, sql, new MapHandler(), params);

MapListHandler:用List集合接收多个查询后每行结果的Map对象

List<Map<String,Object>> result = qr.query(conn, sql, new MapListHandler(), params);

一个标准Bean类

package JDBCdomain;
//创建的Bean类需要有无参构造,因为在BeanHandler中查询结果有可能在数据库中没有,就返回null,如果没有无参构造会抛出RuntimeException
public class Sort {
	private int sid;
	private String sname;
	private double sprice;
	private String sdesc;
	public Sort() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Sort(int sid, String sname, double sprice, String sdesc) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.sprice = sprice;
		this.sdesc = sdesc;
	}
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public double getSprice() {
		return sprice;
	}
	public void setSprice(double sprice) {
		this.sprice = sprice;
	}
	public String getSdesc() {
		return sdesc;
	}
	public void setSdesc(String sdesc) {
		this.sdesc = sdesc;
	}
	@Override
	public String toString() {
		return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice + ", sdesc=" + sdesc + "]";
	}
	
}


实例讲解

    我例子中使用的数据库表

     

package DBUtilsDemo;
//我使用的jar包为:commons-dbutils-1.6.jar,mysql-connector-java-5.1.37-bin.jar.
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import JDBCdomain.Sort;
import jdbcutil.JDBCUtilsConfig;
/*
 * 使用QueryRunner工具类方法进行查询后处理
 * query(Connection conn,String sql,ResultSetHandler r,Object... params)
 * ResultSetHandler结果集处理方式,传递其接口的实现类
 * query方法返回类型为T泛型,随结果集处理方式变化
 */
public class QueryRunnerDemo2 {
	//建立数据库连接,这里JDBCUtilsConfig是我自己写的工具类,其作用就是返回Connection对象
	private static Connection conn = JDBCUtilsConfig.getConnection();
	
	public static void main(String[] args) throws SQLException {
		//arrayHandler();
		//arrayListHandler();
		//beanHandler();
		//beanListHandler();
		//columnListHandler();
		//scalarHandler();
		//mapHandler();
		mapListHandler();
		//释放资源
		DbUtils.closeQuietly(conn);
	}
	
	//8.使用MapListHandler处理结果集
	//用List<Map<String,Object>>存储
	//返回每行数据
	public static void mapListHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "select * from sort where sprice>?";
		Object[] params = {1999};
		//用List<Map<String,Object>>存储query()方法的返回值
		List<Map<String,Object>> result = qr.query(conn, sql, new MapListHandler(), params);
		//遍历集合
		for(Map<String,Object> map : result) {
			for(String key : map.keySet()) {
				System.out.print(key+"--"+map.get(key)+"\t");
			}
			System.out.println();
		}
	}
	
	//7.使用MapHandler处理结果集
	//键值对形式存储,键存储列名,值存储该列所有数据
	//返回第一行数据
	public static void mapHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "select * from sort where sprice>?";
		Object[] params = {1999};
		//返回Map集合存储query()方法的返回值
		Map<String, Object> result = qr.query(conn, sql, new MapHandler(), params);
		//遍历map集合
		for(String key : result.keySet()) {
			System.out.println(key+"-"+result.get(key));
		}
	}
	
	//6.使用ScalarHandler处理结果集
	//只返回一个结果
	public static void scalarHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "select count(*) from sort where sprice>?";
		Object[] params = {1999};
		long result = qr.query(conn, sql, new ScalarHandler<>(), params);
		System.out.println("大于1999金额的数据有"+result+"个");
	}
	
	//5.使用ColumnListHandler处理结果集
	//这个实现类传递列名称,将列的信息存储到List集合中
	public static void columnListHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "select * from sort where sprice>?";
		Object[] params = {1999};
		List<Object> result = qr.query(conn, sql, new ColumnListHandler<>("sname"), params);
		for(Object obj : result) {
			System.out.println(obj);
		}
	}
	
	//4.使用BeanListHandler处理结果集
	//这个实现类传递Bean类的class文件,将数据每行结果存放到List<Bean>中
	public static void beanListHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "select * from sort where sprice>?";
		Object[] params = {1999};
		//BeanListHandler接收结果集,返回结果用List接收
		List<Sort> result = qr.query(conn, sql, new BeanListHandler<Sort>(Sort.class), params);
		for(Sort s : result) {
				System.out.println(s);
		}
	}
	
	//3.使用BeanHandler处理结果集
	//这个实现类传递Bean类的class文件,将结果的第一行数据存放到一个Bean类对象中
	//注意,该Bean类对象需要有空参构造,用来存放可能查询为null的结果
	public static void beanHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "select * from sort where sprice>?";
		Object[] params = {1999};
		//BeanHandler,返回Bean这个类对象
		Sort result = qr.query(conn, sql,new BeanHandler<Sort>(Sort.class),params);
		System.out.println(result);
	}
	
	//2.使用ArrayListHandler处理结果集,将每一行数据封装到对象数组中,使用List<Object[]>接收
	public static void arrayListHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "select * from sort where sprice>?";
		Object[] params = {1999};
		//调用query方法,传递参数数据库连接对象,sql语句,ArrayListHandler处理机,?占位符参数
		//返回多行对象数组
		List<Object[]> result = qr.query(conn, sql, new ArrayListHandler(), params);
		//打印多行数据结果
		for(Object[] objArr : result) {
			for(Object obj : objArr) {
				System.out.print(obj+"\t");
			}
			System.out.println();
		}
	}
	
	//1.使用ArrayHandler处理结果集,返回查询结果的第一行数据,使用Object[]接收
	public static void arrayHandler() throws SQLException{
		QueryRunner qr = new QueryRunner();
		String sql = "select * from sort where sprice>?";
		Object[] params = {1999};
		//调用query方法,传递数据库连接对象,sql语句,ArrayHandler处理集,?占位符参数
		//返回值是对象数组
		Object[] result = qr.query(conn, sql, new ArrayHandler(),params);
		//打印查询结果第一行数据
		for(Object obj : result) {
			System.out.print(obj+"\t");
		}
	}
	
}
包下载地址: JDBC使用包


Dify 第 7 篇 Dify 应用介绍 + 聊天助手&Agent 应用关键点说明 本文介绍了Dify应用的核心概念与使用方法。Dify是基于大模型构建的实际场景应用,提供API、WebApp和易用界面。包含5种应用类型:聊天助手、文本生成、Agent、对话流和工作流。创建方式有模板创建、空白应用和DSL文件三种。重点讲解了聊天助手和Agent应用的关键功能:聊天助手支持提示词优化、知识库引用、文件处理等;Agent应用则强调推理能力、工具调用和任务自动化。文章还详细介绍了应用的调试、发布和管理工具,为开发者提供了全面的应用构建指南。 阅读详情

相关推荐

NBIS单细胞教程:差异基因(五)

此文章是通过学习瑞典国家生物信息学基础设施(NBIS) 所开放的单细胞分析教程加上网上所查找的资料,自身的理解所形成的,可能会有不足之处。该部分是对不同集群之间的差异基因进行分析。参考来源:https://github.com/NBISweden/workshop-scRNAseq/blob/master/labs/seurat/seurat_05_dge.Rmd感兴趣的话可以阅读原文。

songyi10的博客 1万+

Jfinal中Db类的的使用

Jfinal提供了两种操作数据库的组件,分别是Model类和DB类,可以极大地减少代码量,提高开发效率。 Db类提供了在Model类之外更丰富的的数据库操作能力,使用Db类以及嵌套的Record类时,无需对数据库表进行映射,Record类相当于一个通用的Model。 以下为Db+Record的常见用法: 什么时候选择用Db类? 1. 没有创建 Model,不得不使用 2. ...

diaoqu0519的博客 595

Meta-World环境实战解析:pick-place-v2中的状态观测与动作控制

本文深入解析了Meta-World中pick-place-v2环境的强化学习实战要点。文章详细拆解了39维状态观测向量的构成与意义,包括机械臂末端、物体位置及目标坐标,并揭示了默认部分可观测设置的潜在影响。同时,阐述了4维动作空间的控制逻辑与奖励函数的分阶段设计,为训练高效稳定的抓放策略提供了核心指导与实用调优技巧。

weixin_29184371的博客 77

MongoDB数据库中update的修改器整理与总结

MongoDB数据库中update的修改器整理与总结 1. $set修改器 用途:用来修改一条指定数据的指定字段值(key) 1.基本语法示例: db.user.update({"name":"MinJie"},{"$set":{age:21}}) 2.json嵌套的修改 db.user.update({"name":"MinJie"},{"$set":{"slill.skillTh...

weixin_39893889的博客 570

AirSim中图像API的应用

解析Airsim图像获取保存的api

fegxg的博客 1607

高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入

一. 第一个重要极限 二. 第二个重要极限 三. 导数定义式 全文见【高等数学】两个重要的极限 - 知乎

"You are worthy! You can do it!" 6万+

2.MySQL增删改查操作

大部分的程序业务逻辑其实都是‘增删改查’。 文章目录1.库1.1查看库1.2增加库1.3修改编码1.4删除库1.5 切换库2.表2.1查看变2.2增加表2.3 表的修改2.4 删除表2.5 绝对路径3.数据3.1数据查看3.2数据添加3.3数据修改3.4删除数据 1.库 库对应着文件夹。 1.1查看库 show databases; 查所有的库。 show create database 库名; 查单个库,显示详细的信息。 select database();

清风 310

相场断裂模型中的各向异性机制:从裂纹密度到驱动力的数值实现

断裂力学是研究材料在载荷作用下裂纹萌生与扩展规律的基础学科,其核心在于理解材料失效的能量准则与路径选择。传统方法通常预设裂纹路径,而相场断裂模型通过引入连续的相场变量,将裂纹模拟转化为一个能量最小化问题,能够自发预测裂纹的萌生、扩展与分叉,在工程失效分析中具有重要价值。当材料具有显著的方向依赖性时,如单晶、复合材料或轧制金属板,各向同性假设会失效,此时需引入各向异性机制。该机制的核心在于改造两个关键部分:一是裂纹密度函数,通过引入各向异性张量来定义不同方向上形成裂纹微结构的能量成本;二是临界能量释放率(断裂

weixin_31421613的博客 298

Hutool学习 —— 数据库 - db (一)Db简单操作

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

waiter_chen的博客 1万+

03、AC分析

本节我们将对之前的BUCK电路进行AC分析! 首先,我们之前的BUCK电路是开环电路,现在我们把它设计成闭环电路!电路图如下: 我们对闭环BUCK电路先瞬态仿真一下,波形如下: 然后在电路中加入小信号和波特图进行AC仿真 原理图如下: 增益为0时所对应的相位裕度为56°,这个相位裕度一定要大于0°,大于45°则比较稳定! ...

soumns丶涛的博客 3519

GEE:基于 Landsat 数据集生成(1986-2024)月度合成地表温度(LST)时间序列数据

优快云@_养乐多_本文将介绍使用 Landsat 时间序列计算(1986-2024)月度合成地表温度(LST)时间序列数据集的代码。

养乐多的博客 1714

DBUtils增删改查操作

DBUtils增删改查操作java编程中的数据库操作实用工具,封装了jdbc的操作,简化了jdbc的书写,小巧简单实用。1.对于数据表的读取操作,它可以把结果集转成 List Array Set等集合;2.对于数据表的写操作,变的更简单(只需要sql 语句就可以了);3.可以使用数据库连接池技术,来优化性能,重用已经构建好的数据库连接对象。DBUtils中主要用QueryRunner类,提供了对s...

cyj142602的博客 1907

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java中的JDBC操作详解、JDBC工具类的编写以及DBUtils工具包的使用

Java中的JDBC操作详解、JDBC工具类的编写以及DBUtils工具包的使用

一个大数据的爱好者 1868

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JDBC工具类DBUtils封装jar包

JDBC工具类DBUtils封装jar包 通过对JDBC操作数据库的学习,我们会发现,由于JDBC操作数据库的步骤基本没有大的变化,针对所有的数据访问操作,都会存在大量重复代码,因此,对操作数据库的步骤封装就显得十分有必要了,如下: JDBC操作数据库时,每执行一次操作都要重新执行JDBC的获取连接对象、获取处理命令的对象、执行sql操作、处理结果、关闭资源的几个步骤的话,大大加重的程序员的...

Max的博客 2207

JDBC-DBUtils工具类的讲述

JDBC-DBUtils工具类 一、创建properties文件 在src目录下创建一个名为“dbinfo.properties”的文件,里面的内容为: driverClass=com.mysql.jdbc.Driver url=jdbc\:mysql\://localhost\:3306/数据库名 username=root password= 使用配置文件的原因是方便日后更换其他数据库,在更换为其他数据库时只要修改配置文件的driverClass的值即可(因为所有的数据库操作都符合jdbc规范)。

wu964521的博客 224

JDBC中Dbutils工具类的使用

Dbutils工具类:官方的工具类,直接用就可以了。 类泛型:跟集合的存储类型差不多,用来规定当前类的类类型。默认数据类型为Object,就是表示具体操作的是哪个实体类(表)。 比如:BaseDao< WangZhe >1)使用接口 创建子类对象: 2)直接创建BaseDao std = new BaseDao(); //std既有Student也有BaseDao 分别是:数据库连接地址,驱动类地址,连接数据库用户名以及密码。 这句话就跟我们前面写的 Class.forname(com.mysql.jd

weixin_52528062的博客 571

(JDBC) 使用 DbUtils 工具类详解

使用 DbUtils 工具类 因为在使用jdbc时各种增删改、查询语句写入方法时,封装的不方便,在这里使用很完善的DbUtil 工具类来实现 import com.jdbc_connection.jdbcDemo2.Student; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutil...

赵炳泉的博客 860

Java中使用DbUtils工具类对JDBC操作进行封装

案例:使用DbUtils数据库工具类,实现在控制台输入数字“1”或“2”,对数据库的查询和增加,具体功能如下图所示。 项目分为三个文件,1、主界面JdbcDemo5.java文件 2、学生类Student.java文件,该类是具体的实现类 3、工具类DbUtils.java文件 1、主界面JdbcDemo.java中写了两个自定义方法,select()方法和add()...

往事似水拂流年的博客 725

jdbc自制工具类: DBUtils, 减少代码重复

1. jdbcInfos.properties表(存放mysql数据库驱动和用户信息): 2. DBUtils工具类实现: 1. 调用getConn()方法时加载静态代码块 , 完成注册驱动, 登录数据库, 并返回一个Connection对象 2. close()方法利用方法重载机制, 实现将jabc各个对象关闭的操作 package com.ujn.jdbcUtils; import jav...

csdn_yaohailong的博客 274

【JDBC】DBUtils工具类

一、DBUtils简介 使用JDBC我们发现冗余的代码太多了,为了简化开发 我们选择使用 DBUtils Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程 序的开发,同时也不会影响程序的性能。 使用方式: DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar。 ...

akiaug的日录 2267

Java(原生JDBC,连接池,DBUtils工具类)

目录 一.JDBC 二.原生JDBC开发的步骤 三.定义原生JDBCUtils.java工具类 四.DBCP连接池 五.C3P0连接池 六.DBUtils编写语句 一.JDBC 介绍:java语言操作各种数据库的技术 * JDBC由一堆接口和类组成 * 类:DriverManger,用于注册驱动 * 接口: * ...

taka_is_beauty的博客 2074

DBUtils工具类实现比(JDBC)更加简单的Mysql编程

DBUtils是Apache提供的简化JDBC操作的工具类库,通过封装JDBC实现数据库增删改查的便捷操作。文章介绍了DBUtils的核心功能:QueryRunner类执行SQL语句、ResultSetHandler接口处理结果集。详细讲解了表的JavaBean映射关系,以及QueryRunner在手动/自动模式下实现增删改查的具体方法,包括ArrayHandler、ArrayListHandler等不同结果集处理方式。同时介绍了数据库批处理技术,通过PreparedStatement的addBatch()

m0_61359105的博客 1268

JDBC : 使用DBUtils 工具类

所需jar包 : commons-dbutils-1.6.jar DbUtils类  1.DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:   -public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的

NotPerfect-EOF 2499

JDBC:使用DBUtils工具类完成增删改、查

标题:JDBC:使用DBUtils工具类完成增删改、查 一、步骤 创建连接Connection connection =JDBCUtilsByDruid.getConnection(); QueryRunner queryRunner=new QueryRunner();得到queryRunner对象调用增删改、查方法, 关闭 二、举例解析 1)查询一条记录 传入new BeanHandler(Boys.class)对象,使得可以知道需要为Boys创建一个对象,并赋值返回 Boys boys=qu

weixin_45986454的博客 391

Java之JDBC工具类DBUtils

DBUtils是java编程中的数据库操作实用工具,小巧简单实用。DBUtils封装了对JDBC的操作,简化了JDBC操作。 一般JDBC的步骤加载数据库驱动、获得连接、获得statement,然后构建sql语句,再执行sql语句,最后处理结果集,而这些操作都被封装,你只要告诉DBUtils你需要执行的sql语句,以及返回结果集。大大简化了代码。 1.对于数据表的读操作,他可以把结果转成List,...

hestyle的博客 646

Jdbc基础 工具类 连接池到dbutils

jdbc最基础的就是使用statement 一共有几步 1注册驱动 2.获得连接 3.获得语句执行者平台 4.执行sql语句 5处理结果 6释放资源 当然 得先导包public class ejdbc { public static final String url = "jdbc:mysql://localhost:3306/chartroom"; pub

蹲茅坑逗蛆蛆 572
上一篇: Java集合-HashMap经典面试题
下一篇: Spring与Mybatis整合——Demo
PAcee1
博客等级 码龄9年 30粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值