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.批处理可以一次性提交多条数据到数据库中。
- Java数据库编程---JDBC2.0操作
- java数据库编程---jdbc2.0操作
- MySQL数据库JDBC2.0操作
- java-jdbc2
- 22---数库编程11(JDBC2.0)
- JDBC2.0實現數據分頁
- JDBC2.0扩展API
- jdbc2.0新特性
- JDBC2.0實現數據分頁
- JDBC2.0批处理数据
- JDBC2
- jdbc2
- jdbc2
- jdbc2
- jdbc2
- JDBC2
- JDBC2
- jdbc2
- java学习笔记<二>隐藏和封装
- 单片机毕业设计
- CUGB图论专场2:B - Asteroids 二分图:最小顶点覆盖=最大匹配数
- Web服务
- Android 开发之使用Eclipse Debug调试详解
- Java数据库编程---JDBC2.0操作
- Linux Socket编程(不限Linux)
- 个税计算器支持相关请回复本帖
- 指针和引用当参数传递的一个奇怪现象——目前没在书上找到原因
- Your PHP installation appears to be missing the MySQL extension which is required by WordPress.
- js中toFixed() 的用法
- 黑马程序员--多线程
- android开发中无线连接真机直接进行调试
- hdu——1059——Dividing(多重背包)