JDBC中,动态获取主键的方法及注意事项


前言

我最近在学习JDBC的过程中,在java语句中获取主键方法,做了以下总结,以及一点小小的经验

一、方法1

Statement接口有一个方法:int executeUpdate(String sql, int autoGeneratedKeys) 使用方法:通过连接对象Connection调用 String sql - String类型的需要预编译的的SQL语句; autoGeneratedKeys - 指示自动生成的键是否可用于获取的标志。 autoGeneratedKeys 是Statement中的常量 【Statement.RETURN_GENERATED_KEYS,表示返回生成的主键】使用 【Statement.NO_GENERATED_KEYS,表示不返回生成的主键】 执行完execute语句之后,在使用Statement的getGenerateKeys()获取结果集。

二、方法2

ResultSet getGeneratedKeys() ; 通过动态语句对象PreparedStatement调用 然后通过 while(resultSet.next()){ // 注意:这里只能通过getLong(int 下标)获取,因为只有查询才有字段名。 resultSet.getLong(int 下标);获取//下标从1开始, } 通过 //这里resultSet.next()将指针移动到当前位置的下一行 //while(resultSet.next()){} 的作用:指针移动到最后一行之后返回false,可以用作循环结束的条件。在两种情况下:遍历到最后一行之后;或者当 ResultSet 中没有元素、行数为0时,返回false退出循环。

二、注意事项

1.使用地点大多数在DAO层,在获取动态语句对象PreparedStatement的时候,如果需要获取插入数据时的自动生成的主键,则可以使用重载方法获取。
通过连接对象Connection调用PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
2.在PreparedStatement对象执行excuteUpdate()方法后添加
3.最重要的是,一定要先确认主键的属性是否为***自增长型***或者是否可以自动获得主键,注意,是自动
4.在测试获取主键方法时,测试类中,一定要完善domain类的构造方法,如果,构造方法不匹配,会报错
5.使用sql中的DML语句时,value类型必须和表的字段属性一致

//准备一个String类型的sql语句 【注意:调用一次方法,只能执行一个SQL语句】
		String addSql = "INSERT INTO user (name, pwd) VALUES (?,?);";//DQL,用?代替参数
		
		/*
		 * 通过conn获取语句对象
		 * 1. 【方法1】PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) 通过连接对象Connection调用
				sql:需要预编译的的SQL语句
	 			autoGeneratedKeys:	Statement中的常量:【Statement.RETURN_GENERATED_KEYS,表示返回生成的主键】使用
	 												   【Statement.NO_GENERATED_KEYS,表示不返回生成的主键】
	 			在PreparedStatement对象执行excuteUpdate()方法后
		 */
		prst = conn.prepareStatement(addSql,Statement.RETURN_GENERATED_KEYS);// 开启获取主键
		
		/*
		 *给PreparedStatement对象中?参数赋值:
 				prst.setInt(int index,int value);//index:表示第几个?【位置从1开始】;	value:表示要赋的值
 				prst.setDate(int index,Date value);//index:表示第几个?【位置从1开始】;	value:表示要赋的值
 				prst.setString(int index,String value);//index:表示第几个?【位置从1开始】;	value:表示要赋的值
 				prst.setObject(int index,Object value);//index:表示第几个?【位置从1开始】;	value:表示要赋的值
		 */
		prst.setString(1, u.getName());// 给第1个?赋值为u.getName()
		prst.setString(2, u.getPwd());// 给第2个?赋值为 u.getPwd()
		
		/*
		 * 通过语句对象,调用方法执行SQL语句:
				1. boolean execute()  一般执行DDL语句(创建表等)
				2. ResultSet executeQuery() 执行给定的DQL(查询)语句
				3. int executeUpdate()  一般执行DML(增删改)操作 
		 */
		int update = prst.executeUpdate();// 注意:绝对不能传入一个SQL语句了
		
		/*
		 * 获取主键
		 * 2. 【方法2】ResultSet getGeneratedKeys() 
				通过动态语句对象PreparedStatement调用
				然后通过
					while(resultSet.next()){
						// 注意:这里只能通过getLong(int 下标)获取,因为只有查询才有字段名。
						resultSet.getLong(int 下标);获取
					}	
		 */
		ResultSet keys = prst.getGeneratedKeys();
		while(keys.next()){
			// 注意:这里只能通过getLong(int 下标)获取,因为只有查询才有字段名。
			long key = keys.getLong(1);
			//在这里打印一下看看就可以,在项目组中,可以返回
			System.out.println(key);
		}
		
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当 `resultSet = statement.executeQuery(query);` 方法报空指针错误时,可能是由于 `statement` 或 `query` 对象为空所致。以下是一些可能的修正方法: 1. 确保 `statement` 对象已正确初始化。在使用 `executeQuery()` 方法之前,你需要创建一个 `Statement` 对象。例如,可以使用 `Connection` 对象的 `createStatement()` 方法创建一个 `Statement` 对象: ```java Statement statement = connection.createStatement(); ``` 确保在执行 `executeQuery()` 方法之前,`statement` 对象已被正确初始化。 2. 确保 `query` 对象不为空。在调用 `executeQuery()` 方法时,确保 `query` 变量不为 `null`。你可以在调用 `executeQuery()` 之前添加一条检查语句,例如: ```java if (query != null) { resultSet = statement.executeQuery(query); } else { // 处理 query 为 null 的情况 } ``` 通过检查 `query` 对象是否为 `null`,可以避免空指针异常。 3. 检查数据库连接。确保数据库连接已成功建立,并且 `statement` 对象是基于有效的数据库连接创建的。你可以在调用 `executeQuery()` 方法之前添加一条检查语句,例如: ```java if (connection != null && !connection.isClosed()) { resultSet = statement.executeQuery(query); } else { // 处理数据库连接异常的情况 } ``` 通过检查数据库连接的状态,可以避免空指针异常。 请根据你的具体情况检查并修正代码可能导致空指针异常的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值