其他几个API_获得新增的数据主键_批处理_可滚动的结果集_可更新的结果集(不常用)


获得新增的数据主键_批处理


可滚动的结果集_可更新的结果集(不常用)



获得新增的数据主键_批处理--------------------------------------------------------------------------------------


 获得新增的数据主键

使用PreparedStatement.getGeneratedKeys()方法获得主键;
步骤:
1、声明,执行PreparedStatement 时,需要返回主键;
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

2、执行语句
ps.executeUpdate();

3、使用PreparedStatement.getGeneratedKeys()方法获得主键的结果集ResultSet,

    (返回ResultSet类型,以适应联合主键);

ResultSet rs=ps.getGeneratedKeys()


4、获得主键

      rs.getInt(1);


PreparedStatement.getGeneratedKeys();
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
ResultSet rs = st.getGeneratedKeys();
rs.getInt(1);


批处理,可以大幅度提升大量增、删、改的速度。

1、使用addBatch()方法,打包PreparedStatement中的语句

PreparedStatement.addBatch();


2、使用executeBatch()方法,执行PreparedStatement打包的语句
返回int[]数据。
PreparedStatement.executeBatch

ps.addBatch();
ps.executeBatch();

OtherApi.java (执行需要模版中的JdbcUtils.java)
package com.dwt1220;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class OtherApi {
	
	public static void main(String[] args) throws Exception {
		int id=getCreateKey();
		System.out.println("id="+id);
		
		System.out.println("----------------------------------------------------------");
		createBatch();
	}
	
	
	static int getCreateKey() throws SQLException {
	/*****************获得最新添加的记录的主键*******************************/
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
			// 2.建立连接
			conn = JdbcUtils.getConnection();

			// 3.创建语句
			String sql="insert into user(name,birthday,money)values('name1','1987-10-01',400)";
			
		/******************可不填写Statement.RETURN_GENERATED_KEYS,但不一定所有数据库驱动都支持**********************************************/
			ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
			
			// 4.执行语句
			ps.executeUpdate();
			
		/**使用preparedStatement.getGeneratedKeys()方法获得主键
		 * 返回值为ResultSet类型,(可能存在联合主键)
		 * *********************************/
			rs=ps.getGeneratedKeys();
			int id=0;
			if(rs.next()){
				id=rs.getInt(1);
			}
			
			return id;			
		} finally {
			JdbcUtils.free(rs, ps, conn);
		}
	}
	
	static int createBatch() throws SQLException {
			Connection conn = null;
			PreparedStatement ps = null;
			ResultSet rs = null;

			try {
				conn = JdbcUtils.getConnection();
				String sql="insert into user(name,birthday,money)values(?,?,?)";
				ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
				
				for(int i=0;i<1000;i++){
					ps.setString(1,"batch name"+i);
					ps.setDate(2,new Date(System.currentTimeMillis()));
					ps.setFloat(3, 100f+i);
					
				/********将preparedStatement中的语句打包*********************************************/
					ps.addBatch();
				}
				
				/**使用executeBatch方法,执行preparedStatement打包语句
				 * 每执行一条,返回一个执行结果。
				 * *********************************************/
				int[] is=ps.executeBatch();
				
			/**使用preparedStatement.getGeneratedKeys()方法获得主键
			 * 返回值为ResultSet类型,(可能存在联合主键)
			 * *********************************/
				rs=ps.getGeneratedKeys();
				int id=0;
				if(rs.next()){
					id=rs.getInt(1);
				}
				
				return id;			
			} finally {
				JdbcUtils.free(rs, ps, conn);
			}
		}
	
}



可滚动的结果集_可更新的结果集 ----------------------------------------------------------------------------

可滚动的结果集

1、声明对resultSet(结果集)的要求
Statement st =connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

2、执行
ResultSet rs = st.executeQuery(sql);

rs.beforeFirst();  定位到最前一行的前一行
rs.afterLast(); 定位到最一行的一行
rs.first(); 定位到最一行
rs.isFirst(); 是否最前一行
rs.last(); 定位到最后一行
rs.isLast(); 是否是最后一行
rs.absolute(9); 定位到第9行
rs.moveToInsertRow(); 移动到插入的一行



可更新的结果集 (有些数据库驱动不支持)
1、声明对resultSet(结果集)的要求
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

2、设置更新内容
rs.updateString("col name", "new value");

3、执行更新
rs.updateRow();

