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. 20172304 实验二 《Java面向对象程序设计》 实验报告

    20172304 实验二 <Java面向对象程序设计> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:段志轩 学生学号:20172304 实验时间 ...

  2. Cobbler图文详解安装及遇到的问题说明

    一.介绍 Cobbler是一个使用Python开发的开源项目,通过将部署系统所涉及的所有服务集中在一起,来提供一个全自动批量快速建立linux系统的网络环境, Cobbler提供了DHCP管理,YUM ...

  3. elasticsearch-.yml(中文配置详解)

    此elasticsearch-.yml配置文件,是在$ES_HOME/config/下 elasticsearch-.yml(中文配置详解) # ======================== El ...

  4. Ubuntu18.04 之jdk安装与环境配置

    1.oracle官网下载压缩包. 下载地址为: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  5. bzoj——2127: happiness

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2570  Solved: 1242[Submit][Status][D ...

  6. Centos 安装 Wireshark

    Wireshark是一款数据包识别软件,应用很广泛. yum install wireshark yum install wireshark-gnome

  7. AtCoder Grand Contest 019 F-yes or no

    AtCoder Grand Contest 019 F-yes or no 解题思路: 考虑一个贪心策略,假设当前还有 \(x\) 道 \(\text{yes}\) 和 \(y\) 道 \(\text ...

  8. java多线程技术之八(锁机制)

    Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...

  9. JDK源码学习笔记——Enum枚举使用及原理

    一.为什么使用枚举 什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数.一年四季等.或者是在我们编译前就知道其包含的所有值的集合. 利用 public final static 完全可 ...

  10. STL 优先队列详解

    优先队列是一个保证队列里元素单调的队列,我们可以利用它来维护一个线性结构的单调性. 一般的优先队列: 当然需要加头文件 #include <queue> priority_queue &l ...