1. 建立数据库连接

例1.1 使用JDBC-ODBC桥来连接一个Access数据库。

该数据库的名称为FirstExample,在ODBC数据源中的名称为forStudy,用户名和密码均为空。

package connectDataBase;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; public class connect { public static void main(String[] args) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载数据库驱动
Connection con =DriverManager.getConnection("jdbc:odbc:forStudy","", ""); //这里是ODBC数据源名称
System.out.println("数据库连接成功!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} } }

2. 关闭数据库连接

例2.1 关闭数据库连接示例。

package connectDataBase;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; public class connect { public static void main(String[] args) {
Connection con = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载数据库驱动
con =DriverManager.getConnection("jdbc:odbc:forStudy","", ""); //这里是ODBC数据源名称
System.out.println("数据库连接成功!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{ //在这里关闭数据库
if(con!=null){
try {
if(!con.isClosed())
con.close(); //关闭数据库连接
System.out.println("数据库已关闭!");
} catch (SQLException e) {
e.printStackTrace();
}
}
} } }

3. 添加新数据

一般将SQL语句存放在一个Statement对象中,然后先执行该对象的executeUpdate()方法就可以了。

例3.1 向数据库中添加新数据。

package connectDataBase;
import java.sql.*;
public class insertData {
public static void main(String[] args) {
Connection con = null;
Statement sta;
String sqlString = "insert into student values('30','小王','男','湖南湘潭','N-408','8293456')";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:forStudy","","");
System.out.println("数据库连接成功!");
sta = con.createStatement();
sta.executeUpdate(sqlString);
System.out.println("插入成功!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(con!=null){
try {
if(!con.isClosed())
con.close();
System.out.println("数据库关闭!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} }

一个可以接收用户输入的程序:

package connectDataBase;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.*;
public class insertData {
public static void main(String[] args) {
Connection con = null;
Statement sta;
String code,name,sex,address,room,tel;
code = getInput("请输入编号: ");
name = getInput("请输入姓名: ");
sex = getInput("请输入性别: ");
address = getInput("请输入地址: ");
room = getInput("请输入寝室: ");
tel = getInput("请输入电话: ");
String sqlString = "insert into student values('"+code+"','"+name+"','"+sex+"','"+address+"','"+room+"','"+tel+"')";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:forStudy","","");
System.out.println("数据库连接成功!");
sta = con.createStatement();
sta.executeUpdate(sqlString);
System.out.println("插入成功!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(con!=null){
try {
if(!con.isClosed())
con.close();
System.out.println("数据库关闭!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} private static String getInput(String str) {
String msg = "";
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print(str);
msg = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return msg;
} }

单纯地通过拼接字符串的方式将程序中的变量组合成标准的SQL语句是非常容易出错的,如果字符本身中还含有双引号或单引号,转化工作就会变的更为困难。所以,java又提供了一个PreparedStatement类,该类一个重要的作用就是提供了一个“占位符”,可以方便程序员进行转换的工作。

上面的程序可以改为:

package connectDataBase;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.*;
public class insertData {
public static void main(String[] args) {
Connection con = null;
// Statement sta;
PreparedStatement ps;
String code,name,sex,address,room,tel;
code = getInput("请输入编号: ");
name = getInput("请输入姓名: ");
sex = getInput("请输入性别: ");
address = getInput("请输入地址: ");
room = getInput("请输入寝室: ");
tel = getInput("请输入电话: ");
// String sqlString = "insert into student values('"+code+"','"+name+"','"+sex+"','"+address+"','"+room+"','"+tel+"')";
String sqlString = "insert into student values(?,?,?,?,?,?)";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:forStudy","","");
System.out.println("数据库连接成功!");
// sta = con.createStatement();
// sta.executeUpdate(sqlString);
ps = con.prepareStatement(sqlString);
ps.setString(1, code); //替换第一个占位符
ps.setString(2, name);
ps.setString(3, sex);
ps.setString(4, address);
ps.setString(5, room);
ps.setString(6, tel);
ps.executeUpdate();
System.out.println("插入成功!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(con!=null){
try {
if(!con.isClosed())
con.close();
System.out.println("数据库关闭!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} private static String getInput(String str) {
String msg = "";
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print(str);
msg = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return msg;
} }

程序运行结果如下:

请输入编号: 0013
请输入姓名: 张三
请输入性别: 男
请输入地址: 河南郑州
请输入寝室: A-527
请输入电话: 8723641
数据库连接成功!
插入成功!
数据库关闭!

4. 删除数据

删除数据很简单,只要执行SQL语句中的删除命令delete即可。

package connectDataBase;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.*;
public class deleteData { public static void main(String[] args) {
Connection con = null;
Statement sta;
String code= null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:forStudy","","");
code = getInput("请输入要删除的学生编号: ");
String sql = "delete from student where code='"+code+"'";
sta =con.createStatement();
int k = sta.executeUpdate(sql);
System.out.println("删除了"+k+"条记录,编号为:"+code);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(con!=null){
try {
if(!con.isClosed())
con.close();
System.out.println("数据库关闭!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} private static String getInput(String str) {
String msg=null;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print(str);
msg = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return msg;
} }

程序运行结果如下:

请输入要删除的学生编号: 30
删除了1条记录,编号为:30
数据库关闭!

5. 修改数据

使用SQL语句中的update命令就可以修改数据,下面是个简单的例子,将所有性别为“男”的记录改成女。

例5.1 修改数据示例。

package connectDataBase;
import java.sql.*;
public class updateData { public static void main(String[] args) {
Connection con = null;
Statement sta;
String sql;
int k;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:forStudy", "", "");
System.out.println("数据库连接成功!");
sql ="update student set sex='女' where sex='男'";
sta = con.createStatement();
k = sta.executeUpdate(sql);
System.out.println("修改了"+k+"条记录");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(con!=null){
try {
if(!con.isClosed())
con.close();
System.out.println("数据库关闭!");
} catch (SQLException e) {
e.printStackTrace();
}
}
} } }

程序运行结果如下:

数据库连接成功!
修改了3条记录
数据库关闭!

6. 查询数据

利用SELECT语句查询得到结果后,会将结果放在一个ResultSet集中,遍历这个集合就可以做任何需要的操作。

例6.1 先用SQL查询获取一个结果集,然后遍历这个结果集,将其中的记录输出到屏幕。

package connectDataBase;
import java.sql.*;
public class queryData {
public static void main(String[] args) {
Connection con = null;
Statement sta;
ResultSet rs;
String code,name,sex,address,room,tel;
String sql;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:forStudy","","");
System.out.println("数据库连接成功!");
sta = con.createStatement();
sql = "select * from student";
rs = sta.executeQuery(sql);
while(rs.next()){
code = rs.getString("code");
name = rs.getString("name");
sex = rs.getString("sex");
address = rs.getString("address");
room = rs.getString("room");
tel = rs.getString("tel");
System.out.println(code+" "+name+""+sex+" "+address+" "+room+" "+tel);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(con!=null){
try {
if(!con.isClosed())
con.close();
System.out.println("数据库关闭!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

程序运行结果如下:

数据库连接成功!
0001 陈永华女 湖南长沙 N-405 13107311256
0012 李明女 湖南株洲 S-102 8945211
0013 张三女 河南郑州 A-527 8723641
数据库关闭!

在上述程序中,需要先将游标执行一次next()方法,才能读取数据。这是因为游标开始的时候位于第一条记录的前面。

7. 学生信息管理系统实例

程序代码如下:

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.*; import javax.swing.*; public class AddressList extends WindowAdapter implements ActionListener {
JFrame jf;
Container con;
JPanel jp[];
JTextField jtf[];
JLabel jl[];
JButton firstBtn,preBtn,nextBtn,lastBtn,addBtn,editBtn,delBtn,cancelBtn,saveBtn,searchBtn;
Connection conn = null;
Statement sta = null;
ResultSet rs = null;
protected int recordState = onlyRead, curRow = 0, recordCnt = 0;
public static final int onlyRead = 0, adding = 1, amending = 2;
public static final String lblmsg[]={"学生姓名","学籍号","身份证件号","性别","籍贯","民族",
"家庭住址","学校名称","学校标识码","年级","班级","联系电话"};
private static final int fieldCnt = 12;
//在构造方法中构造界面
public AddressList(){
jf = new JFrame("学籍信息管理系统");
con = jf.getContentPane();
con.setLayout(new BoxLayout(con,BoxLayout.Y_AXIS));
jp = new JPanel[7];
for(int i=0;i<7;i++){
jp[i] = new JPanel();
jp[i].setLayout(new FlowLayout());
}
jtf = new JTextField[fieldCnt];
jl = new JLabel[fieldCnt];
for(int i=0;i<fieldCnt;i++){
jtf[i] = new JTextField();
jtf[i].setColumns(36);
jtf[i].setEditable(false);
jl[i] = new JLabel();
jl[i].setText(lblmsg[i]);
jp[i/2].add(jl[i]);
jp[i/2].add(jtf[i]);
}
firstBtn = new JButton("第一条");
firstBtn.addActionListener(this);
preBtn = new JButton("上一条");
preBtn.addActionListener(this);
nextBtn = new JButton("下一条");
nextBtn.addActionListener(this);
lastBtn = new JButton("最后一条");
lastBtn.addActionListener(this);
addBtn = new JButton("增加记录");
addBtn.addActionListener(this);
editBtn = new JButton("编辑记录");
editBtn.addActionListener(this);
delBtn = new JButton("删除记录");
delBtn.addActionListener(this);
cancelBtn = new JButton("取消改变");
cancelBtn.addActionListener(this);
saveBtn = new JButton("保存记录");
saveBtn.addActionListener(this);
searchBtn = new JButton("查找记录"); //按身份证号查找
searchBtn.addActionListener(this);
jp[6].add(firstBtn);
jp[6].add(preBtn);
jp[6].add(nextBtn);
jp[6].add(lastBtn);
jp[6].add(addBtn);
jp[6].add(editBtn);
jp[6].add(delBtn);
jp[6].add(cancelBtn);
jp[6].add(saveBtn);
jp[6].add(searchBtn);
for(int i=0;i<7;i++)
con.add(jp[i]);
jf.setSize(1000, 400);
jf.setLocation(300, 200);
// jf.setResizable(false);
jf.setVisible(true);
jf.addWindowListener(this);
connection();
if(recordCnt>0) showData();
setFace();
}
//打开数据库
public void connection() {
// String path = this.getClass().getClassLoader().getResource("db/Student.mdb").getPath().substring(1);
String path = "D:\\Student.mdb";
String url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+path;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// conn = DriverManager.getConnection("jdbc:odbc:Student", "", "");
conn = DriverManager.getConnection(url, "", "");
sta = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = sta.executeQuery("select count(*) from student");
if(rs.next())
recordCnt = rs.getInt(1); //获取记录数
rs = sta.executeQuery("select * from student");
rs.next(); //将游标移动到第一条记录处
curRow = 1;
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(jf, "无法加载ODBC驱动");
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "数据库无法连接或没有记录");
} }
//设置按钮的初始状态
protected void setFace(){
firstBtn.setEnabled(false);
preBtn.setEnabled(false);
nextBtn.setEnabled(true);
lastBtn.setEnabled(true);
addBtn.setEnabled(true);
editBtn.setEnabled(true);
delBtn.setEnabled(true);
cancelBtn.setEnabled(false);
saveBtn.setEnabled(false);
} //退出系统时关闭数据库
public void windowClosing(WindowEvent e1){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
System.exit(0);
}
}
//依次在text中显示学生学籍信息(显示数据到控件中)
public void showData(){
try {
jtf[0].setText(rs.getString("name"));
jtf[1].setText(rs.getString("stuID"));
jtf[2].setText(rs.getString("IC"));
jtf[3].setText(rs.getString("sex"));
jtf[4].setText(rs.getString("native"));
jtf[5].setText(rs.getString("nation"));
jtf[6].setText(rs.getString("address"));
jtf[7].setText(rs.getString("schname"));
jtf[8].setText(rs.getString("schnum"));
jtf[9].setText(rs.getString("grade"));
jtf[10].setText(rs.getString("class"));
jtf[11].setText(rs.getString("tel"));
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "无法获取数据");
}
}
//几个辅助方法(供按钮调用)
protected void setTextState(boolean flag){ //设置文本读写状态
for(int i=0;i<fieldCnt;i++)
jtf[i].setEditable(flag);
} protected void setTextEmpty(){ //将所有文本框中的数据清除
for(int i=0;i<fieldCnt;i++)
jtf[i].setText(null);
jtf[5].setText("汉族");
jtf[7].setText("确山县任店镇第二初级中学");
jtf[8].setText("3141002842");
}
//"第一条"按钮事件响应代码
protected void doMoveFirst(){
//容错处理
if(curRow<=1){
firstBtn.setEnabled(false);
preBtn.setEnabled(false);
curRow = 1;
return;
}
try {
if(rs.first()){ //移动游标到第一条记录
showData(); //显示当前记录到界面上
curRow = 1; //记录游标的新位置
//重新设置按钮状态
firstBtn.setEnabled(false);
preBtn.setEnabled(false);
nextBtn.setEnabled(true);
lastBtn.setEnabled(true);
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "移动游标出错");
}
}
//"上一条"按钮事件响应代码
protected void doMovePrevior(){
if(curRow<=1){
firstBtn.setEnabled(false);
preBtn.setEnabled(false);
curRow = 1;
return;
}
try {
if(rs.previous()){ //向前移动游标
showData();
curRow--;
if(curRow==1){ //如果是第一条记录
firstBtn.setEnabled(false);
preBtn.setEnabled(false);
}
nextBtn.setEnabled(true);
lastBtn.setEnabled(true);
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "移动游标出错");
}
}
//"下一条"按钮事件响应代码
protected void doMoveNext(){
if(curRow>=recordCnt){ //容错处理
nextBtn.setEnabled(false);
lastBtn.setEnabled(false);
curRow=recordCnt;
return;
}
try {
if(rs.next()){ //向后移动游标
showData();
curRow++;
if(curRow==recordCnt){
nextBtn.setEnabled(false);
lastBtn.setEnabled(false);
}
firstBtn.setEnabled(true);
preBtn.setEnabled(true);
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "移动游标出错");
}
}
//"最后一条"按钮事件响应代码
protected void doMoveLast() {
if(curRow>=recordCnt){ //容错处理
nextBtn.setEnabled(false);
lastBtn.setEnabled(false);
curRow=1;
return;
}
try{
if(rs.last()){ //将游标移动到最后
showData();
curRow=recordCnt;
nextBtn.setEnabled(false);
lastBtn.setEnabled(false);
firstBtn.setEnabled(true);
preBtn.setEnabled(true);
}
} catch(SQLException e) {
JOptionPane.showMessageDialog(jf, "移动游标出错");
}
}
//增加记录按钮事件响应代码
protected void doAdd() {
if(recordState==onlyRead){ //原先是浏览状态,现在切换到编辑状态
firstBtn.setEnabled(false);
preBtn.setEnabled(false);
nextBtn.setEnabled(false);
lastBtn.setEnabled(false);
addBtn.setEnabled(true);
editBtn.setEnabled(false);
delBtn.setEnabled(false);
cancelBtn.setEnabled(true);
saveBtn.setEnabled(true);
recordState=adding;
setTextState(true); //将各个Text置为可写
setTextEmpty(); //将各个Text置空,准备编辑记录
}else { //原先就是编辑状态
if(doSave(false)) //先保存上次增加的记录
setTextEmpty(); //如果保存成功,准备增加下一条记录
}
}
//保存记录按钮事件响应代码
protected boolean doSave(boolean goViewState) {
try {
if(recordState==amending){ //如果是修改状态
for(int i=0;i<fieldCnt;i++)
rs.updateString(i+1, jtf[i].getText());
rs.updateRow(); //更新当前记录
goViewState = true; //准备切换到浏览状态
}else if(recordState==adding) { //这是增加状态
//将游标移动到准备插入的地方
rs.moveToInsertRow();
//下面3步是插入记录必备的
for(int i=0;i<fieldCnt;i++)
rs.updateString(i+1, jtf[i].getText());
rs.insertRow();
recordCnt++; //修改记录数
curRow=recordCnt; //移动标志
rs.last(); //将游标移动到最后,也就是插入记录的位置
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "保存数据不成功!");
return false;
}
if(goViewState){ //要切换回浏览状态
firstBtn.setEnabled(true);
preBtn.setEnabled(true);
nextBtn.setEnabled(false);
lastBtn.setEnabled(false);
addBtn.setEnabled(true);
editBtn.setEnabled(true);
delBtn.setEnabled(true);
cancelBtn.setEnabled(false);
saveBtn.setEnabled(false);
recordState=onlyRead;
setTextState(false);
}
return true;
}
//编辑记录按钮事件响应代码
protected void doEdit(){
if(0==recordCnt) return; //如果记录数为零,则不可能修改
//开始设置按钮的状态
firstBtn.setEnabled(false);
preBtn.setEnabled(false);
nextBtn.setEnabled(false);
lastBtn.setEnabled(false);
addBtn.setEnabled(false);
editBtn.setEnabled(false);
delBtn.setEnabled(false);
cancelBtn.setEnabled(true);
saveBtn.setEnabled(true);
recordState = amending; //置为修改状态
setTextState(true);
}
//取消改变按钮事件响应代码
protected void doCancel(){
if(recordCnt==0) return;
try {
rs.absolute(curRow); //移动到原先记录处
showData();
//设置按钮状态
if(curRow>1){
firstBtn.setEnabled(true);
preBtn.setEnabled(true);
}
if(curRow<recordCnt){
nextBtn.setEnabled(true);
lastBtn.setEnabled(true);
}
addBtn.setEnabled(true);
editBtn.setEnabled(true);
delBtn.setEnabled(true);
cancelBtn.setEnabled(false);
saveBtn.setEnabled(false);
recordState = onlyRead;
setTextState(false);
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "游标移动错误");
}
}
//删除记录按钮事件响应代码
protected void doDelete(){
if(0==recordCnt) return; //如果没有记录,则什么都不用做
if(JOptionPane.showConfirmDialog(jf, "删除后将不可恢复!确定要删除当前记录吗?","提示",JOptionPane.OK_CANCEL_OPTION)
== JOptionPane.OK_OPTION){
try {
rs.deleteRow(); //删除当前记录
recordCnt--;
if(recordCnt>0){ //如果剩余还有记录
if(curRow>=recordCnt) //如果删除的是最后一条记录
curRow=recordCnt;
//否则的话,curRow的值无需改变,因为后一条记录自动成为了当前记录
rs.absolute(curRow);
showData();
}else {
curRow = 0;
setTextEmpty();
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "删除数据出错");
}
}
}
//查找记录按钮事件响应代码
protected void doSearch(){
boolean b = true;;
String IC = JOptionPane.showInputDialog(jf, "请输入要查找学生的身份证号:");
if(curRow<=1){
firstBtn.setEnabled(false);
preBtn.setEnabled(false);
curRow = 1;
}
try {
if(rs.first()){ //移动游标到第一条记录
curRow = 1; //记录游标的新位置
//重新设置按钮状态
firstBtn.setEnabled(false);
preBtn.setEnabled(false);
nextBtn.setEnabled(true);
lastBtn.setEnabled(true);
}
while(b&&IC!=null){
if(rs.getString("IC").equals(IC)){
try {
jtf[0].setText(rs.getString("name"));
jtf[1].setText(rs.getString("stuID"));
jtf[2].setText(IC);
jtf[3].setText(rs.getString("sex"));
jtf[4].setText(rs.getString("native"));
jtf[5].setText(rs.getString("nation"));
jtf[6].setText(rs.getString("address"));
jtf[7].setText(rs.getString("schname"));
jtf[8].setText(rs.getString("schnum"));
jtf[9].setText(rs.getString("grade"));
jtf[10].setText(rs.getString("class"));
jtf[11].setText(rs.getString("tel"));
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "无法获取数据");
}
return;
}else{
if(curRow>=recordCnt){
curRow=recordCnt;
b = false;
JOptionPane.showMessageDialog(jf, "数据库中没找到该记录!");
}
else{
if(rs.next()){ //向后移动游标
curRow++;
if(curRow==recordCnt){
nextBtn.setEnabled(false);
lastBtn.setEnabled(false);
}
firstBtn.setEnabled(true);
preBtn.setEnabled(true);
}
}
}
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(jf, "移动游标出错");
}
}
//actionPerformed()方法
public void actionPerformed(ActionEvent e){
Object obj;
obj = e.getSource();
if(obj == firstBtn){
doMoveFirst();
}else if(obj == preBtn){
doMovePrevior();
}else if(obj == nextBtn){
doMoveNext();
}else if(obj==lastBtn){
doMoveLast();
}else if(obj==addBtn){
doAdd();
}else if(obj==saveBtn){
doSave(true);
}else if(obj==editBtn){
doEdit();
}else if(obj==cancelBtn){
doCancel();
}else if(obj==delBtn){
doDelete();
}else if(obj==searchBtn){
doSearch();
}
}
public static void main(String[] args){
new AddressList();
}
}

Java数据库编程技术的更多相关文章

  1. 菜鸡的Java笔记 java数据库编程(JDBC)

    java数据库编程(JDBC)        介绍 JDBC 的基本功能            content (内容)        现在几乎所有的项目开发过程之中都不可能离开数据库,所以在java ...

  2. java面向对象下:Java数据库编程

    19.Java数据库编程: JDBC概述:        JDBC(Java Database Connection)是java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类 ...

  3. java数据库编程——读写LOB、可滚动和可更新的结果集、元数据

    java 数据库编程 1. 读写LOB 除了数字.字符串和日期之外,许多数据库还可以存储大对象,例如图片或其它数据.在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB. 要读取LOB,需要 ...

  4. Java数据库编程、XML解析技术

    数据库编程 JDBC概述 是Java Database Connecive,即数据库连接技术的简称,它提供了连接各种常用数据库的能力. 是一种用于执行SQL语句的Java API,可以为多种关系数据库 ...

  5. JAVA数据库编程、JAVA XML解析技术

    JDBC概述 JDBC是JAVA中提供的数据库编程API curd :数据库增删改 链接字符串:String url = "mysql :/localhost :3306/jdbc/&quo ...

  6. java 数据库编程 学习笔记 不断更新

    最近开始学习java,感觉java的数据库编程需要发个随笔记录一下,话不多说 切入正题. 一.数据库访问技术的简介 应用程序  →  执行SQL语句 →数据库 → 检索数据结果 → 应用程序   ( ...

  7. 【Java】编程技术经典书籍列表

    这个列表包括了 100 多本经典技术书籍,涵盖:计算机系统与网络.系统架构.算法与数据结构.前端开发.后端开发.移动开发.数据库.测试.项目与团队.程序员职业修炼.求职面试 和 编程相关的经典书籍. ...

  8. Java Web编程技术学习要点及方向

    学习编程技术要点及方向亮点: 传统学习编程技术落后,应跟著潮流,要对业务聚焦处理.要Jar, 不要War:以小为主,以简为宝,集堆而成.去繁取简 Spring Boot,明日之春(future of ...

  9. Java 核心编程技术干货,2019 最新整理版!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 ...

随机推荐

  1. 设置Loadrunner负载机临时文件目录

    设置Loadrunner负载机临时文件目录 最近在跑稳定性测试 3 X 24小时的时候,发现负载机产生的日志还运行记录等等竟然有100多G! C盘空间不足,但是D盘还有700多G空间呢,怎么让临时文件 ...

  2. 000 Excel获取数据

    1.目标网址 http://data.10jqka.com.cn/funds/ggzjl/field/zjjlr 二:需求一 1.需求 爬单个页面的数据 2.变化网址 http://data.10jq ...

  3. 一个UICollectionView自定义layout的实现

      #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @ ...

  4. C++下的强制转换类型

    一.static_cast static_cast,静态类型转换.   下面,我举几个例子,大家就能清楚了. int main(int argc, char const *argv[]) { char ...

  5. JavaScript基础 :学习javascript的原因

    JavaScript是世界上最流行的脚本语言,因为你在电脑.手机.平板上浏览的所有的网页,以及无数基于HTML5的手机App,交互逻辑都是由JavaScript驱动的. 简单地说,JavaScript ...

  6. 通过TortoiseGit上传项目到GitHub

    1.安装msysgit和TortoiseGit : 2.TortoiseGit 设置: (1).确保安装成功: (2).设置用户名和邮箱: 3.登陆github并进入设置页面: 4.添加 SSH Ke ...

  7. IIS Server Farms入门

    概念了解 IIS Server Farms,实际上应该叫“Microsoft Web Farm Framework (WFF)”,依赖于“Web Platform Installer”才能安装,依赖于 ...

  8. 【spfa】【动态规划】zoj3847 Collect Chars

    转载自:http://blog.csdn.net/madaidao/article/details/42616743 Collect Chars Time Limit: 2 Seconds       ...

  9. [HDU6212]Zuma

    题目大意: 祖玛游戏. 给你一个01串,你可以往里面加一些0或1,如果连续的0或1超过3个,那么就可以消去.问消去所有的珠子至少要加几个珠子. 思路: 区间DP. 首先把原来的01串,改成存储连续的同 ...

  10. hdu 4547 LCA **

    题意:在Windows下我们可以通过cmd运行DOS的部分功能,其中CD是一条很有意思的命令,通过CD操作,我们可以改变当前目录. 这里我们简化一下问题,假设只有一个根目录,CD操作也只有两种方式: ...