常常在使用Hibernate、iBatis时候,当插入一条数据的时候,实体Bean的原空主键就 赋上新值了,但是用原生sql怎么解决呢,或者说框架实现这个的原理呢
参见测试类,执行以下就知道了。
----------------------------------------------------------
package cn.hl.demo.test;
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 JdbcTest {
public static void main(String[] args) {
// 执行插入获取自增主键
insertWithParperedSQL();
insertWithStaticSQL();
}
// 驱动程序就是之前在classpath中配置的JDBC的驱动程序的JAR 包中
public static final String DBDRIVER = "com.mysql.jdbc.Driver";
// 连接地址是由各个数据库生产商单独提供的,所以需要单独记住
public static final String DBURL = "jdbc:mysql://localhost:3306/test";
// 连接数据库的用户名
public static final String DBUSER = "root";
// 连接数据库的密码
public static final String DBPASS = "root";
// 预定义SQL模式,获取新增记录的主键
public static void insertWithParperedSQL() {
Connection conn = null;
try {
// 获取连接
conn = getConnection();
// 定义执行sql语句
String sql = "insert into test_user(name,age) values(?,?)";
//
PreparedStatement ps = conn.prepareStatement(sql,
Statement.NO_GENERATED_KEYS);
ps.setString(1, "laozhang");
ps.setInt(2, 19);
ps.executeUpdate();
// 检索由于执行此 Statement 对象而创建的所有自动生成的键
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
Long id = rs.getLong(1);
System.out.println("-----预定义SQL模式-----id = " + id);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection(conn);
}
}
// 静态SQL模式,获取新增记录的主键
public static void insertWithStaticSQL() {
Connection conn = null;
try {
// 获取连接
conn = getConnection();
// 定义执行sql语句
String sql = "insert into test_user(name,age) values('zahnsan',22)";
//
PreparedStatement ps = conn.prepareStatement(sql,
Statement.NO_GENERATED_KEYS);
ps.executeUpdate();
// 检索由于执行此 Statement 对象而创建的所有自动生成的键
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
Long id = rs.getLong(1);
System.out.println("-----预定义SQL模式-----id = " + id);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection(conn);
}
}
// 获取Connection
public static Connection getConnection() {
// 表示数据库的连接对象
Connection conn = null;
try {
// 1、使用CLASS 类加载驱动程序
Class.forName(DBDRIVER);
// 2、连接数据库
conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
}
// 3、关闭数据库
// con.close();
return conn;
}
// 关闭Connection
public static void closeConnection(Connection conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}