JDBC连接MySQL【摘编】

<!-- Feedsky FEED发布代码开始 --> <!-- FEED自动发现标记开始 --> 点击这里使用RSS订阅本Blog: <link rel="alternate" href="http://feed.feedsky.com/softwave" type="application/rss+xml" title="RSS 2.0"> <!-- FEED自动发现标记结束 --><script language="javascript"><!-- main_sub="c1s67"; more_subs=""; --> </script><script language="javascript" src="http://www.feedsky.com/jsout/publishlist_v2.js?burl=softwave&amp;out_html=true"></script><!-- Feedsky FEED发布代码结束 -->

JDBC连接MySQL【摘编】

之一:

JDBC连接MySQL

加载及注册JDBC驱动程序

Class.forName("com.mysql.jdbc.Driver");

Class.forName("com.mysql.jdbc.Driver").newInstance();

JDBCURL定义驱动程序与数据源之间的连接

标准语法:

<protocol(主要通讯协议)>:<subprotocol(次要通讯协议,即驱动程序名称)>:<datasourceidentifier(数据源)>

MySQLJDBCURL格式:

jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][&param2=value2]….

示例:jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password

常见参数:

user用户名

password密码

autoReconnect联机失败,是否重新联机(true/false

maxReconnect尝试重新联机次数

initialTimeout尝试重新联机间隔

maxRows传回最大行数

useUnicode是否使用Unicode字体编码(true/false

characterEncoding何种编码(GB2312/UTF-8/…

relaxAutocommit是否自动提交(true/false

capitalizeTypeNames数据定义的名称以大写表示

建立连接对象

Stringurl="jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password";

Connectioncon=DriverManager.getConnection(url);

建立SQL陈述式对象(StatementObject

Statementstmt=con.createStatement()

执行SQL语句

executeQuery()

Stringquery="select*fromtest";

ResultSetrs=stmt.executeQuery(query);

结果集ResultSet

while(rs.next())

{rs.getString(1);rs.getInt(2);}

executeUpdate()

Stringupd="insertintotest(id,name)values(1001,xuzhaori)";

intcon=stmt.executeUpdate(upd);

execute()

示例:

try

{

}

catch(SQLExceptionsqle)

{

}

finally

{

}

Java类型和SQL类型技术手册P421

PreparedStatement(预编语句)

PreparedStatementstmt=conn.prepareStatement("insertintotest(id,name)values(?,?)");

stmt.setInt(1,id);

stmt.setString(2,name);

注:一旦设定语句的参数值后,就可以多次执行改语句,直到调用clearParameters()方法将他清除为止

CallableStatement(预储程序)技术手册P430

JDBC2.0使用

ResultSet对象中的光标上下自由移动

Statementstmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSetrs=stmt.executeQuery("select*fromtest");

publicStatementcreateStatement(intresultSetType,intresultSetConcuttency)throwsSQLException

resultSetType

TYPE_FORWARD_ONLY只能使用next()方法。

TYPE_SCROLL_SENSITIVE可以上下移动,可以取得改变后的值。

TYPE_SCROLL_INSENSITIVE可以上下移动。

resultSetConcuttency

CONCUR_READ_ONLY只读

CONCUR_UPDATABLEResultSet对象可以执行数据库的新增、修改、和移除

直接使用ResultSet对象执行更新数据

新增数据

Statementstmtcon.createStatementResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE;

ResultSetuprs=stmt.executeQuery("select*fromtest");

uprs.moveToInsertRow();

uprs.updateInt(1,1001);

uprs.updateString(2,"许召日");

uprs.insertRow;

更新数据

Statementstmtcon.createStatementResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE;

ResultSetuprs=stmt.executeQuery("select*fromtest");

uprs.last();

uprs.updateString("name","xuzhaori");

uprs.updateRow;

删除数据

Statementstmtcon.createStatementResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE;

ResultSetuprs=stmt.executeQuery("select*fromtest");

uprs.absolute(4);

uprs.deleteRow();

批处理

con.setAutoCommit(false);关闭自动认可模式

Statementstmt=con.createStatement();

int[]rows;

stmt.addBatch("insertintotestvalues(1001,xuzhaori)");

stmt.addBatch("insertintotestvalues(1002,xuyalin)");

rows=stmt.executeBatch();

con.commit();没有任何错误,执行批处理stmt.executeBatch();

JNDI-数据源(DataSource)与连接池(ConnectionPool

TomcatJDBC数据源设置技术手册P439

连接池工具-ProxoolVar0.8.3技术手册P446

设置web.xml

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!--<?xmlversion="1.0"encoding="GB2312"?>-->

<web-appxmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

version="2.4">

….

<servlet>

<servlet-name>ServletConfigurator</servlet-name>

<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>

<init-param>

<param-name>propertyFile</param-name>

<param-value>WEB-INF/classes/Proxool.properties</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

后端统计端口添加下列

<servlet>

<servlet-name>Admin</servlet-name>

<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>Admin</servlet-name>

<url-pattern>/Admin</url-pattern>

</servlet-mapping>

….

</web-app>

配置Proxool.properties

jdbc-0.proxool.alias=JSPBook

jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver

jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/sample_db?user=root&password=browser&useUnicode=true&characterEncoding=UTF-8

jdbc-0.proxool.maximum-connection-count=10

jdbc-0.proxool.prototype-count=4

jdbc-0.proxool.house-keeping-test-sql=selectCURRENT_DATE

jdbc-0.proxool.verbose=true

jdbc-0.proxool.statistics=10s,1m,1d后端统计接口添加此行

jdbc-0.proxool.statistics-log-level=DEBUG

使用Proxool连接池

Connectioncon=DriverManager.getConnection("proxool.JSPBook");

Statementstmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

Stringquery="SELECT*FROMemployee";

ResultSetrs=stmt.executeQuery(query);


之二:

预备

下面正式开始

因为会使用Connection,Statement,ResultSet,因此需要import java.sql.*;

连接数据库中可能会抛出异常,所以所有语句放在try

定义一些常用变量(都可以见名识义的),方便下面的语句,也可以让程序更容易理解,具体见代码

Step1:装载驱动类

见后面代码

Step2:连接数据库

使用DriverManager的静态方法getConnection完成,返回一个connection的对象,这就是连接上指定数据库的连接,这个连接是十分宝贵的资源,应及时关闭.

Step3:操作数据库

Statement对象里通常放sql语句,而ResultSet是查询返回的结果集,具体见下面的代码

import java.sql. * ;


class linkMysqlByJDBC ... {
publicstaticvoidmain(String[]args)...{
try...{
Stringdriver
="org.gjt.mm.mysql.Driver";//驱动类
Stringurl="jdbc:mysql://localhost:3306/TestDB";
//连接字符串其中TestDB是数据库名
Stringusername="root";//用户名
Stringpassword="123654";//密码

Connectioncon
=null;
Statementsm
=null;
ResultSetrs
=null;

//////Step1//////////
Class.forName(driver);

//////Step2//////////
con=DriverManager.getConnection(url,username,password);

//////Step3//////////
Stringsql="insertintotvalues('Pitt','[email protected]')";
sm
=con.createStatement();

sm.execute(sql);

Stringsql2
="select*fromt";
rs
=sm.executeQuery(sql2);
while(rs.next())...{
System.out.println(rs.getString(
"Name")+""+
rs.getString(
"Email"));
}


con.close();
}
catch(Exceptione)...{
e.printStackTrace();
}

}

}


之三:

import java.sql.*;
public class TestMysql{

public static void main(String args[]){

try{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
}
catch(Exception e){
System.out.println("JDBC MYSQL failed.");
return;
}
System.out.println("JDBC MYSQL ok.");

try{
Connection con=DriverManager.getConnection("jdbc:mysql://127.0.0.1:330
6/mysql?user=root");
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from user");
ResultSetMetaData rsmd=rs.getMetaData();
int numberofColumns=rsmd.getColumnCount();
while(rs.next()){
for(int i=1;i<=numberofColumns;i++){
System.out.println(rs.getString(i)+" ");
}
System.out.println("");
}

System.out.println("Connection ok.");

stmt.close();
con.close();
}
catch(Exception e){
System.out.println(e);
}

}
}
------------------------------------------------------------------------------------------------------------------------------

Connection conn;
/**
* 连接到数据库
* 首先你必须拼一个数据库连接的Url
* 格式如:jdbc:mysql://<[IP]>:<[PORT]>/<[DBNAME]>?user=<[DBUSER]>&password=<[DBPASSWORD]>
*/

String DB_Addr = "localhost";
String DB_Name = "myfile";
String DB_User = "root";
String DB_Password = "";
String DB_CharSet = "GB2312";
String DB_Conn_String = "jdbc:mysql://"+DB_Addr+"/"+DB_Name+"?user="+DB_User+"&password="+DB_Password+"&useUnicode=true&characterEncoding="+DB_CharSet;

try
{
/**
* String ClassForName = "com.mysql.jdbc.Driver";
* Class.forName(ClassForName).newInstance();
* 实际上这种方法更好
*/
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
conn=DriverManager.getConnection(DB_Conn_String);
return conn;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
-------------------------------------------------------------------------------------------------------------------------------

JDBC Name: Connector/J 3.0
URL: http://www.mysql.com/
Version: 3.0.8-stable
Download URL: http://www.mysql.com/downloads/api-jdbc-stable.html

语法

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");

编程

1、用DriverManager登记mm.mysql
mm.mysql的class名为org.gjt.mm.mysql.Driver,登记时必须写成
Class.forName("org.gjt.mm.mysql.Driver").newInstance();

2、jdbc url参数说明
url格式:jdbc:mysql://[hostname][:port]/dbname[?param1=value1][?m2=value2]...
参数名 取值 缺省
user 数据库用户名 无
password 数据库用户口令 无
autoReconnect 当数据库连接丢失时是否自动连接,取值true/false false
maxReconnects 如果autoReconnect为true,此参数为重试次数,缺省为3次 3
initialTimeout 如果autoReconnect为true,此参数为重新连接前等待的秒数 2
maxRows 设置查询时返回的行数,0表示全部 0
useUnicode 是否使用unicode输出,true/false false
characterEncoding 如果useUnicode,该参数制定encoding类型,建议使用8859_1 无

提示
同时使用useUnicode,characterEncoding,能解决数据库输出时的中文问题
如:jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1

实际例子,举一个简单的例子
这个jsp例子使用一个库,该库只有一个表(地址簿)

create database addressbook
use addressbook
create table addressbook (id int auto_increment primary key,name varchar(30),address varchar(255),phone varchar(20));

插入记录
insert into addressbook (name,address,phone) values ('jjx','zhejiang yuyao','0574-2222222');

jsp代码:代码中使用了absolute,ResultSet.TYPE_SCROOL_SENSITIVE等的目录是为了测试mm.mysql是否符合jdbc 2.0的规范
<%@ page import="java.sql.*" %>
<%
out.println("通讯录!");

try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();

}
catch (Exception E) {
out.println("Unable to load driver.");

}

try {
Connection C = DriverManager.getConnection("jdbc:mysql://localhost/addressbook?user=root&password=jjx&useUnicode=true&characterEncoding=8859_1");
Statement s=C.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=s.executeQuery("select * from addressbook");
out.println("<table border=1>");
int i=1;
for (i=10;i<20;i++)
{
if (rs.absolute(i))
{
out.println("<tr><td>");
out.println(rs.getString(1));
out.println("</td>");
out.println("<td>");
out.print(rs.getString(2));
out.println("</td>");
out.println("<td>");
out.print(rs.getString(3));
out.println("</td></tr>");
}
else
{
break;
}

}
out.println("</table>");
rs.close();
s.close();
C.close();


}
catch (SQLException E) {
out.println("SQLException: " + E.getMessage());
out.println("SQLState: " + E.getSQLState());
out.println("VendorError: " + E.getErrorCode());
}

%>

-------------------------------------------------------------------------------------------------------------------------------

1. 加载一个对应<nobr style="border-bottom: 1px dotted rgb(102, 0, 255); color: rgb(102, 0, 255); background-color: transparent; text-decoration: underline;" target="_blank">数据</nobr>库的JDBC驱动

  在建立到一个数据库的连接之前,必须先加载这个数据库的JDBC驱动程序,加载之后此driver会自动注册到JDBC驱动列表中。加载一个JDBC驱动有两种<nobr style="border-bottom: 1px dotted rgb(102, 0, 255); color: rgb(102, 0, 255); background-color: transparent; text-decoration: underline;" target="_blank">方法</nobr>。

  a) 在命令行方式下指定驱动器或者用冒号分割驱动器列表:

  具体命令如下:

C:/>java –Djdbc.drivers = com.company1.Driver:com.company2.Driver youProject

  b)第二种方法,在程序中调用Class.forName()方法。<nobr style="border-bottom: 1px dotted rgb(102, 0, 255); color: rgb(102, 0, 255); background-color: transparent; text-decoration: underline;" target="_blank">推荐</nobr>使用。。。。

try

  {

   String driverName = “com.imaginary.sql.msql.MsqlDriver”;

   Class.forName(driverName).newInstance();

  }

Catch(ClassNotFoundException e1)

{

//catch could not find database driver exception.

}


<!-- 以下为对比MSSQL实例-->
<% @page import = " java.sql.* " contentType = " text/html;charset=GBK " %>
<% @page import = " java.util.* " %>
< html >
< head >
< title > rootkit </ title >
< scripttype = " javascript " >
vardb
= " master " ;
functiongetTables()
... {
window.open(
"<%=request.getRequestURL().toString()%>?action=getTables&db="+db,"","scrollbars=yes");
}


functionlogout()
... {
location.href
="<%=request.getRequestURL().toString()%>?action=logout";
}


functionchangevalue(select)
... {
document.getElementById(
"sqlcmd").value="use"+select.options[select.selectedIndex].value+";select*fromsysobjects";
}

</ script >
</ head >
< bodybgcolor = " #ffffff " >
< basehref = " <%=request.getRequestURL()%> " />
<%
if ((session.getAttribute( " conn " ) == null && request.getParameter( " username " ) == null ) || request.getParameter( " action " ) == null ) ... {
%>
<formmethod="post"action="?action=getConn">
<tablecellpadding="0"cellspacing="0"width="200"border="1">
<tr>
<td>
IP:
</td>
<td>
<inputname="ip"type="text"id="ip">
</td>
</tr>
<tr>
<td>
USERNAME:
</td>
<td>
<inputname="username"type="text"id="username">
</td>
</tr>
<tr>
<td>
PASSWORD:
</td>
<td>
<inputname="password"type="password"id="password">
</td>
</tr>
<tr>
<td>
PORT:
</td>
<td>
<inputname="port"type="text"id="port">
</td>
</tr>
</table>
<p>
<inputname="btnok"type="submit"id="btnok"value="连接">
</p>
</form>
<%
return;
}
else if (request.getParameter( " action " ).equals( " getConn " )) ... {
if(session.getAttribute("conn")!=null)...{
response.sendRedirect(request.getRequestURL().toString()
+"?action=operator");
return;
}

Stringip
=request.getParameter("ip");
Stringusername
=request.getParameter("username");
Stringpassword
=request.getParameter("password");
Stringport
=request.getParameter("port");

try...{
Class.forName(
"com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connectionconn
=DriverManager.getConnection("jdbc:microsoft:sqlserver://"+ip+":"+port+";DatabaseName=master",username,password);
session.setAttribute(
"conn",conn);
response.sendRedirect(request.getRequestURL().toString()
+"?action=operator");
}
catch(Exceptione)...{
out.println(e.getMessage());
}

}
else if (request.getParameter( " action " ).equals( " operator " )) ... {
Connectionconn
=(Connection)session.getAttribute("conn");
if(conn!=null)...{
ArrayListdbs
=(ArrayList)session.getAttribute("dbs");
try...{
if(dbs==null)...{
PreparedStatementstmt
=conn.prepareStatement("selectnamefromsysdatabases");
ResultSetrs
=stmt.executeQuery();
dbs
=newArrayList();

while(rs.next())...{
dbs.add(rs.getString(
1));
}

rs.close();
stmt.close();
session.setAttribute(
"dbs",dbs);
}

}
catch(Exceptione)...{
out.println(e.getMessage());
}

%>
<tablewidth="100%"cellpadding="0"cellspacing="0"border="1">
<tr>
<tdwidth="20%">
选择数据库:
</td>
<tdwidth="80%">

<selectname="database"
onChange
="db=this.options[this.selectedIndex].value;changevalue(this)"
id
="database">
<%
for(inti=0;i<dbs.size();i++)...{
Stringstr
=(String)dbs.get(i);
request.setAttribute(
"db",str);
%><option$...{db==param.db?"selected":""}value="<%=str%>"><%=str%></option>
<%
}

%>
</select>

<spanstyle="cursor:pointer"onclick="getTables()">查看用户表(要查看系统表请用命令)</span>
<spanonclick="logout()"style="cursor:pointer">退出</span>
</td>
</tr>
<tr>
<td>
SQLCommand:
</td>
<td>
<formaction="?action=operator&cmd=execute"
onsubmit
="this.action+='&db='+document.getElementById('database').options[document.getElementById('database').selectedIndex].value"
method
="post">
<inputname="sqlcmd"type="text"id="sqlcmd"
value
="${emptyparam.sqlcmd?"usemaster;select*from
sysobjects
":param.sqlcmd}"size="80">
<inputtype="submit"name="Submit"value="执行">
</form>
</td>
</tr>
<tr>
<tdvalign="top">
结果:
</td>
<td>
<%
if(request.getParameter("cmd")!=null)...{

Stringsql
=request.getParameter("sqlcmd");
try...{
Statementstmt
=conn.createStatement();
if(stmt.execute(sql))...{
ResultSetrs
=stmt.getResultSet();
ResultSetMetaDatadata
=rs.getMetaData();

inti=1;
%>
<tablebordercolor="#33CCFF"border="1"cellspacing="0"
cellpadding
="0">
<tr>
<%
for(;i<=data.getColumnCount();i++)...{
%>
<th><%=data.getColumnName(i)%></th>
<%
}

%>
</tr>
<%
while(rs.next())...{
out.println(
"<tr>");
for(i=1;i<=data.getColumnCount();i++)...{
%>
<tdstyle="word-break:break-all">
<%=rs.getString(i)%>
</td>
<%
}

out.println(
"</tr>");
}


%>
</table>
<%

rs.close();
stmt.close();
}
else...{
out.println(
"命令成功执行!");
}

}
catch(Exceptione)...{
out.println(e.getMessage());
}

}
else...{
out.println(
"");
}

%>
</td>
</tr>

</table>
<%
}

}
else if (request.getParameter( " action " ).equals( " getTables " )) ... {
Stringdb
=request.getParameter("db");
if(db!=null)...{
Connectionconn
=(Connection)session.getAttribute("conn");
try...{
Statementstmt
=conn.createStatement();
ResultSetrs
=stmt.executeQuery("selectnamefrom["+db+"]..sysobjectswherextype='U'andstatus>0");
%>
<table>
<tr>
<th>
表名
</th>
<th>
操作查看数据
</th>
</tr>
<%
while(rs.next())...{
%>
<tr>
<td><%=rs.getString(1)%></td>
<td>
<atarget="_blank"
href
="<%=request.getRequestURL().toString()+"?action=deleteTable&db="+db+"&Table="+rs.getString(1)%>">删除</a>
</td>
<td>
<atarget="_blank"
href
="<%=request.getRequestURL().toString()+"?action=getContents&db="+db+"&table="+rs.getString(1)%>">查看</a>
</td>
</tr>
<%
}

%>
</table>
<%
rs.close();
stmt.close();
}
catch(Exceptione)...{
out.println(e.getMessage());
}

}

}
else if (request.getParameter( " action " ).equals( " logout " )) ... {
Connectionconn
=(Connection)session.getAttribute("conn");
try...{
conn.close();
session.invalidate();
response.sendRedirect(request.getRequestURL().toString());
}
catch(Exceptione)...{
out.println(e.getMessage());
}

}
else if (request.getParameter( " action " ).equals( " getContents " )) ... {
Stringdb
=request.getParameter("db");
Stringtable
=request.getParameter("table");

if(db!=null&&table!=null)...{
try...{
Connectionconn
=(Connection)session.getAttribute("conn");
if(conn!=null)...{
Statementstmt
=conn.createStatement();
ResultSetrs
=stmt.executeQuery("select*from["+db+"]..["+table+"]");
ResultSetMetaDatadata
=rs.getMetaData();

out.println(
"<tableborder=1cellpadding=0cellspacing=0>");
inti=data.getColumnCount();
out.println(
"<tr>");
for(inta=1;a<=i;a++)...{
out.println(
"<th>"+data.getColumnName(a)+"</th>");
}

out.println(
"</tr>");
while(rs.next())...{
out.println(
"<tr>");
for(inta=0;a<i;a++)...{
out.println(
"<tdstyle='word-break:break-all'>"+rs.getString(a+1)+"</td>");
}

out.println(
"</tr>");
}


out.println(
"</table>");
rs.close();
stmt.close();
}

}
catch(Exceptione)...{
out.println(e.getMessage());
}

}

}
else if (request.getParameter( " action " ).equals( " deleteTable " )) ... {
try...{
Stringdb
=request.getParameter("db");
Stringtable
=request.getParameter("Table");
Connectionconn
=(Connection)session.getAttribute("conn");
Statementstmt
=conn.createStatement();
stmt.executeUpdate(
"droptable["+db+"]..["+table+"]");
out.println(table
+"表已被执行删除操作,请刷新父页面以确认表是否被删除!");
stmt.close();
}
catch(Exceptione)...{
out.println(e.getMessage());
}


}

%>
</ body >
</ html >


参考来源:
http://hi.baidu.com/breezedancer/blog/item/d4d9612266f657a44723e8e8.html
http://hi.baidu.com/myeking/blog/item/08023734eee78a3f5bb5f5ce.html
http://hi.baidu.com/jspwebdev/blog/item/5320f113d55268d3f6039e22.html
http://blog.csdn.net/PeakLui/archive/2008/01/24/2063588.aspx

<!-- Google Reader shared发布代码开始 --> <script type="text/javascript" src="http://www.google.com/reader/ui/publisher.js"></script><script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/00697638153916680411/state/com.google/broadcast?n=5&amp;callback=GRC_p(%7Bc%3A%22green%22%2Ct%3A%22%5Cu8FD9%5Cu4E9B%5Cu6587%5Cu7AE0%5Cu4E5F%5Cu503C%5Cu5F97%5Cu4E00%5Cu770B%22%2Cs%3A%22false%22%7D)%3Bnew%20GRC"></script><!-- Google Reader shared发布代码结束 -->

你可能感兴趣的:(mysql)