OtherApi.java (执行需要模版中的JdbcUtils.java)
package com.dwt1220;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class OtherApi {

	public static void main(String[] args) throws Exception {		
		ScrollTest();
//		concurUpdateTable();
	}

	static void ScrollTest() throws SQLException {
		/************可以制作分页,但效率很低,一般只用于,不支持分页功能的数据库***************************/
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			conn = JdbcUtils.getConnection();

			/*************声明对resultSet(结果集)的要求
			 * 可滚动的结果集(ResultSet.TYPE_SCROLL_SENSITIVE)
			 * 可更新的结果集(ResultSet.CONCUR_UPDATABLE)有些驱动不支持
			 * **************************************/
			st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			String sql = "select id,name,birthday,money from user ";
			rs = st.executeQuery(sql);

			while (rs.next()) {
				System.out.println(rs.getObject("id") + "\t"
						+ rs.getObject("name") + "\t" 
						+ rs.getObject("birthday") + "\t"
						+ rs.getObject("money"));
			}
			System.out.println("-----------------------");
			
			/******可滚动的结果集
			 *rs.absolute(5);	定位到第5行的前一行
			 *rs.last();		定位到最后一行
			 *rs.afterLast();	定位到最后一行的后一行
			 *rs.first();		定位到最前一行
			 *rs.beforeFirst();	定位到最前一行的前一行
			 *rs.isFirst();	判断是否是第一行
			 *......
			 * **********************/

			rs.absolute(5);//定位到第5行的前一行
			int i=0;
			/*******rs.previous()移动到前一行***********/
			while(rs.previous()&& i<10){
				i++;
				System.out.println(rs.getObject("id") + "\t"
						+ rs.getObject("name") + "\t"
						+ rs.getObject("birthday") + "\t"
						+ rs.getObject("money"));
			}
		} finally {
			JdbcUtils.free(rs, st, conn);
		}
	}

	
	static void concurUpdateTable() throws SQLException {
		/************可更新的结果集***************************/
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			conn = JdbcUtils.getConnection();

			/*************声明对resultSet(结果集)的要求
			 * 可滚动的结果集(ResultSet.TYPE_SCROLL_SENSITIVE)
			 * 可更新的结果集(ResultSet.CONCUR_UPDATABLE)有些驱动不支持
			 * **************************************/
			st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			String sql = "select id,name,birthday,money from user where id<5";
			rs = st.executeQuery(sql);

			while (rs.next()) {
				String name=rs.getString("name");
				
//				if("lisi".equals(rs.getObject("name"))){ 有些数据库驱动调用2次。rs.getXXX()会出错
				
				if("lisi".equals(name)){
		/*************对结果集中,name=list的用户进行更新*********************************************/
					rs.updateFloat("money", 400);//设置更新内容
					rs.updateRow();//执行更新
				}
				
				System.out.println(rs.getObject("id") + "\t"
						
//						+ rs.getObject("name") + "\t" 有些数据库驱动调用2次。rs.getXXX()会出错
						
						+ name + "\t"
						+ rs.getObject("birthday") + "\t"
						+ rs.getObject("money"));
			}
			System.out.println("-----------------------");
			
		} finally {
			JdbcUtils.free(rs, st, conn);
		}
	}
	
	
	static void scrollSensitive() throws SQLException, InterruptedException {
		/************可更新的结果集***************************/
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			conn = JdbcUtils.getConnection();

			/*************声明对resultSet(结果集)的要求
			 * 可滚动的结果集
			 *	* ResultSet.TYPE_SCROLL_SENSITIVE 对更新敏感
			 *	* ResultSet.TYPE_SCROLL_INSENSITIVE 对更新不敏感
			 * 可更新的结果集(ResultSet.CONCUR_UPDATABLE)有些驱动不支持
			 * **************************************/
			st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			String sql = "select id,name,birthday,money from user where id<5";
			rs = st.executeQuery(sql);

			while (rs.next()) {
				int id=rs.getInt("id");
				System.out.println("show id:"+id+"...");
				Thread.sleep(1000);
				/**在线程睡眠时间中,修改数据库中的数据
				 * ResultSet.TYPE_SCROLL_SENSITIVE 会感知到
				 * ResultSet.TYPE_SCROLL_INSENSITIVE 不会感知到 (有些驱动不支持)
				 * *****************************/
				System.out.println(id + "\t"
						+ rs.getObject("name") + "\t" 
						+ rs.getObject("birthday") + "\t"
						+ rs.getObject("money"));
			}
			
		} finally {
			JdbcUtils.free(rs, st, conn);
		}
	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dwt1220

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值