幸运观众手机号码抽取器Word格式.docx
《幸运观众手机号码抽取器Word格式.docx》由会员分享,可在线阅读,更多相关《幸运观众手机号码抽取器Word格式.docx(29页珍藏版)》请在冰豆网上搜索。
JDBC主要有如下功能:
(1)建立与数据库或其他表列数据源的连接;
(2)向数据库发送SQL命令;
(3)处理结果。
本实验中使用JDBC技术成功地实现了Java应用程序与数据库的连接。
1.2实验目的:
通过实现幸运观众手机号码抽取器功能的实际编程了解多线程和数据库操作原理,提高Swing、多线程和JDBC技术结合的综合运用能力。
1.3实验原理:
目前与观众互动类电视节目越来越多,比如一场赛事转播,观众可以发短信与主持人进行评价,转播结束后,主持人利用抽奖程序,从发送短信的观众的手机号码中抽取若干个号码作为幸运观众,并给予一定的奖品。
本实验要求在理解Java多线程原理基础上,设定简单的参数后,能随机抽取数据库中的若干个观众手机号码,显示时隐藏最后两位号码,并同时显示该手机号码的所属地。
1.4实验环境:
软件环境:
Windows操作系统、具有JDK1.4以上Java编译环境和JCreator3.5或Eclipse6.0以上Java编辑环境。
硬件环境:
计算机
二、系统需求分析
2.1整体框架分析:
手机参与观众发送短信给服务器,服务器接受短信并将观众的手机号码及其他相关信息输入数据库;
准备工作结束后,主持人利用抽奖程序,从数据库中的发送短信的观众的手机号码中随机抽取若干个号码作为幸运观众;
客服人员外呼,给抽取出来的手机号码打电话,询问参与节目互动情况、身份以及地址等情况。
系统模拟图
2.2功能分析:
功能流程图
2.3系统模块设计:
系统模块设计图
三、项目分析
UML类图
四、数据库设计
4.1数据库设计思想:
鉴于本实验系统要用的数据数量不是特别庞大,所以选用Access来建立数据库。
如果希望把该系统推广,或是企业化,可以选用SQLServer来建立数据库。
Access是一种关系型的桌面数据库管理系统,是MicrosoftOffice套件产品之一。
本系统选用了Access2003.
Access具有以下一些特点:
(1)具有方便实用的强大功能;
(2)可以利用各种图例快速获取数据;
(3)可以利用报表设计工具,方便生成报表;
(4)能处理多种数据类型;
(5)采用OLE技术,能方便地创建和编辑多媒体数据库;
(6)支持ODBC标准的SQL数据库的书;
(7)设计过程自动化,大大提高了数据库的工作效率;
(8)具有较好的集成开发环境;
(9)提供了断点设置、单步执行等调试功能。
本实验系统先建立名为“手机抽奖”的Access数据库,然后在其下建立“所属地”和“参与的观众”两张表,分别用于存储手机号码与相应所属地之间的联系和发短信参与抽奖的观众的信息。
4.2数据库创建:
(1)打开Access,弹出如图4.2.1所示的对话框。
图4.2.1
(2)选中“空Access数据库”单选项,单击“空数据库”,弹出“文件新建数据库”对话框,如图4.2.2所示,选择好数据库的存储路径并输入数据库名称“手机抽奖.mdb”后,单击“创建按钮”。
图4.2.2
(3)在如图4.2.3所示的对话框中双击“使用设计器创建表”选项,弹出如图4.2.4所示界面。
图4.2.3
图4.2.4
(4)输入各字段及数据类型,然后右击号码一在行,在弹出的快捷菜中选择“主键”命令,如图4.2.5所示。
图4.2.5
(5)执行“文件”“保存”命令,输入表名“所属地”,关闭数据表设计窗口,此时“手机抽奖:
数据库”对话框就会出现一个数据表“所属地”,双击它可以在表中输入数据,如图4.2.6所示。
本实验通过程序来向表中插入数据。
图4.2.6
(6)再次执行(3)(4)(5),在“手机抽奖”下创建表“参与的观众”。
如图4.2.7所示。
图4.2.7
4.3数据库连接设置:
(1)打开控制面板管理工具,双击,进入如图4.3.1所示界面。
图4.3.1
(2)双击数据源(ODBC),出现如图4.3.2所示界面。
图4.3.2
(3)选择系统DSN,准备添加数据源:
出现如图4.3.3的对话框。
图4.3.3
(4)选择新数据源的驱动程序:
DriverdoMicrosoftAccess(*.mdb),点击完成按钮,如图4.3.4所示。
图4.3.4
(5)输入新数据源名source,点击选择按钮,如图4.3.5所示。
图4.3.5
(6)指定数据库:
手机抽奖.mdb.如图4.3.6所示。
点击确定按钮,返回图4.3.5,点击确定按钮。
图4.3.6
(7)添加了新数据源source,点击确定按钮,关闭窗口。
经过上述7个步骤,我们创建了一个数据源source,这个数
据源就是待JAVA语言操作的ACCESS数据库文件——“手机抽奖.mdb”。
以上做好了数据库连接的设置工作。
4.4数据库操作:
在JAVA环境中访问数据库需要通过JDBC(JAVA数据库连接),具体说JDBC可完成三件事:
(1)与ACCESS数据库连接;
(2)用SQL语言对ACCESS数据库进行操作;
(3)处理ACCESS数据库返回的结果。
下面将详细介绍。
JDBC与ACCESS数据库连接时,首先建立一个JDBC-ODBC桥接器。
因ODBC(开放式数据库连接)驱动程序可与目前流行的任何一种数据库直接建立连接,而JAVA的JDBC借助桥接器另一端ODBC就间接与任何一种数据库连接了。
建立JDBC-ODBC桥接器用Class.forName("
sun.jdbc.odbc.JdbcOdbcDriver"
);
语句,其中Class是包java.lang中的一个类,该类通过调用它的方法forName就可以建立JDBC-ODBC桥接器。
建立桥接器可能发生异常,捕获这个异常需建立桥接器的模式如下:
try{
Class.forName("
}
catch(ClassNotFoundExceptione)
{}
桥接器建好后,就要将JAVA与ACCESS数据库真正建立连接了:
使用包java.sql中的Connection类声明一个连接对象con,格式为Connectioncon,再使用类DriverManager的方法getConnection创建这个连接对象con,语句格式如下:
Connectioncon=DriverManager.getConnection("
jdbc:
odbc:
source"
这样JAVA就与ACCESS数据库真正建立了连接。
接下来就可以通过JAVA程序对ACCESS数据库进行操作了
4.4.1向数据表中“所属地”插入数据程序:
//建立手机号码与所属地的联系
importjava.sql.*;
//importtheJDBCcorepackage
importjava.math.*;
//随机数生成器
importjava.io.*;
classJdbcDemo
{
publicstaticvoidmain(Stringargs[])throwsIOException
{
FileReaderfile=newFileReader("
1.txt"
Stringsw,q;
intstart,end,m;
chars1,s2;
for(inti=0;
i<
20840;
i++)
{
start=end=0;
for(intA=0;
A<
7;
A++)
m=file.read()-'
0'
;
start=start+m*(int)(Math.pow(10.0,6-A));
}
file.read();
for(intB=0;
B<
B++)
{
end=end+m*(int)(Math.pow(10.0,6-B));
s1=(char)file.read();
s2=(char)file.read();
sw=Character.toString(s1)+Character.toString(s2);
for(inty=start;
y<
=end;
y++)
try
Class.forName("
//loadtheJDBCdriver
Connectioncon=DriverManager.getConnection("
Statementstmt=con.createStatement();
q=newString("
INSERTINTO所属地(号码,地区)VALUES”+”("
+"
'
"
+y+"
'
+sw+"
)"
stmt.executeUpdate(q);
con.close();
catch(ClassNotFoundExceptione)
e.printStackTrace();
catch(SQLExceptione)
}
运行后得到更新后的表“所属地”如图4.4.1:
图4.4.1
4.4.2向数据表“参与的观众”插入数据程序:
//建立模拟的参与的观众手机号码数据表
//importtheJDBCcorepackage
//随机数生成器
publicstaticvoidmain(Stringargs[])
intr,m,flag;
Stringsw;
//loadtheJDBCdriver
Statementstmt1=con.createStatement();
Statementstmt2=con.createStatement();
for(inti=0;
10000;
)
{
m=1300000;
StringBuffert=newStringBuffer("
13"
for(intj=0;
j<
5;
j++)
{
r=(int)(Math.random()*10);
m=m+r*(int)(Math.pow(10.0,(4-j)));
t.append(Integer.toString(r));
}
for(intk=0;
k<
4;
k++)
r=(int)(Math.random()*10);
Stringquery="
SELECT地区FROM所属地WHERE号码="
+m;
ResultSetrs=stmt1.executeQuery(query);
while(rs.next())
sw=rs.getString("
地区"
StringBuffers=newStringBuffer("
INSERTINTO参与的观众(序号,手机号码,地区)VALUES("
s.append("
+i+"
"
+t.toString()+"
flag=stmt2.executeUpdate(s.toString());
if(flag!
=0)
i++;
运行后得到更新后的表“参与的观众”如图4.4.2:
图4.4.2
五、系统实现与运行
5.1编码:
模拟抽奖过程(主程序)
代码如下:
//主程序
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.event.*;
importjava.lang.Thread;
publicclassLuckyNumbersextendsJFrame
JLabel[]label=newJLabel[5];
JButtonstartButton,endButton;
choseh=newchose();
Threadt=newThread(h);
staticintk=0;
LuckyNumbers()
{
//GUI合成
JPanelpanel1=newJPanel();
JPanelpanel2=newJPanel();
panel1.setLayout(newBoxLayout(panel1,BoxLayout.Y_AXIS));
panel2.setLayout(newFlowLayout());
label[i]=newJLabel();
label[i].setAlignmentX(Component.LEFT_ALIGNMENT);
label[i].setFont(newFont("
SansSerif"
Font.BOLD|Font.ITALIC,30));
panel1.add(label[i]);
startButton=newJButton("
开始"
panel2.add(startButton,"
Center"
endButton=newJButton("
结束"
panel2.add(endButton,"
South"
startButton.addActionListener(newButtonHandler1());
endButton.addActionListener(newButtonHandler2());
getContentPane().setLayout(newBorderLayout());
getContentPane().add(panel1,"
getContentPane().add(panel2,"
//
//
publicstaticvoidmain(Stringargs[])throwsException
LuckyNumbersln=newLuckyNumbers();
ln.setLocationByPlatform(true);
ln.setTitle("
幸运观众手机号码抽取器"
ln.setSize(396,326);
ln.setVisible(true);
//定义ActionEvent监听器类
classButtonHandler1implementsActionListener
publicvoidactionPerformed(ActionEvente)
if(k++==0)
t.start();
else
t.resume();
}
classButtonHandler2implementsActionListener
t.suspend();
classchoseimplementsRunnable
publicvoidrun()
while(true)
Connectioncon=DriverManager.getConnection("
intn=i+10*(int)(Math.random()*1000);
StringBufferquery=newStringBuffer("
SELECT手机号码,地区FROM参与的观众WHERE序号="
query.append(n);
ResultSetrs=stmt.executeQuery(query.toString());
while(rs.next())
{
StringBuffers=newStringBuffer(rs.getString("
手机号码"
)+rs.getString("
));
s.setCharAt(9,'
*'
s.setCharAt(10,'
label[i].setText(s.toString());
}
stmt.close();
//
5.2类的说明:
5.2.1开始按钮
(1)定义开始按钮的ActionEvent监听器类:
classButtonHandler1implementsActionListener
if(k++==0) //k为staticing类型,初始值为0
//号码抽取线程开始运行