Java数据库编程---JDBC2.0操作

来源:互联网 发布:网店管家云端版mac 编辑:程序博客网 时间:2024/05/18 02:11

JDBC2.0操作

    之前所讲解的大部分操作都是属于最基本的JDBC操作,在JDBC2.0之后,为了方便操作者进行数据库的开发提供了许多更加方便的操作,包括,可滚动的结果集,以及使用结果集直接更新数据库,如果要使用这样的特性则就必须依靠ResultSet


在JDBC2.0中有一个最重要的概念就是批处理,可以直接一次性完成多个语句的执行。


可滚动的结果集

如果要想创建可滚动的结果集,则在创建PreparedStatement(Statement)的时候必须指定了创建的类型。

PreparedStatement prepareStatement(String sql,

                                   int resultSetType,

                                   int resultSetConcurrency)

                                   throws SQLException

使用滚动集方式进行数据的读取操作。

首先查看数据库skewrain的表user中的内容如下:


【JDBC20ReadDemo.java的内容如下:】

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

public class JDBC20ReadDemo{

    //定义MySQL的数据库驱动程序

    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    //定义MySQL数据库的连接地址

    public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

        Connection conn = null;    //数据库连接

        PreparedStatement pstmt = null;

        ResultSet rs = null;

        String sql = "SELECT id,name,password,age,sex,birthday FROM user";

        Class.forName(DBDRIVER);  //加载驱动程序

        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

        pstmt = conn.prepareStatement(sql,

        ResultSet.TYPE_SCROLL_SENSITIVE,

        ResultSet.CONCUR_READ_ONLY); //创建PreparedStatement对象

        rs = pstmt.executeQuery();  //执行查询

        System.out.println("第2条数据:");

        rs.absolute(1);   //定位到第二条数据

        print(rs,1);

        System.out.println("第1条数据:");

        rs.beforeFirst();

        print(rs,1);

        System.out.println("第4条数据:");

        rs.afterLast();   //最后一条数据之后

        print(rs,-1);

        rs.close();

        pstmt.close();

        conn.close();         //数据库关闭

    }

    public static void print(ResultSet rs,int re) throws Exception{

    if(re>0){

        rs.next();  //由前向后

    }else{

        rs.previous();  //由后向前

    }

    int id = rs.getInt(1);

    String name = rs.getString(2);

    String pass = rs.getString(3);

    int age = rs.getInt(4);

    String sex = rs.getString(5);

    java.util.Date d = rs.getDate(6);

    System.out.print("编号: " + id + ";");

    System.out.print("姓名: " + name + ";");

    System.out.print("密码: " + pass + ";");

    System.out.print("年龄: " + age + ";");

    System.out.print("性别: " + sex + ";");

    System.out.println("生日: " + d + ";");

    System.out.println("-----------------------------");

}

}

编译运行的结果如下:


可见数据已经被正确读取出来。


如果程序真的采用此种方式开发的话,则内存的损耗会非常的大。所以一般情况下,开发中是不会使用这种可滚动的结果集的。


使用结果集插入数据

如果要想使用ResultSet插入数据,则在创建数据库操作的时候就必须选择好允许更新。


插入数据的方法:moveToInsertRow();

插入数据的代码如下:【JDBC20InsertDemo.java】

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

public class JDBC20InsertDemo{

    //定义MySQL的数据库驱动程序

    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    //定义MySQL数据库的连接地址

    public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

    Connection conn = null;    //数据库连接

    PreparedStatement pstmt = null;

    ResultSet rs = null;

    String sql = "SELECT id,name,password,age,sex,birthday FROM user";

    Class.forName(DBDRIVER);  //加载驱动程序

    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

    pstmt = conn.prepareStatement(sql,

    ResultSet.TYPE_SCROLL_SENSITIVE,

    ResultSet.CONCUR_UPDATABLE); //表示结果集可以更新

    rs = pstmt.executeQuery();  //执行查询

    rs.moveToInsertRow();     //移动到插入的一行

    rs.updateString("name","菊花"); //设置姓名

    rs.updateString("password","www.microsoft.com"); //设置密码

    rs.updateInt("age",33);     //设置年龄

    rs.updateString("sex","女");   //设置性别

    rs.updateDate("birthday",new java.sql.Date(new java.util.Date().getTime()));

    rs.insertRow();   //真正提交数据

    rs.close();

    pstmt.close();

    conn.close();         //数据库关闭

}

};

编译运行的结果如下:


查看数据库中的内容如下:


可见数据已经插入成功。

 

使用结果集更新数据。

如果要想使用结果集更新数据的话,则首先应该按ID查询。

结果集更新数据的代码如下:【JDBC20UpdateDemo.java】

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

