MySQL数据库新特性之存储过程入门教程

MySQL数据库新特性之存储过程入门教程,第1张

在MYSQL 中 终于引入了存储过程这一新特性 这将大大增强MYSQL 的数据库处理能力 在本文中 将指导读者快速掌握MYSQL 的存储过程的基本知识 带领用户入门

存储过程介绍

存储过程是一组为了完成特定功能的SQL语句集 经编译后存储在数据库中 用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它 存储过程可由应用程序通过一个调用来执行 而且允许用户声明变量 同时 存储过程可以接收和输出参数 返回执行存储过程的状态值 也可以嵌套调用

存储过程的优点

作为存储过程 有以下这些优点

( )减少网络通信量 调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别 可是如果存储过程包含上百行SQL语句 那么其性能绝对比一条一条的调用SQL语句要高得多

( )执行速度更快 存储过程创建的时候 数据库已经对其进行了一次解析和优化 其次 存储过程一旦执行 在内存中就会保留一份这个存储过程 这样下次再执行同样的存储过程时 可以从内存中直接中读取

( )更强的安全性 存储过程是通过向用户授予权限(而不是基于表) 它们可以提供对特定数据的访问 提高代码安全 比如防止 SQL注入

( ) 业务逻辑可以封装存储过程中 这样不仅容易维护 而且执行效率也高

当然存储过程也有一些缺点 比如

可移植性方面 当从一种数据库迁移到另外一种数据库时 不少的存储过程的编写要进行部分修改

存储过程需要花费一定的学习时间去学习 比如学习其语法等

在MYSQL中 推荐使用MYSQL Query Browswer()这个工具去进行存储过程的开发和管理 下面分步骤来学习MYSQL中的存储过程

定义存储过程的结束符

在存储过程中 通常要输入很多SQL语句 而SQL语句中每个语句以分号来结束 因此要告诉存储过程 什么位置是意味着整个存储过程结束 所以我们在编写存储过程前 先定义分隔符 我们这里定义 // 为分隔符 我们使用DELIMITER //这样的语法 就可以定义结束符了 当然你可以自己定义其他喜欢的符号

如何创建存储过程

下面先看下一个简单的例子 代码如下

DELIMITER //CREATEPROCEDURE `p ` ()LANGUAGE SQLDETERMINISTICSQL SECURITY DEFINERMENT  A procedure BEGINSELECT Hello World ! END//

下面讲解下存储过程的组成部分

)首先在定义好终结符后 使用CREATE PROCEDURE+存储过程名的方法创建存储过程 LANGUAGE选项指定了使用的语言 这里默认是使用SQL

)DETERMINISTIC关键词的作用是 当确定每次的存储过程的输入和输出都是相同的内容时 可以使用该关键词 否则默认为NOT DETERMINISTIC

) SQL SECURITY关键词 是表示调用时检查用户的权限 当值为INVOKER时 表示是用户调用该存储过程时检查 默认为DEFINER 即创建存储过程时检查

) MENT部分是存储过程的注释说明部分

lishixinzhi/Article/program/MySQL/201404/30557

需要用的资料以链接的形式给需要的同学。

我用的mysql版本为: Mysql-5.5.45-win64.msi 密码是:26zw

图形化工具 Navicat(前期不推荐用,直接手动敲): Navicat 密码:c7fs

开始我的MySQL之旅吧 始于2016.12.04

--WH

一、数据库的安装

这个就不在这里过多阐述了,因为网上实在是太多安装mysql的教程了,有了我给的mysql,在按照这个安装教程(MySQL安装教程)去看,就能够安装完好。

安装好mysql后,如果需要使用windows命令窗口(也就是cmd)来 *** 作mysql,那么就需要配置环境变量,在安装好的mysql下找到bin,将其目录放到环境变量path中去,就行了,检测成功与否的方法是在cmd命令窗口中输入mysql,就会出现一大段英文,就说明成功了,反之失败,如果不会的话就去百度搜教程。

二、数据库的基本 *** 作

1、开启mysql服务命令

net start mysql

2、进入mysql的两种方式

明文进入:mysql -uroot -proot格式:mysql -u帐号 -p密码

