SQL数据库与JDBC技术
来源:互联网 发布:孟坤软件联系 编辑:程序博客网 时间:2024/05/17 07:33
数据库与JDBC技术
2007-06-13
JDBC技术工作原理:
JDBC是JAVA数据库连接(Java DataBase Connectivity)技术的简称,是为各种常用数据库提供无缝连接的技术。它由一些Java语言编写的类和界面组成。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯 Java语言编写完整的数据库应用程序。JDBC是一种低级的API
JDBC的两个程序包:
Java.sql(核心API)
Javax.sql (扩展API)
JDBC和ODBC及其他API的比较
1.) ODBC不适合在Java中直接使用,因为它是一个C语言实现的API,从Java程序调用本地的C程序会在安全性、完整性、健壮性方面都有许多缺点。
2.)不能完全精确地实现从ODBC,C,API到Java API的翻译。
3.)ODBC很难学,它把简单和高级功能混杂在一起,甚至对非常简单的查询,其选项也非常复杂。而JDBC恰好相反,其尽量保证简单功能的简便性,而同时在必要时允许使用高级功能。
4.)启用纯Java需要象JDBC这样的Java API.
JDBC中常用的类和接口:
Class类:
java.sql DriverManager: 类.驱动管理
java.sql Connection:接口获得连接
java.sql Statement接口(PreparedStatement):得到语句对象
java.sql RelultSet接口(结果集).表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
通过JDBC访问数据库步骤:
1.加载驱动程序:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”)
2.获得连接: Connection con=DriverManger.getConnection(“jdbc:odbc:qq“,” 用户名”, “密码”)
3.得到语句对象://作用向数据库发送语句对象
Statement stmt=con.createStatement();
4. 得到结果: RelustSet rs=stmt. ExecuteQuery (“ select * from student ”)//执行查询
ResultSet 对象的常用方法
返回类型
方法名称
boolean
next()
byte
getByte(int columnIndex)
Date
getDate(int columnIndex)
double
getDouble(int columnIndex)
float
getFloat(int columnIndex)
int
getInt(int columnIndex)
long
getLong(int columnIndex)
String
getString(int columnIndex)
byte
getByte(String columnName)
Date
getDate(String columnName)
double
getDouble(String columnName)
float
getFloat(String columnName)
int
getInt(String columnName)
long
getLong(String columnName)
String
getString(String columnName)
例:
创建数据库文件:
--create database text
--use text
create table student--
(
id int primary key,
name char (20),
pass char(20)
)
insert student(id,name,pass) values(1,'aa','789')
insert student(id,name,pass) values(2,'bb','456')
insert student(id,name,pass) values(3,'cc','123')
select * from student
//加载驱动:
import java.sql.*;
class mysql
{
public static void main(String args[])
{
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载桥连驱动
con=DriverManager.getConnection("jdbc:odbc:qq","sa","");// /url,建立数据库的连接
stmt=con.createStatement();//得到语句对象
rs=stmt.executeQuery("select * from student");//获得结果
while(rs.next())//显示结果
{
int id=rs.getInt(1);
String name=rs.getString(2);
String pwd=rs.getString(3);
System.out.println (id+" "+name+" "+pwd);
}
}
catch (Exception e)
{
System.out.println (e.getMessage());//返回此 throwable 的详细消息字符串。
}
finally//这样不管try模块中是否发生异常,都能保证对象的关闭
{
try{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}catch (Exception e)
{
e.getStackTrace();
}
}
}
}//结果如下
配置数据源
点。点石。。。
1111111111111111111111111111
import java.sql.*;
class mysql
{
public static void main(String args[])
{
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载桥连驱动
con=DriverManager.getConnection("jdbc:odbc:qq","sa","");// /url,建立数据库的连接
//qq为数据源名称
stmt=con.createStatement();//得到语句对象
// int flag=stmt.executeUpdate("delete student where id in(7)");//获得结果
//int flag=stmt.executeUpdate("INSERT student values(2,'cc','987')");//获得结果
int flag1=stmt.executeUpdate("insert student(id,name,pass) values(1,'rff','7839')");
int flag2=stmt.executeUpdate("insert student(id,name,pass) values(2,'bff','4536')");
int flag3=stmt.executeUpdate("insert student(id,name,pass) values(3,'cff','1233')");
//int flag4=stmt.executeUpdate("insert student(name,pass) values('dd','678')");
// System.out.println (flag1);
// System.out.println (flag2);
// System.out.println (flag3);
// System.out.println (flag4);
}
catch (Exception e)
{
System.out.println (e.getMessage());//返回此 throwable 的详细消息字符串。
}
finally//这样不管try模块中是否发生异常,都能保证对象的关闭
{
try{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}catch (Exception e)
{
e.getStackTrace();
}
}
}
}
---------------
例:向数据库中更新数据 stmt.executeUpdate("insert student(name,pass) values('dd','678')");
--create database text
--use text
create table student--
(
id int primary key,
name char (20),
pass char(20)
)
select * from student
insert student (id,name,pass) values(4,'aa','456')
import java.sql.*;
class mysql
{
public static void main(String args[])
{
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
try
{
//直连
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=text","sa","");// /url,建立数据库的连接
stmt=con.createStatement();//得到语句对象
//int flag=stmt.executeUpdate("insert into student where id=4");//获得结果
//int flag=stmt.executeUpdate("INSERT student values(2,'cc','987')");//获得结果
//int flag1=stmt.executeUpdate("insert into student(id,name,pass) values(6,'bb','111')");
//int flag2=stmt.executeUpdate("insert student(id,name,pass) values(2,'bff','4536')");
//int flag3=stmt.executeUpdate("insert student(id,name,pass) values(3,'cff','1233')");
//int flag4=stmt.executeUpdate("insert student(name,pass) values('dd','678')");
//System.out.println (flag1);
// System.out.println (flag2);
// System.out.println (flag3);
// System.out.println (flag4);
}
catch (Exception e)
{
System.out.println (e.getMessage());//返回此 throwable 的详细消息字符串。
}
finally//这样不管try模块中是否发生异常,都能保证对象的关闭
{
try{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}catch (Exception e)
{
e.getStackTrace();
}
}
}
}
例:实现在窗口中添加数据并由数据库接收数据
先在数据库中建立表格:
create database MyDataSource
use MydataSource
create table Registration
(
cFirst_name char(8),
cLast_name char(8),
cAddress varchar(30),
cAccount_type varchar(30),
cPhone_no char(10),
mAnnual_income money
)
select * from Registration
insert into Registration(cFirst_name,cLast_name,cAddress,cAccount_type,
cPhone_no,mAnnual_income)values(?,?,?,?,?,?)
Java代码:
import javax.swing.*;
import java.awt.*;
import java.sql.*;
import java.awt.event.*;
class Registration implements ActionListener
{
static JFrame frame;
static JPanel panel;
JLabel labelFName;
JLabel labelLName;
JLabel labelAddress;
JLabel labelAccType;
JLabel labelPhone;
JLabel labelAnnualIncome;
JTextField textFName;
JTextField textLName;
JTextField textAddress;
JComboBox comboAccType;
JTextField textPhone;
JTextField textAnnualIncome;
JButton buttonAccept;
String[]AccType={"Current","Savings","Credit"};
public static void main(String args[])
{
new Registration();
}
public Registration()
{
panel =new JPanel();
frame=new JFrame("Customer Registration");
frame.setSize(300,300);
frame.setVisible(true);
frame.getContentPane().add(panel);
labelFName=new JLabel("First Name");
labelLName=new JLabel("Last Name");
labelAddress=new JLabel("Address");
labelAccType=new JLabel("Accont Type");
labelPhone=new JLabel("Phone Number");
labelAnnualIncome=new JLabel("Annual Income");
textFName=new JTextField(15);
textLName=new JTextField(15);
textAddress=new JTextField(30);
comboAccType=new JComboBox(AccType);
textPhone=new JTextField(10);
textAnnualIncome=new JTextField(10);
panel.add(labelFName);
panel.add(textFName);
panel.add(labelLName);
panel.add(textLName);
panel.add(labelAddress);
panel.add(textAddress);
panel.add(labelAccType);
panel.add(comboAccType);
panel.add(labelPhone);
panel.add(textPhone);
panel.add(labelAnnualIncome);
panel.add(textAnnualIncome);
buttonAccept=new JButton("SUBMIT");//提交按键
panel.add(buttonAccept);
buttonAccept.addActionListener(this); //注册监听
}
public void actionPerformed(ActionEvent e)//监听方法
{
Object source=e.getSource();
if(source ==buttonAccept)
{
try
{
//桥连
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con;
con=DriverManager.getConnection("jdbc:odbc:yy","sa","");
//表示预编译的 SQL 语句的对象可以使用此对象高效地多次执行该语句
PreparedStatement stat2=con.prepareStatement("insert into Registration(cFirst_name,cLast_name,cAddress,cAccount_type,cPhone_no,mAnnual_income)values(?,?,?,?,?,?)");
stat2.setString(1,textFName.getText());
stat2.setString(2,textLName.getText());
stat2.setString(3,textAddress.getText());
stat2.setString(4,(String)comboAccType.getSelectedItem());
stat2.setString(5,textPhone.getText());
stat2.setFloat(6,Float.parseFloat(textAnnualIncome.getText()));
stat2.executeUpdate();//执行向数据库更新数据,该语句必须是一个 SQL INSERT
、UPDATE
或 DELETE
语句##
JOptionPane.showMessageDialog(frame,new String("已经提交"));
}
catch(Exception exception)
{
JOptionPane.showMessageDialog(frame,new String("Error encountered while entering date in the datebase:")+exception); // JOptionPane要求用户提供值或向其发出通知的标准对话框
}
}
}
}
我的JDBC-ODBC桥接方法:先创建数据源,上面有详细图片##
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con;
con=DriverManager.getConnection("jdbc:odbc:数据源","sa","");
结果集元数据
接口ResultSetMetaData:可根据结果集ResultSet对象得到相应列的类型和属性信息的对象。
例:ResultSetMetaData ##
import java.sql.*;
public class Test{
public static void main(String[] args)
{
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
try
{ //桥连
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:qq","sa","");
stmt = con.createStatement();//语句对象
rs = stmt.executeQuery("SELECT * FROM student");
while(rs.next())
{
int id = rs.getInt(1);
String name= rs.getString(2);
String pwd = rs.getString(3);
System.out.println(id+" "+name+" "+pwd);
}
//以下用于获取关于 ResultSet
对象中列的类型和属性信息的对象##
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns =rsmd.getColumnCount();////获得列数
System.out.println (numberOfColumns);//输出列数
for(int i=1;i<=numberOfColumns;i++)
{
String columnName=rsmd.getColumnName(i);//获得ID列名##
System.out.print("列名:"+columnName);
String columnType=rsmd.getColumnTypeName(i);//获得列类型##
System.out.println(" 列类型:"+columnType);
}
}//end try
catch(Exception e)
{
System.out.println(e.getMessage());
}
finally
{
try
{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}
catch(Exception e)
{
e.getStackTrace();
}
}
}
}
JDBC2.0的新特性
新特性:
1. ResultSet 对象中的光标能自由上下移动。
2. 能直接使用JAVA程序语言更新数据库表格的内容,而不需写SQL法。
3. 也可进行数据库的批处理操作。
如何设置可滚动的结果ResustSet?
实际有三个参数 但性能一个比一个差,因为它要将数据取出到内存后再移动指针来读取,所以不建议使用,除非你要操作的数据较少,可以采用;如果数据较大,决对不要使用。
例:
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
//得到语句对象
// 声明结果集可上下移动
stmt =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY) ;
例:在结果集中 使用游标倒序输出所有记录:
SQL语句如下:
--create database text
--use text
create table person--
(
id int primary key,
name char (20),
password char(20),
age int
)
insert student(id,name,pass) values(1,'aa','789')
insert student(id,name,pass) values(2,'bb','456')
insert student(id,name,pass) values(3,'cc','123')
insert student(id,name,pass) values(4,'tw','759')
insert student(id,name,pass) values(5,'rb','456')
insert student(id,name,pass) values(6,'cr','123')
select * from student
//java代码:
import java.sql.*;
class mysql
{
public static void main(String args[])
{
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载桥连驱动##
con=DriverManager.getConnection("jdbc:odbc:qq","sa","");// url,建立数据库的连接##
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);//得到语句对象
rs=stmt.executeQuery("select * from student");//获得查询的结果集##
//rs.absolute(5);//指针的决对位置##
rs.afterLast(); //最后一条记录##
while( rs.previous())//##数据库上一条记录注意不要在此加分号,否则后果。。我都疯了,查了
3个小时rs.next()为下一条##
{
int id=rs.getInt(1);
String name=rs.getString(2);
String pass=rs.getString(3);
System.out.println(id+""+name+""+pass);
}
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
finally
{
try
{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}
catch(Exception e)
{
e.getStackTrace();
}
}
}
}
批处理Batch
批处理Batch:DBC2.0提供批处理的操作,可以让一个Statement同时执行多个SQL语句,以提高性能。
事务处理:要么全部执行,要么全部失败。有效的保证数据的完事性。
流程: 先取消自动提交(conn.setAutoCommit(false))è执行批处理è有无异常,有则回滚,无则提交。
例:批处理解析:此题要注意的是,当你故意写错一个SQL语句时,如少个引号,你会发现所有的数据都没有插入进行了回滚。
SQL语句如下:
--create database text
--use text
create table person--
(
id int primary key,
name char (20),
password char(20),
age int
)
insert student(id,name,pass) values(1,'aa','789')
insert student(id,name,pass) values(2,'bb','456')
insert student(id,name,pass) values(3,'cc','123')
insert student(id,name,pass) values(4,'tw','759')
insert student(id,name,pass) values(5,'rb','456')
insert student(id,name,pass) values(6,'cr','123')
select * from student
import java.sql.*;
class mysql
{
public static void main(String args[])
{
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
try
{
// Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//con=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=text","sa","");// /url,建立数据库的连接
//加载桥连驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//url,建立数据库的连接
con=DriverManager.getConnection("jdbc:odbc:qq","sa","");
//先取消自动提交##
con.setAutoCommit(false);
stmt=con.createStatement();
//书写批处理SQL语句;
stmt.addBatch("insert into student (id,name,pass) values(11, 'ddr','123ff')");
stmt.addBatch("insert into student (id,name,pass) values(12,'dred','15665')");
stmt.addBatch("insert into student (id,name,pass) values(13,'ddr','44443')");
stmt.addBatch("insert into student (id,name,pass) values(14,'dred','15665')");
stmt.executeBatch();//执行批处理语句
// 如果没有异常,则执行此段代码
con.commit(); // 提交事务,真正向数据库中插入数据
System.out.println("成功写入数据" );
}
catch (Exception e)
{
//将数据回流
try{
System.out.println ("操作失败");
con.rollback();
}
catch(Exception e1)
{
System.out.println (e1.getMessage());
}
}
finally//这样不管try模块中是否发生异常,都能保证对象的关闭
{
try{
//if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}catch (Exception e)
{
System.out.println ("关闭失败");
e.getStackTrace();
}
}
}
}
当有错误时:运行结果如下 注意下面的关闭失败,是因为我们没有用到结果集rs.close();
当没有发生错误时:数据库中有了新增的数据。
- SQL数据库与JDBC技术
- MySql数据库基本语法与JDBC技术
- Mysql数据库与sql语言(四)---jdbc
- JDBC数据库编程技术之增删改查SQL写法
- JDBC数据库开发技术
- 数据库及JDBC技术
- JDBC数据库访问技术
- JDBC技术连接数据库
- JDBC数据库访问技术
- jdbc连接sql数据库
- JDBC链接Sql数据库
- JDBC连接数据库SQL Server 2005与2000的区别
- JDBC连接数据库SQL Server 2005与2000的区别
- 数据库访问技术之JDBC
- java操作数据库-jdbc技术
- sql与jdbc
- 数据库与JDBC基础
- JDBC 简介 ,SQL 注入 ,JDBC操作数据库
- C/C++面试题二
- Hibernate annotation
- 二零零七年五一节自驾游记(九)--------0501若尔盖花湖I
- 用Lucene建立索引及查询示例
- C/C++面试题三
- SQL数据库与JDBC技术
- 让大家参透庄家的意图
- [软件人生]问问题和讨论问题的差别
- 提问的艺术
- 麦咖啡 McAfee V8.5i +patch 1 + AntiSpyware Enterprise 集成优化版
- asp注入
- QQGame多开器
- 网站联盟-大才有大的智慧
- 跨线程调用控件之MethodInvoker