public class JDBC20UpdateDemo{

    //定义MySQL的数据库驱动程序

    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    //定义MySQL数据库的连接地址

    public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

    Connection conn = null;    //数据库连接

    PreparedStatement pstmt = null;

    ResultSet rs = null;

    String sql = "SELECT id,name,password,age,sex,birthday FROM user WHERE id = ?";

    Class.forName(DBDRIVER);  //加载驱动程序

    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

    pstmt = conn.prepareStatement(sql,

    ResultSet.TYPE_SCROLL_SENSITIVE,

    ResultSet.CONCUR_UPDATABLE); //表示结果集可以更新

    pstmt.setInt(1,20);  //第一个参数为参数的下标,第二个参数为要更新的ID。

    rs = pstmt.executeQuery();  //执行查询

    rs.last();                 //到最后一行

    rs.updateString("name","太阳"); //设置姓名

    rs.updateString("password","www.alibaba.com"); //设置密码

    rs.updateInt("age",18);     //设置年龄

    rs.updateString("sex","女");   //设置性别

    rs.updateDate("birthday",new java.sql.Date(new java.util.Date().getTime()));

    rs.updateRow();   //真正提交数据

    rs.close();

    pstmt.close();

    conn.close();   

}

};

编译运行的结果如下:


查看数据库中的内容如下:


可见数据更新操作已经执行成功。

如果在更新之前使用了取消更新的话,则是不会执行更新操作的。

Void cancelRowUpdates():如果在updateRow()之前调用了以上的方法,则会取消更新。


使用结果集删除数据

基本的操作流程还是一样的,直接移动到要删除的位置,使用deleteRow()删除即可。

使用结果集删除数据的代码如下:【JDBC20DeleteDemo.java】

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

public class JDBC20DeleteDemo{

    //定义MySQL的数据库驱动程序

    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    //定义MySQL数据库的连接地址

    public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

    Connection conn = null;    //数据库连接

    PreparedStatement pstmt = null;

    ResultSet rs = null;

    String sql = "SELECT id,name,password,age,sex,birthday FROM user WHERE id = ?";

    Class.forName(DBDRIVER);  //加载驱动程序

    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

    pstmt = conn.prepareStatement(sql,

    ResultSet.TYPE_SCROLL_SENSITIVE,

    ResultSet.CONCUR_UPDATABLE); //表示结果集可以更新

    pstmt.setInt(1,18);  //第一个参数为参数的下标,第二个参数为要更新的ID。

    rs = pstmt.executeQuery();  //执行查询

    rs.last();                 //到最后一行

    rs.deleteRow();   //删除操作

    rs.close();

    pstmt.close();

    conn.close();   

}

};

编译运行的结果如下:


执行删除前,数据库中的内容如下:


执行删除后,数据库中的内容如下:


可见数据已经被成功删除。


但是,以上的这些操作在正常情况下一般是不会使用的。不如直接使用PreparedStatement完成方便。

 

批处理

批处理操作就是指一次性向数据库中执行多条语句。一次提交。

加入语句:addBatch();

执行语句:executeBatch();

所有的SQL语句,一次性提交过去。

批处理操作的代码如下:【JDBC20BatchDemo.java】

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

public class JDBC20BatchDemo{

    //定义MySQL的数据库驱动程序

    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    //定义MySQL数据库的连接地址

    public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

    Connection conn = null;    //数据库连接

    PreparedStatement pstmt = null;

    String sql = "INSERT INTO user(name,password,age,sex,birthday) VALUES (?,?,?,?,?)";

    Class.forName(DBDRIVER);  //加载驱动程序

    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

    pstmt = conn.prepareStatement(sql);

    for(int i=0;i<10;i++){

        pstmt.setString(1,"斜雨 - " + i);

        pstmt.setString(2,"skewrain - " + i);

        pstmt.setInt(3,18 + i);

        pstmt.setString(4,"男");

        pstmt.setDate(5,new java.sql.Date(new java.util.Date().getTime()));

        pstmt.addBatch();   //加入批处理,等待执行。

    }

    int temp[] = pstmt.executeBatch();

    System.out.println("更新了" + temp.length + "条数据。");

    pstmt.close();

    conn.close();   

}

};

编译运行的结果如下:


查看数据库的内容如下:


可见,批处理操作成功。

以上只是以PreparedStatement为例,对于操作本身来说,也可以使用Statement完成。只是插入语句的时候需要使用:void addBatch(String sql)。


小结:

1.了解JDBC2.0中结果集的功能提升:可滚动、可插入、可修改、可删除。

2.如果要想创建灵活的结果集,则在创建数据库操作的时候就必须指定类型。

3.批处理可以一次性提交多条数据到数据库中。

0 0
原创粉丝点击