Java数据库主键
在Java中,数据库主键是一个用于唯一标识表中每一行数据的字段或一组字段,主键的值在整个表中必须是唯一的,不能有重复,主键的作用是确保数据的完整性和一致性。
1、主键的类型
主键可以是以下几种类型:
整数类型(如INT、BIGINT)
字符串类型(如VARCHAR、CHAR)
组合类型(如UUID)
2、创建表时设置主键
在创建表时,可以使用PRIMARY KEY
关键字来设置主键,创建一个名为students
的表,其中id
字段为主键:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
class VARCHAR(50)
);
3、修改表结构设置主键
如果已经创建了表,可以使用ALTER TABLE
语句来修改表结构,添加主键,为students
表的name
字段添加主键:
ALTER TABLE students
ADD CONSTRAINT pk_students_name PRIMARY KEY (name);
4、Java代码操作主键
在Java中,可以使用JDBC(Java Database Connectivity)来操作数据库,以下是一些常用的操作主键的方法:
getGeneratedKeys()
:获取插入记录后生成的主键值。
setAutoCommit(false)
:关闭自动提交事务。
commit()
:提交事务。
rollback()
:回滚事务。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Main {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "password";
String sql = "INSERT INTO students (name, age, class) VALUES (?, ?, ?)";
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false); // 关闭自动提交事务
PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, "张三");
pstmt.setInt(2, 18);
pstmt.setString(3, "计算机一班");
int affectedRows = pstmt.executeUpdate(); // 执行插入操作,返回受影响的行数
if (affectedRows > 0) { // 如果插入成功,获取生成的主键值
ResultSet generatedKeys = pstmt.getGeneratedKeys();
while (generatedKeys.next()) {
System.out.println("生成的主键值为:" + generatedKeys.getLong(1));
}
} else {
System.out.println("插入失败");
}
conn.commit(); // 提交事务
pstmt.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback(); // 发生异常,回滚事务
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally { } // 确保资源释放,无论是否发生异常都会执行到这里来关闭资源,注意finally块的位置不能太靠前,否则会先执行finally块再抛出异常,因为如果在try块中发生了异常,那么catch块就不会被执行到,而finally块一定会被执行到,所以为了保证资源能够被正确释放,需要将finally块放在最后面。