密文进入:mysql -uroot -p 按enter会提示你输入密码(Enter pssword:),此时你写的密码就会显示为***这样。

3、查看mysql中所有的数据库(一般在固定的单词命令就会是用大写,这个要习惯,看多了敲多了就认识了)

前面四个数据库是mysql中自带的,也就是必须的.

SHOW DATABASES

4、创建名为test_1的数据库

格式:CREATE DATABASE 数据库名

CREATE DATABASE test_1

5、删除名为test_1的数据库

格式:DROP DATABASE 数据库名

DROP DATABASE test_1

总结:学习了对数据库的三个 *** 作,1、查看所有数据库 2、创建数据库 3、删除数据库

三、数据表的基本 *** 作

数据表和数据库还有Mysql三者的关系

mysql中保存了很多数据库、一个数据库中可以保存很多表。

对数据表的增(创建表)删(删除表)改(修改表字段)查(查询表结构)。 注意:这里的 *** 作对象是表,对表的 *** 作也就是表的结构,和表中的字段的 *** 作(字段和记录要分清楚)

前提:表是在数据库下的,所以要先确实使用哪个数据库。

USE test_1

1、创建数据表

格式:CREATE TABLE 数据表名(

 字段名1数据类型[列级别约束条件],

 字段名2数据类型[列级别约束条件],

 字段名3数据类型[列级别约束条件]

 ) 

注意:格式不一定需要这样隔着写,完全可以全部写成一行。但是那样写可观性非常差。我这样写只是为了可以看的更清晰。

解释:

1、[]中括号中的内容表示可以有可以没有,

2、列级别这个“列”一定要搞清楚说的是什么,一张表中有行有列,列表示竖,行表示横 

3、约束条件后面会讲到

1.1、创建没有约束的student表

 CREATE TABLE student( idINT(11), nameVARCHAR(12), ageINT(11)  )

注释:SHOW TABLES 查询数据库底下的所有表。

1.2、创建有约束的student表

 六大约束:主键约束、外键约束、非空约束、唯一约束、默认约束、自动增加

1.2.1:主键约束

PRIMARY KEY(primary key):独一无二(唯一)和不能为空(非空),通俗的讲,就是在表中增加记录时,在该字段下的数据不能重复,不能为空,比如以上面创建的表为例子,在表中增加两条记录,如果id字段用了主键约束。则id不能一样,并且不能为空。一般每张表中度有一个字段为主键,唯一标识这条记录。以后需要找到该条记录也可以同这个主键来确认记录,因为主键是唯一的,并且非空,一张表中每个记录的主键度不一样,所以根据主键也就能找到对应的记录。而不是多条重复的记录。如果没有主键,那么表中就会存在很多重复的记录,那么即浪费存储空间,在查询时也消耗更多资源。

一般被主键约束了的字段度习惯性的称该字段为该表的主键

单字段主键约束

两种方式都可以

CREATE TABLE student(CREATE TABLE student(

idINT(11) PRIMARY KEY,idINT(11),

nameVARCHAR(12),nameVARCHAR(12),

ageINT(11) ageINT(11),

) PRIMARY KEY(id) )

多字段主键约束(复合主键)

这个id和name都市主键,说明在以后增加的插入的记录中,id和name不能同时一样,比如说可以是这样。一条记录为id=1,name=yyy、另一条记录为:id=1,name=zzz。 这样是可以的。并不是你们所理解的两个字段分别度不可以相同。

CREATE TABLE student(CREATE TABLE student(

idINT(11) PRIMARY KEY,idINT(11),

nameVARCHAR(12) PRIMARY KEY, nameVARCHAR(12),

ageINT(11) ageINT(11),

)PRIMARY KEY(id,name) )

1.2.2:外键约束

什么是外键举个例子就清楚了,有两张表,一张表是emp(员工)表,另一张表是dept(部门)表,一个员工属于一个部门,那么如何通过员工能让我们自己他在哪个部门呢?那就只能在员工表中增加一个字段,能代表员工所在的部门,那该字段就只能是存储dept中的主键了(因为主键是唯一的,才能确实是哪个部门,进而代表员工所在的部门,如果是部门名称,有些部门的名称可能是同名。就不能区分了。),像这样的字段,就符合外键的特点,就可以使用外键约束,使该字段只能够存储另一张表的主键。如果不被外键约束,那么该字段就无法保证存储进来的值就一定是另一张表的主键值。

