前言
我最近在学习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);
}