java与sql数据库
更新时间:2024-01-25 15:59:01 阅读量: 教育文库 文档下载
Java与数据库
建立学生管理数据库 /* 学生管理数据库 */
CREATE DATABASE xsgl ON( NAME = 'xsgl_Data',FILENAME = 'c: \\start新\\xsgl.mdf ',
SIZE = 2,FILEGROWTH = 10 %) LOG ON( NAME = 'xsgl_Log', FILENAME = 'c: \\start新\\xsgl_log.ldf',SIZE = 2,FILEGROWTH = 10%) use xsgl GO
/*创建专业表 */
CREATE TABLE speciality(specialityID int IDENTITY(l,1) PRIMARY KEY, specialityname char(10)NOT NULL) GO
/ *创建用户表* /
CREATE TABLE usertable (uid int IDENTITY (1, 1) PRIMARY KEY, uname char (10) NOT NULL, upwd char(10) NULL) GO
/*创建班级分类表*/
CREATE TABLE classclass(id int IDENTITY(1,1) PRIMARY KEY, parent int NOT NULL, name nchar(10) NOT NULL UNIQUE) GO
/*创建课程表 */
CREATE TABLE course (courseID int IDENTITY (1,1) PRIMARY KEY, courseName nchar(20) NOT NULL UNIQUE, teacher nchar( 10 ) NULL) GO
/ * 创建学生档案表* /
CREATE TABLE xsda(no int IDENTITY(1,1)PRIMARY KEY, classID int REFERENCES classclass (ID), name char (10) NOT NULL, sex nchar (1) NOT NULL, birthDate char (10) NULL, speciality int NULL, address char(30) NULL, isMember char (1) NULL, resume ntext NULL, picture image NULL) GO
/ *创建学生成绩表*/
CREATE TABLE grade (no int REFERENCES xsda (no), courseId int REFERENCES course (courseID), grade float NOT NULL, PRIMARY KEY(no, courseID) ) GO
1 数据库的连接
数据库的连接一般使用两种方法:使用JDBC-ODBC桥实现数据库的连接和使用纯Java JDBC驱动程序实现数据的连接。
1. JDBC
JDBC(Java DataBase Connection,Java数据库连接)由一组用Java语言编写的类和接口组成。JDBC为使用数据库 及其工具的开发人员提供了一个标准的API,使他们能够用Java API来编写数据库应用程序。通过使用JDBC,开发人员 可以很方便地将SQL语句传送给几乎任何一种数据库。
JDBC的作用概括起来有如下3个方面: (1)建立与数据库的连接 (2)向数据库发起查询请求 (3)处理数据库返回结果
这些作用是通过一系列API实现的,其中的几个重要类或接口如表4-1所示。 表 与数据库有关的几个重要类或接口 接口 java.sql.Drivermanager java.sql.Connection java.sql.Statement java.sql.ResultSet
2.DrverManager
DriverManager类是Java.sql包中用于数据库驱动程序管理的类,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接,也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。一般的应用程序只使用它的getConnection()方法。这个方法用来建立与数据库的连接。
static Connection getConnection(String url, String username, String password):通过指定的数据的URL及用户名、密码创建数据库连接。 3.Connection
Connection是用来表示数据库连接的对象,对数据库的一切操作都是在这个连接基础上进行的。Connection类的主 要方法有:
作用 处理驱动程序的加载和建立新数据库连接 处理与特定数据库的连接 在指定连接中处理SQL语句 处理数据库操作结果集 void clearWarning( ):清除连接的所有警告信息。 Statement createStatement( ):创建一个Statement对象。
Statement CreateStatement(int resultSetType, int resultSetConcurrency):创建一个Statement对象,它将生成具有特定类型和并发性的结果集。
void commit( ):提交对数据库的改动并释放当前持有的数据库的锁。 void rollback( ):回滚当前事务中的所有改动并释放当前连接持有的数据库的锁。
String getCatalog( ):获取连接对象的当前目录。 boolean isClose( ):判断连接是否已关闭。 boolean isReadOnly():判断连接是否为只读模式。 void setReadOnly():设置连接的只读模式。 void close():立即释放连接对象的数据库和JDBC资源。 4. Statement
Java所有SQL语句都是通过陈述(Statement)对象实现的。Statement用于在已经建立的连接的基础上向数据库发送SQL语句的对象。
? Statement对象的建立
通过Connection对象的createStatement方法建立Statement对象: Statement stmt=con.createStatement();
如果要建立可滚动的记录集,需要使用如下格式的方法: public
Statement
createStatement(int
resultSetType,
int
resultSetConcurrency) throws SQLException
resultSetType可取下列常量:
ResultSet.TYPE_FORWARD_ONL:只能向前,默认值。
ResultSet.TYPE_SCROLL_INSENSITIVE:可操作数据集的游标,但不反映数据的变化。
ResultSet.TYPE_SCROLL_SENSITIVE:可操作数据集的游标,反映数据的变化。 resultSetConcurrency的取值:
ResultSet.CONCUR_READ_ONLY:不可进行更新操作。
ResultSet.CONCUR_UPDATABLE:可以进行更新操作,默认值。 Statement对象的方法
Statement对象提供了三种执行SQL语句的方法:
ResultSet executeQuery(String sql):执行SELECT语句,返回一个结果集。 int executeUpdate(String sql):执行update、insert、delete 等不需要返回结果集的SQL语句。它返回一个整数,表示执行SQL语句影响的数据行数。
boolean execute(String sql):用于执行多个结果集、多个更新结果(或者两者
都有)的SQL语句。它返回一个boolean值。如果第一个结果是ResultSet对象,返回true;如果是整数,就返回false。取结果集时可以与getMoreResultSet、getResultSet和getUpdateCount结合来对结果进行处理。
5.ResultSet
ResultSet对象实际上是一个由查询结果数据构成的表。在ResultSet中隐含着一个指针,利用这个指针移动数据行,可以取得所要的数据,或对数据进行简单的操作。其主要的方法有:
boolean absolute(int row):将指针移动到结果集对象的某一行。 void afterLast():将指针移动到结果集对象的末尾。 void beforeFrist():将指针移动到结果集对象的头部。 boolean first():将指针移动到结果集对象的第一行。 boolean next():将指针移动到当前行的下一行。 boolean previous():将指针移动到当前行的前一行。 boolean last():将指针移动到当前行的最后一行。
此外还可以使用一组getXXX()方法,读取指定列的数据。XXX是JDBC中Java语言的数据类型。这些方法的参数有两种格式,一是用int指定列的索引,二是用列的字段名(可能是别名)来指定列。如:
String strName=rs.getString(2); String strName=rs.getString(\
5.案例 使用纯Java JDBC驱动程序实现数据库的连接
在相关网站下载驱动程序,通过Class.forName()方法加载驱动程序,再通过驱动程序管理器(DriverManager)的方法getConnection()建立连接。 【代码与注释】
import java.sql.*; import javax.swing.*; class ConnectServer2 {
//连接数据类
static Connection con=null;//连接对象
public static boolean conn(String url,String username,String password) {
}
try { { } try { }
catch(SQLException e) { }
return true;//成功
e.printStackTrace(); return false;
con=DriverManager.getConnection(url,username,password);//连接e.printStackTrace();//在命令行打印异常信息在程序中出错的位置及return false;
Class.forName(\}catch(Exception e)
原因
数据库
public static boolean close() { }
public static void main(String args[]) {
//连接SQL Server数据库
if(conn(\try { { }
return true;
return false;
con.close();//关闭数据库 con=null;
}catch(SQLException e)
gl\ }
学习利用纯Java JDBC驱动程序实现数据库连接。 【应用扩展】
连接其他类型的数据库使用的驱动程序,可参考表4-2。
表4-2 常用的数据库驱动程序
数据库 MySQL Oracle 驱动类 org.git.mm.mysql.Driver oracle.jdbc.driver.OracleDriver 【相关知识】
1. 纯Java JDBC驱动程序
纯Java JDBC驱动程序是独立的连接驱动程序,不需要中间服务器,与数据库实现通信的整个过程均由Java语言 实现。这种方法目前应用较广泛,缺点是需要下载相应的类包,不同数据库的连接代码可能不同。连接SQL Server可 以在www.msdn.com网站下载。有三个类包:msbase.jar、mssqlserver.jar、msutil.jar。使用时要将这三个包放在 jdk\\jre\\lib\\ext\\目录下,或者所放的位置设置到CLASSPATH中即可。 2.使用纯Java JDBC驱动程序连接数据库 (1)加载驱动程序
在JDBC中,通常有两种加载驱动程序的方式。
一种是将驱动程序添加到java.lang.System的属性jdc.drivers中。这是一个由DriverManager类加载驱动程序类名的列表,用冒号分隔。在JDBC的java.sql.DrvierManager类初始化时,JVM的系统属性中搜索jdbc.drivers字段的内
容。如果存在以冒号分隔的驱动程序名称,则 DriverManager类加载相应的驱动程序。
另一种方式是在程序中利用Class.forName()方法加载指定的驱动程序,如: Class.forName(\
URL jdbc:mysql://localhost:3306/xsgl jdbc:oracle:thin:@127.0.0.1:1521:xsgl 下载地址 }
{ } else
JOptionPane.showMessageDialog(null,\数据库连接失败!\
JOptionPane.showMessageDialog(null,\数据库连接成功!\close();//关闭数据库
http://www.mysql.com/downlm http://ont.oracle.com/soft需要注意的是,连接不同的数据库,加载的驱动程序有所不同。 (2)创建指定数据库的URL
要建立与数据库的连接,首先要创建指定数据库的URL。数据库的URL对象类似网络资源的统一定位。其构成格 式如下:
jdbc:subProtocol:subName://hostname:port;DatabaseName=XXX 其中:jdbc表示当前通过Java的数据库连接进行数据库访问。
subProtocal表示通过某种驱动程序支持的数据库连接机制。 subName表示在当前连接机制下的具体名称。 hostName表示主机名。port表示相应的连接端口。 DatabaseName是要连接的数据库的名称。
按照上述构造规则,可以构造如下类型的数据库URL:
jdbc.microsoft:sqlserver://localhost:1433;DatabaseName=xsgl 该数据库URL表示利用Microsoft提供的机制,选择名称为sqlserver的驱动,通过1433端口访问本机上的xsgl数据库。
数据的基本操作
数据的基本操作主要是指对数据的查看、添加、修改、删除、查询等操作,利用Java的Statement对象所提供的成员方法,可以方便地实现这些操作。 案例 3 读取数据
利用Connection对象的createStatement方法建立Statement对象,在利用Statement对象的executeQuery()的方法执行SQL语句进行查询,返回结果集。再利用形如getXXX()的方法从结果集中读取数据。 【案例说明】
利用上面定义的ConnectServer类建立连接,读取学生档案(xsda)表中的数据,显示在如图4-1所示的窗体中,并且能够前后移动记录。
学习数据库的基本操作方法。
为了方便,案例中的组件采用的都是文本组件。在实际应用中,也经常使用其他组件。例如,性别用单选钮。如果改成单选钮,男和女两个单选钮要建立成组,并根据数据库中读出的数据,设置其选中状态。读者可参考下一案例。
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.sql.*;
public class StudentDataWindow extends JFrame implements ActionListener { ,
ResultSet.CONCUR_READ_ONLY);//创建Statment对象,指定记录集rs=stmt.executeQuery(\执行查询,返回结Container con=getContentPane();
可滚动,但只读 果集
String title[]={\班级:\学号:\姓名:\性别:\出生日期:\团员否:\JTextField txtClassID=new JTextField(2); JTextField txtNo=new JTextField(2); JTextField txtName=new JTextField(10); JTextField txtSex=new JTextField(3); JTextField txtBirthDate=new JTextField(10); JTextField txtIsMember=new JTextField(2); JTextField txtAddress=new JTextField(30); JTextArea txtResume=new JTextArea(); JButton next=new JButton(\下一页\JButton prev=new JButton(\上一页\JButton first=new JButton(\首页\JButton last=new JButton(\尾页\Statement stmt; ResultSet rs; StudentDataWindow() {
stmt=ConnectServer.con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE
super(\学生档案信息查看窗口\setSize(450,395); try {
家庭地址:\简历:\
con.setLayout(new BorderLayout(0,8)); JPanel p[]=new JPanel[7]; for(int i=0;i<7;i++) { }
p[0].add(txtClassID); p[1].add(txtNo); p[2].add(txtName); p[3].add(txtSex); p[4].add(txtBirthDate); p[5].add(txtIsMember); p[6].add(txtAddress);
JPanel p1=new JPanel(new GridLayout(7,1,0,8)); JScrollPane
jp=new
JScrollPane(txtResume,
JScrollPane.HORIZONTAL_SCROLLB
p[i]=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0)); p[i].add(new JLabel(title[i]));
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, AR_NEVER);
jp.setPreferredSize(new Dimension(380,80)); for(int i=0;i<7;i++) p1.add(p[i]);
JPanel p2=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0)); p2.add(new JLabel(title[7])); p2.add(jp);
JPanel p3=new JPanel(); p3.add(prev); p3.add(next); p3.add(first); p3.add(last); con.add(p1,\con.add(p2,\con.add(p3,\
next.addActionListener(this); prev.addActionListener(this); first.addActionListener(this); last.addActionListener(this);
}
{ }
rs.first(); loadData();
}catch(Exception e)
e.printStackTrace();
setVisible(true); });
public void windowClosing(WindowEvent e){ }
System.exit(0);
addWindowListener(new WindowAdapter(){
boolean loadData()
{ //读结果集中数据,并设置到相应的组件 }
public void actionPerformed(ActionEvent e) {
try {
if(e.getSource()==next)rs.next(); //下一记录 else if(e.getSource()==prev)rs.previous(); //前一记录 try { {
e.printStackTrace(); return false;
txtNo.setText(rs.getString(\
txtClassID.setText(rs.getString(\txtName.setText(rs.getString(\txtSex.setText(rs.getString(\
txtBirthDate.setText(rs.getString(\txtAddress.setText(rs.getString(\txtIsMember.setText(rs.getString(\txtResume.setText(rs.getString(\
}catch(SQLException e)
} return true;
}
}
}
else if(e.getSource()==first)rs.first(); //首记录 else if(e.getSource()==last)rs.last(); //尾记录 loadData(); //重新读取数据
catch(Exception ee){}
public static void main(String args[]) {
JFrame.setDefaultLookAndFeelDecorated(true); Font font = new Font(\
Enumeration keys = UIManager.getLookAndFeelDefaults().keys(); while (keys.hasMoreElements()) { }
Object key = keys.nextElement();
if(UIManager.get(key)instanceof Font) UIManager.put(key, font);
if(!ConnectServer.conn(\ }
{ }
StudentDataWindow mainFrame = new StudentDataWindow();
JOptionPane.showMessageDialog(null,\数据库连接不成功!\System.exit(0);
baseName=xsgl\
【应用扩展】
为了方便,案例中的组件采用的都是文本组件。在实际应用中,也经常使用其他组件。例如,性别用单选钮。如果改成单选钮,男和女两个单选钮要建立成组,并根据数据库中读出的数据,设置其选中状态。读者可参考下一案例。
案例4 数据更新 【案例说明】
数据的更新包括表的创建、删除及记录的增、删、改操作。本案例实现了对数据的更新操作,界面上的组件更加丰富。
运行界面如图 所示。
【技术要点】
利用Connection对象的createStatement方法建立Statement对象,再利用Statement对象的executeUpdate()的方法执行update语句,实现数据修改;执行insert语句,实现数据添加。 package com.test6; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.sql.*;
class Student2 extends JFrame implements ActionListener {
String title[]={\班级\学号\姓名\性别\出生日期\团员否\邮箱JComboBox cno=new JComboBox(); JTextField sno=new JTextField(5); JTextField name=new JTextField(10); JTextField bir=new JTextField(10); JTextField email=new JTextField(30); JTextArea resume=new JTextArea();
JRadioButton radioSexM=new JRadioButton(\男\JRadioButton radioSexF=new JRadioButton(\女\JCheckBox checkisparty=new JCheckBox(\JButton ok=new JButton(\保存\JButton cancel=new JButton(\取消\Statement stmt; ResultSet rs; int No;
Student2(int No) {
this.No=No; if(No==-1)
setTitle(\添加学生档案窗口\else setTitle(\修改学生档案窗口\
\简历\
try {
Container con=getContentPane(); con.setLayout(new BorderLayout(0,5));
stmt=Connect.con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
rs=stmt.executeQuery(\while(rs.next()) { }
ButtonGroup bgp=new ButtonGroup(); //为单选钮分组 bgp.add(radioSexM); bgp.add(radioSexF); setSize(450,410);
JPanel p[]=new JPanel[7]; for(int i=0;i<7;i++) { }
p[0].add(cno); p[1].add(sno); p[2].add(name); p[3].add(radioSexM); p[3].add(radioSexF); p[4].add(bir);
p[5].add(checkisparty); p[6].add(email);
JPanel p1=new JPanel(new GridLayout(7,1,0,5)); for(int i=0;i<7;i++) p1.add(p[i]);
JPanel p2=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0)); JScrollPane
jp=new
p[i]=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0)); p[i].add(new JLabel(title[i])); //将班级信息添入到下拉列表中 cno.addItem(rs.getString(1));
cno.addItem(rs.getString(1));
JScrollPane(resume,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
{
e.printStackTrace(); }
setVisible(true);
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jp.setPreferredSize(new Dimension(370,80)); p2.add(new JLabel(title[7]));p2.add(jp); JPanel p3=new JPanel(); p3.add(ok);p3.add(cancel); con.add(p1,\con.add(p2,\con.add(p3,\ok.addActionListener(this); cancel.addActionListener(this); if(No!=-1) {
rs=stmt.executeQuery(\
\
from
xuesheng
where
SNo=\
rs.first(); loadData();
sno.setEditable(false);
} rs.close();
}catch(Exception e)
}
boolean loadData() { //将数据填到组件 try {
cno.setSelectedItem(rs.getString(1)); sno.setText(rs.getString(2)); name.setText(rs.getString(3)); if(rs.getString(4).equals(\男\ radioSexM.setSelected(true); else
radioSexF.setSelected(true); bir.setText(rs.getString(5));
if(rs.getString(6).toUpperCase().equals(\ checkisparty.setSelected(true); else
checkisparty.setSelected(false); email.setText(rs.getString(7)); resume.setText(rs.getString(8));
}catch(SQLException e) {
e.printStackTrace(); return false;
} return true; }
public void actionPerformed(ActionEvent e) {
try {
if(e.getSource()==ok) {
String sex,isMember; int classID; Statement
ResultSet.CONCUR_UPDATABLE);
stmt=Connect.con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet rs=stmt.executeQuery(\CLno from xuesheng
+cno.getSelectedItem()+\
where CLno= '\
rs.first();
classID=rs.getInt(1);
if(radioSexM.isSelected()) sex=\男\else sex=\女\if(checkisparty.isSelected()) isMember=\else isMember=\String sql;
{
if(No==-1) { } else {
//修改记录
sql=\sql=sql+\
sql=sql+\sql=sql+\//添加记录 sql=sql+\
sql=sql+\sql=sql+email.getText()+\
sql=\values(\
sql=sql+\
sql=sql+\}
stmt.executeUpdate(sql); //执行SQL语句
}
else if(e.getSource()==cancel) dispose();
}catch(Exception ee)
ee.printStackTrace();
}
}
public static void main(String args[]) {
JFrame.setDefaultLookAndFeelDecorated(true); Font font = new Font(\
Enumeration keys = UIManager.getLookAndFeelDefaults().keys(); while (keys.hasMoreElements()) {
Object key = keys.nextElement();
if(UIManager.get(key) instanceof Font)UIManager.put(key, font);
}
if(!Connect.conn(\ }
{ }
new Student2(-1); //添加新记录的调用方法 //new Student2(2); //修改学号为2的记录
JOptionPane.showMessageDialog(null,\数据库连接不成功!\System.exit(0);
sa\
} import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.sql.*;
class StudentDataUpdate extends JFrame implements ActionListener {
String title[]={\班级\学号\姓名\性别\出生日期\团员否\家庭地JComboBox combClassID=new JComboBox(); JTextField txtNo=new JTextField(2); JTextField txtName=new JTextField(10); JTextField txtBirthDate=new JTextField(10); JTextField txtAddress=new JTextField(30); JTextArea txtResume=new JTextArea();
JRadioButton radioSexM=new JRadioButton(\男\JRadioButton radioSexF=new JRadioButton(\女\JCheckBox checkIsMember=new JCheckBox(\JButton ok=new JButton(\保存\JButton cancel=new JButton(\取消\Statement stmt; ResultSet rs; int No;
StudentDataUpdate(int No) 址\简历\
{
stmt=ConnectServer.con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE
rs=stmt.executeQuery(\name from classclass order by ID while(rs.next()) { }
ButtonGroup bgp=new ButtonGroup(); //为单选钮分组 bgp.add(radioSexM); bgp.add(radioSexF); setSize(450,410);
JPanel p[]=new JPanel[7]; for(int i=0;i<7;i++) { }
p[0].add(combClassID); p[1].add(txtNo); p[2].add(txtName); p[3].add(radioSexM); p[3].add(radioSexF); p[4].add(txtBirthDate); p[5].add(checkIsMember); p[6].add(txtAddress);
p[i]=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0)); p[i].add(new JLabel(title[i])); //将班级信息添入到下拉列表中
combClassID.addItem(rs.getString(1));
this.No=No; if(No==-1)
setTitle(\添加学生档案窗口\else setTitle(\修改学生档案窗口\try {
Container con=getContentPane();
con.setLayout(new BorderLayout(0,5)); //设置边界布局
,ResultSet.CONCUR_UPDATABLE); //建立可滚动并且可更新的结果集 asc\
JPanel p1=new JPanel(new GridLayout(7,1,0,5)); for(int i=0;i<7;i++) p1.add(p[i]);
JPanel p2=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0)); JScrollPane
jp=new
JScrollPane(txtResume,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jp.setPreferredSize(new Dimension(370,80)); p2.add(new JLabel(title[7]));p2.add(jp); JPanel p3=new JPanel(); p3.add(ok);p3.add(cancel); con.add(p1,\con.add(p2,\con.add(p3,\ok.addActionListener(this); cancel.addActionListener(this); if(No!=-1) {
rs=stmt.executeQuery(\
from
class.ID
and
classclass.name,xsda.no,xsda.name,xsda.sex,xsda.birthDate,xsda.isMember,speciality.specialityName,xsda.ddress,xsda.resume xsda,speciality,classclass
{
e.printStackTrace(); }
setVisible(true);
where
xsda.classID=class
xsda.speciality=speciality.specialityID and xsda.No=\
rs.first(); loadData();
txtNo.setEditable(false);
} rs.close();
}catch(Exception e)
}
boolean loadData() { //将数据填到组件 try
{
combClassID.setSelectedItem(rs.getString(1)); txtNo.setText(rs.getString(2)); txtName.setText(rs.getString(3)); if(rs.getString(4).equals(\男\ radioSexM.setSelected(true); else
radioSexF.setSelected(true); txtBirthDate.setText(rs.getString(5));
if(rs.getString(6).toUpperCase().equals(\ checkIsMember.setSelected(true); else
checkIsMember.setSelected(false); txtAddress.setText(rs.getString(8)); txtResume.setText(rs.getString(9));
}catch(SQLException e) {
e.printStackTrace(); return false;
} return true; }
public void actionPerformed(ActionEvent e) {
try {
if(e.getSource()==ok) {
String sex,isMember; int classID; Statement
stmt=ConnectServer.con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=stmt.executeQuery(\id from classclass rs.first();
classID=rs.getInt(1);
where name= '\
{
if(radioSexM.isSelected()) sex=\男\else sex=\女\
if(checkIsMember.isSelected()) isMember=\else isMember=\String sql; if(No==-1) {
//添加记录 sql=sql+\
sql=\into xsda(classID,name,sex,birthDate,isMember,address,resume)\values(\
sql=sql+\sql=sql+txtAddress.getText()+\
} else {
//修改记录
sql=\sql=sql+\
sql=sql+\
sql=sql+\
sql=sql+\}
stmt.executeUpdate(sql); //执行SQL语句
sql=sql+\
}
else if(e.getSource()==cancel) dispose();
}catch(Exception ee)
ee.printStackTrace();
}
}
} try
public static void main(String args[]) {
JFrame.setDefaultLookAndFeelDecorated(true); Font font = new Font(\
Enumeration keys = UIManager.getLookAndFeelDefaults().keys(); while (keys.hasMoreElements()) {
Object key = keys.nextElement();
if(UIManager.get(key) instanceof Font)UIManager.put(key, font);
}
if(!ConnectServer.conn(\ }
{ }
//new StudentDataUpdate(-1); //添加新记录的调用方法 new StudentDataUpdate(2); //修改学号为2的记录
JOptionPane.showMessageDialog(null,\数据库连接不成功!\System.exit(0);
baseName=xsgl\
{
rs.updateRow(); }catch(Exception e){}}
使用PreparedStatement对象删除数据表记录
与使用Statement类似,只是创建SQL语句时,可以带参数(以“?”表示)。 String sql= \
PreparedStatment pstmt= ConnectServer.con.prepareStatement(sql); pstmt.setString(1, '黄小华'); int rowCount=pstmt.executeUpdate();
if(rowCount>0)System.out.println(\成功删除记录\
【应用扩展】
案例中对数据的操作均使用SQL完成。在构造SQL语句时十分麻烦,实际上对数据的更新还有其他方法。例如,使用预处理(PreparedStatement)对象不仅可以提高操作的速度,而且书写也会简单。在后面的内容中将介绍几种更新数据的方法。 【相关知识】
1.数据表记录增加操作
(1)数据表记录增加的SQL语法insert into 表名(字段名1,字段名2?) values(字段值
1,
字
段
值
2,
?
)
例
如
:
insert
into
xsda(classID,name,sex,birthDate,isMember,address,resume) values(12,'张磊','男',' 1988-9-8',1, '北京', ' ')
(2)使用Statement对象增加数据表记录 首先创建一个SQL语句。然后调用Statement对象的executeUpdate()方法。 stmt.executeUpdate(sql); 上述方法可以返回一个整数,表明成功插入的记录数。
(3)使用moveToInsertRow 和insertRow方法增加数据表记录 String sql=\from xsda\
ResultSet rs=stmt.executeQuery(sql); //获取数据表的全部结果集 rs.moveToInsertRow(); //将数据表指针移到插入记录位置 rs.updateInt(2, 13); //向classID字段输入数据 rs.updateString(3, '黄红'); //向name字段输入数据 rs.updateString(4, '女'); //向sex字段输入数据
rs.updateString(5, '1997-9-12'); //向birthDate字段输入数据 rs.updateString(6, '大连'); //向address字段输入数据 rs.updateInt(7, 1); //向isMember字段输入数据 rs.updateString(8, ' 无'); //向resume字段输入数据 try {
rs.insertRow(); }catch(Exception e){}
(4)使用PrepareStatement对象增加数据表记录 与使用Statement类似,只是创建SQL语句时,可以带参数(以“?”表示)。插入时通过更改参数实现记录的更新。 String sql= \into xsda(classID,name,sex,birthDate,isMember,addre
ss,resume) values(?,?,?,?,?, ?, ' ')\
PrepareStatment pstmt= ConnectServer.con.prepareStatement(sql); pstmt.setInt(1, 14);
pstmt.setString(2, '黄少军'); pstmt.setString(3, '男'); pstmt.setString(4, '1987-4-10'); pstmt.setString(5, '上海'); pstmt.setInt(6, 0);
int rowCount=pstmt.executeUpdate();
if(rowCount>0)System.out.println(\成功插入记录\
2.数据表记录修改操作
(1)数据表记录修改的SQL语法 update 表名 set 字段1=字段值1,字段2=字段值2? where 特定条件 例如: update xsda name='黄小华' where name='黄少华' (2)使用Statement对象修改数据表记录 首先创建一个SQL语句。然后调用Statement对象的executeUpdate()方法。
stmt.executeUpdate(sql); 上述方法可以返回一个整数,表明成功修改的记录数。 (3)使用ResultSet对象修改数据表记录
String sql=\黄少华'\ResultSet rs=stmt.executeQuery(sql); //获取数据表的结果集
if(rs.next()){ rs.updateString(3, '黄小华'); //修改name字段的数据 try{
rs.updateRow(); }catch(Exception e){} }
(4)使用PrepareStatement对象修改数据表记录 与使用Statement类似,只是创建SQL语句时,可以带参数(以“?”表示)。修改时通过更改参数实现记录的更新。 String sql= \黄少华'\PrepareStatment pstmt= ConnectServer.con.prepareStatement(sql); pstmt.setString(1, '黄小华'); int rowCount=pstmt.executeUpdate();
if(rowCount>0)System.out.println(\成功修改记录\
3.数据表记录删除操作
(1)数据表记录删除的SQL语法 delete form 表名 where 特定条件 例如: delete from xsda where name='黄小华'
(2)使用Statement对象删除数据表记录 首先创建一个SQL语句。然后调用Statement对象的executeUpdate()方法。 stmt.executeUpdate(sql); 上述方法可以返回一个整数,表明成功删除的记录数。
(3)使用ResultSet对象删除数据表记录
String sql=\黄少华'\
ResultSet rs=stmt.executeQuery(sql); //获取数据表的结果集 if(rs.next()){ rs.deleteRow(); //删除该行
利用Connection对象的getMetaData()方法创建DatabaseMetaData对象,从该对象中获取数据库的基本信息。 4_3_1.jpg
本案例运行后能够获取数据库的存放位置、使用的驱动程序、所包含的表的信息,及其中一个的表的列信息。
4.3.1 案例4-5 获取数据库基本信息 学习获取数据基本信息的方法。
使用数据库元数据对象还可以获得数据库对SQL支持的信息。 例如:
getNumericsFunctions():获取数据库支持的数学函数。 getStringFunctions():获取数据库支持的系统字符串函数。 getSystemFunction():获取数据库支持的系统函数。
SupportsANSI92FullSQL():获取数据库是否支持ANSI92全集SQL语法的布尔值。
import java.awt.*; import java.sql.*; import java.awt.event.*; import javax.swing.*; import java.util.*;
import javax.swing.table.*;
public class QueryDataBase extends JFrame {
JTable table1,table2,table3; JScrollPane sp1,sp2,sp3; JPanel p1=new JPanel(); public QueryDataBase() {
Vector vc1=new Vector(); Vector header1=new Vector(); Vector vc2=new Vector(); Vector header2=new Vector(); Vector vc3=new Vector(); Vector header3=new Vector(); Vector v1; try {
DatabaseMetaData dbmd=ConnectServer.con.getMetaData(); //元数据String url=dbmd.getURL(); //获得数据库的位置
String driverName=dbmd.getDriverName(); //获得数据库的驱动v1=new Vector(); v1.addElement(url); v1.addElement(driverName); vc1.addElement(v1);
ResultSet rs=dbmd.getTables(null,null,\获取表的信息 while(rs.next()) { }
rs=dbmd.getColumns(null,null,\获取列的信息 while(rs.next()) {
v1=new Vector(); v1=new Vector();
v1.addElement(rs.getString(\表名 v1.addElement(rs.getString(\类型 vc2.addElement(v1);
对象
程序
}
}
v1.addElement(rs.getString(\列名 v1.addElement(rs.getString(\类型名 v1.addElement(rs.getString(\大小 vc3.addElement(v1);
}catch(SQLException e){} header1.addElement(\位置\header1.addElement(\驱动程序\table1=new JTable(vc1,header1); header2.addElement(\表名称\header2.addElement(\表类型\table2=new JTable(vc2,header2); header3.addElement(\字段名\header3.addElement(\字段类型\header3.addElement(\字段大小\table3=new JTable(vc3,header3); sp1=new JScrollPane(table1); sp2=new JScrollPane(table2); sp3=new JScrollPane(table3); p1.setLayout(new GridLayout(2,1)); setSize(300,300);
sp1.setPreferredSize(new Dimension(200,40)); p1.add(sp2);p1.add(sp3);
this.getContentPane().add(sp1,\this.getContentPane().add(p1,\setTitle(\数据库基本信息查询\setVisible(true);
public static void main(String args[]) {
JFrame.setDefaultLookAndFeelDecorated(true); Font font = new Font(\
Enumeration keys = UIManager.getLookAndFeelDefaults().keys(); while (keys.hasMoreElements()) {
Object key = keys.nextElement(); if (UIManager.get(key) instanceof Font)
}
}
UIManager.put(key, font);
if(!ConnectServer.conn(\ }
{
JOptionPane.showMessageDialog(null,\数据库连接不成功!\System.exit(0);
baseName=xsgl\
} new QueryDataBase();
数据库的基本信息可以通过DatabaseMetaData对象获得。DatabaseMetaData对象要使用Connection对象的getMetaData()方法创建。DatabaseMetaData对象的主要方法有: String getURL():返回数据库系统的URL。
String getDatabaseProductName():获得数据库产品名。 String getDriverName():获得驱动程序名称。
ResultSet
getTables(String
catalog,
String
schemaPattern,String
tableNamePattern,String[] types):获得表的信息 。其中catalog为目录名,null表示忽略目录;schemaPattern为大纲的匹配模式,null表示忽略;schemaPattern表示 名称匹配模式;type为需要检索的表类型列表。该方法返回一个结果集,主要的字段有TABLE_NAME、TABLE_TYPE 等。类型可以是\, \, \TABLE\, \,\, \,\。
ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern,String columnNamePattern): 获得表的列信息,其中columnNamePattern为列名的匹配模式。该方法获得的结果集每一行都是一个列的描述,主要 的字段COLUMN_NAME, COLUMN_SIZE,TYPE_NAME等。
ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern):获得存储过程的 信息,其中procedureNamePattern为存储过程名的匹配模式。该方法获得的结果集每一行都是一个存储过程的描述, 主要的字段有PROCEDURE_NAME,PROCEDURE_NAME等。
ResultSet getProcedureColumns(String catalog, String schemaPattern,String procedureNamePattern, String columnNam ePattern):获得存储过程结果集中的列信息。columnNamePatter为列名的匹配模式。
对于记录集对象,也可以使用ResultSet的getMetaData()获得表的元数据。该方法返回ResultSetMetaData对象。 ResultSetMetaData对象主要有如下方法: int getColumnCount():返回记录集的列数。
String getColumnName(int column):返回指定列名称。 int getColumnType(int column):返回指定列类型号。
boolean isAutoIncrement(int index):判断指定字段是都为自动增值字段。
java.swing.table包中的JTable类可用来建立表格。利用默认的表格数据模型(DefaultTableModel)建立表格,对维护表格数据十分方便。 4_4_1.jpg
本案例通过表格显示学生档案信息,并提供了分页功能。 4.4.1 案例4-6 使用表格浏览数据 学习利用表格显示数据库数据的方法。
利用数据模型建立表格,对表格的维护也比较方便。例如: 1.增加行或列
dtm.addRow(new Vector()); //添加一空行 dtm.addColumn(\新列名\添加一列
2. 删除行
int rowcount = defaultModel.getRowCount()-1;//返回行数 if(rowcount >= 0) {
dtm.removeRow(rowcount); //删除尾行
dtm.setRowCount(rowcount); //删除行后必须重新设置行数。 }
3.删除列
int columncount = defaultModel.getColumnCount()-1; if(columncount >= 0)
{ //若columncount<0代表已经没有任何列了。
TableColumnModel columnModel = table.getColumnModel(); TableColumn tableColumn = columnModel.getColumn(columncount); columnModel.removeColumn(tableColumn); //删除列
dtm.setColumnCount(columncount); //重新设置列数 }
import java.awt.*; import java.sql.*; import java.awt.event.*; import javax.swing.*; import java.util.*;
import javax.swing.table.*;
public class Student3 extends JFrame implements ActionListener {
JTable table; //定义表格 DefaultTableModel dtm; //定义数据模型 Vector title=new Vector(); //表头向量 JScrollPane p1;
JPanel p2=new JPanel();
JButton b1=new JButton(\首页\); JButton b2=new JButton(\上页\); JButton b3=new JButton(\下页\); JButton b4=new JButton(\尾页\); JLabel bb=new JLabel(\); int count=0; //记录数 int pagesize=2; //页大小 int pagecount=0; //页数 int page=1; //当前页 Statement stmt;
ResultSet rs; public Student3() {
String sql=\SNo as 学号, SName as 姓名,SSex as 性别,SBir as 出try{
生日期 from xuesheng\;
stmt=Connect.con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs=stmt.executeQuery(sql); count=getcount();
pagecount=(int)count/pagesize+(count%pagesize==0?0:1); ResultSetMetaData dbmd=rs.getMetaData(); //获得表的元数据 for(int i=1;i<=dbmd.getColumnCount();i++)
title.addElement(dbmd.getColumnName(i)); //将列名填入表 dtm=new DefaultTableModel(null,title); //建立默认的表格数 table=new JTable(dtm); //由数据模型建立表格 initTable(); //向表格中添如数据 table.setRowHeight(25); //设置表格行高 p1=new JScrollPane(table); //附加滚动条 if(pagecount!=0)
bb.setText(\第\+page+\页 b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); b4.addActionListener(this); p2.add(b1); p2.add(b2); p2.add(b3); p2.add(b4); p2.add(bb);
this.getContentPane().add(p1,\); this.getContentPane().add(p2,\);
头向量 据模型