外键约束的特点:

1、外键约束可以描述任意一个字段(包括主键),可以为空,并且一个表中可以有多个外键。但是外键字段中的值必须是另一张表中的主键。

2、这样被外键关联的两种表的关系可以称为父子表或者主从表。子表(从表)拥有外键字段的表,父表(主表)被外键字段所指向的表。

3、子表被外键约束修饰的字段必须和父表的主键字段的类型一样。

注意:一个表中有被外键修饰的字段,就称该表有外键(是“有外键”。而不是“是外键”),并会给该表中的外键约束取一个名称,所以我们常说的这个表有没有外键,指的不是被外键约束修饰的字段名,而是指这个表是否有存在外键约束。也就是说,不能说这个表的外键是xxx(该表中被外键约束修饰的字段名),这种说法是错误的,但是大多数人已经习惯了这样,虽然影响不大,但是在很多时候需要理解一个东西时,会造成一定的困扰。

格式:CONSTRAINT外键名称FOREIGN KEY(被外键约束的字段名称)REFERENCES 主表名(主键字段)

英文解释:CONSTRAINT:约束REFERENCES:参考

CREATE TABLE tableA

(

id INT(11),

name VARCHAR(22),

location VARCHAR(50),

PRIMARY KEY(id)

)

CREATE TABLE tableB

(

id INT(11),

name VARCHAR(22) NOT NULL,

deptId INT(11),

PRIMARY KEY(id),

CONSTRAINT tableA_tableB_1 FOREIGH KEY(deptId) REFERENCES tableA(id)

)

 解释:tableB中有一个名为tableA_tableB_1的外键关联了tableA和tableB两个表,被外键约束修饰的字段为tableB中的deptId,主键字段为tableA中的id 

1.2.3:非空约束

NOT NULL. 被该约束修饰了的字段,就不能为空,主键约束中就包括了这个约束

CREATE TABLE tableA

(

id INT(11),

name VARCHAR(22) NOT NULL,

location VARCHAR(50),

PRIMARY KEY(id)

)

1.2.4:唯一约束

UNIQUE 被唯一约束修饰了的字段,表示该字段中的值唯一,不能有相同的值,通俗点讲,就好比插入两条记录,这两条记录中处于该字段的值不能是一样的。

  CREATE TABLE tableA

(

id INT(11),

name VARCHAR(22) UNIQUE,

location VARCHAR(50),

PRIMARY KEY(id)

)

也就是说在插入的记录中,每条记录的name值不能是一样的。

1.2.5:默认约束

Default 指定这一列的默认值为多少,比如,男性同学比较多,性别就可以设置为默认男,如果插入一行记录时,性别没有填,那么就默认加上男 

CREATE TABLE table

(

id INT(11) PRIMARY KEY,

name VARCHAR(22) NOT NULL,

deptId INT(11) DEFAULT 1111,

salary FLOAT

)

1.2.6:自动增加

AUTO_INCREMENT 一个表只能一个字段使用AUTO_INCREMENT,并且使用这个约束的字段只能是整数类型(任意的整数类型 TINYINT,SMALLIN,INT,BIGINT),默认值是1,也就是说从1开始增加的。一般就是给主键使用的,自动增加,使每个主键的值度不一样,并且不用我们自己管理,让主键自己自动生成

CREATE TABLE table( id INT(11) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(22) NOT NULL)

2、查询表结构

2.1、查看表基本结构语句

格式1:DESCRIBE 表名/DESC 表名这两个的功能是一样的,简写了单词describe

DESCRIBE student

2.2、查看创建表的语句 

 格式:SHOW CREATE TABLE 表名

 SHOW CREATE TABLE student

这样显示的格式很不好,看不清楚,所以有了下面这个语句

格式:SHOW CREATE TABLE 表名\G

SHOW CREATE TABLE student\G

3、修改数据表

修改数据表包括:对表中字段的增加、删除、修改。 在这个里面用的关键字为 ALTER

3.1、修改表名

格式:ALTER TABLE<旧表名>RENAME[TO]<新表名>

将student表名改为student1(改完后在改回来)

ALTER TABLE student RENAME TO student1

3.2、修改表中的字段名

格式:ALTER TABLE<表名>CHANGE<旧字段名><新字段名><新数据类型>

将student表中的name字段名改为 username

ALTER TABLE student CHANGE name username VARCHAR(30)

3.3、修改表中的数据类型

格式:ALTER TABLE<表名>MODIFY<字段名><数据类型> 

ALTER TABLE student MODIFY username VARCHAR(20)

解释:只能修改字段名的数据类型,但是其原理跟上面change做的事情一样,这里也有修改字段名的过程,只不过修改后的字段名和修改前的字段名相同,但是数据类型不一样。

3.4、修改字段的排列位置

 方式1:ALTER TABLE<表名>MODIFY<字段1><数据类型>FIRST|AFTER<字段2>

 解释:将字段1的位置放到第一,或者放到指定字段2的后面

 ALTER TABLE student MODIFY username VARCHAR(20) AFTER age

方式2:ALTER TABLE<表名>CHANGE<字段1><字段2><数据类型>FIRST|AFTER<字段3> 

解释:其实是一样的,将是字段2覆盖字段1,然后在进行排序

ALTER TABLE student CHANGE username username VARCHAR(20) AFTER age

总结

CHANGE和MODIFY的区别?

原理都市一样的,MODIFY只能修改数据类型,但是CHANGE能够修改数据类型和字段名,也就是说MODIFY是CHANGE的更具体化的一个 *** 作。可能觉得用CHANGE只改变一个数据类型不太爽,就增加了一个能直接改数据类型的使用关键字MODIFY来 *** 作。

3.5、添加字段

格式:ALTER TABLE<表名称>ADD<新字段名><数据类型>[约束条件][FIRST|AFTER<已存在的表名>]

解释:在一个特定位置增加一个新的字段,如果不指定位置,默认是最后一个。

ALTER TABLE student ADD sex VARCHAR(11)

3.6、删除字段

格式:ALTER TABLE<表名称>DROP<字段名>

ALTER TABLE student DROP sex

3.7、删除表的外键约束

格式:ALTER TABLE<表名称>DROP FOREIGN KEY<外键约束名>

注意:外键约束名 指的不是被外键约束修饰的字段名,切记,而是我们在创建外键约束关系时取的名字。

3.8、更改表的存储引擎

格式:ALTER TABLE<表名>ENGINE=<更改后的存储引擎名>

这个存储引擎目前我自己也不太清楚,虽然知道有哪几种引擎,但是稍微深入一点就不清楚了,所以打算留到日后在说。

4、删除表

4.1、删除无关联表

格式:DROP TABLE<表名>;

ALTER TABLE student

4.2、删除被其他表关联的主表

这个是比较重要的一点,在有外键关联关系的两张表中,如果删除主表,那么是删不掉的,并且会报错。因为有张表依赖于他。那怎么办呢?针对这种情况,总共有两种方法

1、先删除你子表,然后在删除父表,这样就达到了删除父表的目的,但是子表也要被删除

2、先解除外键关系,然后在删除父表,这样也能达到目的,并且保留了子表,只删除我们不需要的父表。在3.7中就讲解了如何删除外键关系。

因为项目需求,必须要把图片存储到mysql数据库中.

首先 mysql数据库中的表 test 字段 photo 字段的类型是 mediumblob

执行插入数据的时候报: MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntaxcheck the manual that corresponds to your MySQL server version for the right syntax to use near

意思是sql语句不对!语法错误!

麻烦各位大侠帮帮忙,真的很急.谢谢了.困扰 很久了.一直找不到出点,所以才来找大家的!!!

--------------------------- *** 作数据库的方法开始---------------------------

public static void AddPhoto(byte[] image)

{

//建立数据库连接

MySqlConnection conn = new MySqlConnection("server=127.0.0.1user id=rootpassword=FLUserdatabase=banklgs")

conn.Open()

//设置命令参数

string insertStr = "insert into test(photo) values(?photo)"

MySqlCommand comm = new MySqlCommand()

comm.Connection = conn

comm.CommandText = insertStr

comm.CommandType = CommandType.Text

//设置数据库字段类型MediumBlob的值为图片字节数组imageByte

MySqlParameter paraPhoto = new MySqlParameter("?photo", MySqlDbType.MediumBlob)

paraPhoto.Value = image

comm.Parameters.Add(paraPhoto)

//执行命令

try

{

comm.ExecuteNonQuery()

}

catch (Exception ex)

{

ex.ToString()

}

}

--------------------------- *** 作数据库的方法结束---------------------------

用的是 PictureBox 控件!

---------------------------将图片转换为byte的地方开始---------------------------

private void photoPictureBox_DoubleClick(object sender, EventArgs e)

{

Stream photoStream = null

if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

try

{

string pathName = openFileDialog1.FileName

if ((photoStream = openFileDialog1.OpenFile()) != null)

{

using (photoStream)

{

if (photoStream.Length >50 * 1024)//文件不应大于50K

{

this.infoPanel1.ShowInfo(InfoPanel.TipType.ERROR, "文件大小不超过50K")

return

}

//将图像读入到字节数组

byte[] buffByte = new byte[photoStream.Length]

int ret = photoStream.Read(buffByte, 0, (int)photoStream.Length)

this.photo = buffByte

Image image = Image.FromStream(photoStream, true)

Image imgPhoto = image

if (buffByte.Length >15000)

文章知识点与官方知识档案匹配

MySQL入门技能树使用数据库 创建和删除数据库

33009 人正在系统学习中

点击阅读全文

打开CSDN APP,看更多技术内容

将图片存入mysql数据库中

将图片存入mysql数据库中,比如说用户头像保存到数据库以便信息的管理

mysql存储图片_浅谈怎么才能在MySQL中直接储存图片

如果你想把二进制的数据,比如说图片文件和HTML文件,直接保存在你的MySQL数据库,那么这篇文章就是为你而写的!我将告诉你怎样通过HTML表单来储存这些文件,怎样访问和使用这些文件。本文概述:在mysql中建立一个新的数据库一个怎样储存文件的例子程序一个怎样访问文件的例子程序在mysql中建立一个新的database首先,你必须在你的mysql中建立一个新的数据库,我们将会把那些二进制文件储存在...

继续访问

mysql存储图片

转载 mysql可以存储图片,并且有两种存储方法,分别是:1、将图片保存的路径存储到数据库;2、将图片以二进制数据流的形式直接写入数据库字段中。 可以存储图片。在mysql存储图片的方法一般有两种:其一,将图片保存的路径存储到数据库;其二,将图片以二进制数据流的形式直接写入数据库字段中。 一、保存图片的上传路径到数据库: string uppath=""//用于保存图片上传路径 //获取上传图片的文件名 string fileFullname = this.FileUpload1.FileNa

继续访问

最新发布 实战演练 | 使用 Navicat 在 MySQL 中存储图像

​ 在今天的博客中,我们学习了如何使用Navicat Premium将图像存储在 MySQL 8数据库中。详情请点击全文~ ​

继续访问

如何将图片存进SQL数据库中以及从数据库读取照片(解决办法)

如何将图片存进SQL数据库,以及如何从数据库中读取图片。

继续访问

Mysql对于图片的保存和取出(超详细步骤全带注释)

LONGBLOB:最多存储4,294,967,295字节的数据。MEDIUMBLOB:支持的最大长度为16,777,215字节。约等于 16363KB , 15.9MB。上传和取出的代码记得修改文件改成图片位置(现在我用的是我直接的) 不然文件会报错!对于数据库的连接代码是这个,使用的时候不要忘记修改连接数据库的账号密码 以及连接使用的数据库。BLOB:最多可以处理65,535字节的数据。约等于 63kb , 0.0624MB。对于数据库的保存 把这里改成图像就可以对于数据库进行图片预览。

继续访问

关于MySQL 中存取图片数据

使用mysql存取图片

继续访问

mysql实现添加图片_如何往mysql中添加图片

往mysql中添加图片的方法:首先创建一个方法使用FileInputStream读取图片;然后连接数据库并写入sql语句,用PreparedStatement执行sql语句。本教程 *** 作环境:windows7系统、mysql8.0.22版,该方法适用于所有品牌电脑。相关免费学习推荐:mysql视频教程往mysql中添加图片的方法:1.效果不是存了个字符串哈,可以看左边的数据类型。2. 获取blob数...

继续访问

图片插入mysql数据库_图片如何存入数据库?

展开全部1、新建一个数据库32313133353236313431303231363533e59b9ee7ad9431333431356566,数据库名为Image,表名为image。并为表添加ID,tupian两个列。2、新建一个项目(Photo),在工具箱中往窗体中拖入一个PictureBox控件,两个Button按钮,一个OpenFileDialog控件。并修改pictureBox1控件的属...

继续访问

mysql怎么放入图片_怎么将图片添加到mysql中

将图片添加到mysql中的方法:首先将数据库存储图片的字段类型设置为blob二进制大对象类型;然后将图片流转化为二进制;最后将图片插入数据库即可。正常的图片储存要么放进本地磁盘,要么就存进数据库。存入本地很简单,现在我在这里记下如何将图片存进mysql数据库如果要图片存进数据库 要将图片转化成二进制。1.数据库存储图片的字段类型要为blob二进制大对象类型2.将图片流转化为二进制下面放上代码实例...

继续访问

将图片存储到mysql数据库

正常的图片储存要么放进本地磁盘,要么就存进数据库。存入本地很简单,现在我在这里记下如何将图片存进mysql数据库 如果要图片存进数据库 要将图片转化成二进制。 1.数据库存储图片的字段类型要为blob二进制大对象类型 2.将图片流转化为二进制 下面放上代码实例 一、数据库 CREATE TABLE `photo` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `photo` blob, PRIMARY KEY (`id

继续访问

mysql 图片_将图片储存在MySQL数据库中的几种方法

通常对用户上传的图片需要保存到数据库中。解决方法一般有两种:1、将图片保存的路径存储到数据库;2、将图片以二进制数据流的形式直接写入数据库字段中。以下为具体方法:一、保存图片的上传路径到数据库:string uppath=""//用于保存图片上传路径//获取上传图片的文件名string fileFullname = this.FileUpload1.FileName//获取图片上传的时间,以时...

继续访问

如何把图片储存在mysql里_如何将图片储存在数据库里_MySQL

如果你想把二进制的数据,比如说图片文件和HTML文件,直接保存在你的MySQL数据库,那么这篇文章就是为你而写的!我将告诉你怎样通过HTML表单来储存这些文件,怎样访问和使用这些文件。本文概述:。在mysql中建立一个新的数据库。一个怎样储存文件的例子程序。一个怎样访问文件的例子程序在mysql中建立一个新的database首先,你必须在你的mysql中建立一个新的数据库,我们将会把那些二进制文件...

继续访问

热门推荐 mysql存储和读取图片

首先,介绍一下mysql相关的数据类型

继续访问

如何将图片保存至数据库?

通常对用户上传的图片需要保存到数据库中。解决方法一般有两种:一种是将图片保存的路径存储到数据库;另一种是将图片以二进制数据流的形式直接写入数据库字段中。以下为具体方法:一、保存图片的上传路径到数据库: string uppath=""//用于保存图片上传路径 //获取上传图片的文件名 string fileFullname = this.FileUpload1.FileName...

继续访问

关于图片或者文件在数据库的存储方式归纳

商品图片,用户上传的头像,其他方面的图片。目前业界存储图片有两种做法: 1、 把图片直接以二进制形式存储在数据库中 一般数据库提供一个二进制字段来存储二进制数据。比如mysql中有个blob字段。oracle数据库中是blob或bfile类型 2、 图片存储在磁盘上,数据库字段中保存的是图片的路径。 一、图片以二进制形式直接存储在数据库中 第一种存储实现(php语言...

继续访问

把图片存入mysql数据库

/* * 把图片存入mysql数据库 * # # 数据表的结构 `images` #CREATE TABLE images ( picid int(3) NOT NULL auto_increment, picdata longblob NOT NULL, pictext varchar(100) NOT NULL default , PRIMARY KEY (picid)) T

继续访问

怎么把图片存入mysql


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10036527.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存