jdbc、Mybatis插入数据主键回显的实现方法

时间:2021-07-10 08:46:38

插入数据的时候,往往需要获取主键值。但是有时候主键是自增长的那么,就不太适用手动添加主键值了,此时需要一种可以回显主键参数的方法,

下面以jdbc、mybatis的实现举例

此时使用的是jdbc的话或许能简单?too young too simple !

 package hellxz;

 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 Jdbc {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rsKey = null;
try {
Class.forName("com.mysql.jdbc.Driver");
//使用&是为了避免框架中可能遇到的bug,养成好习惯
String url = "jdbc:mysql://localhost/article?characterEncoding=utf8&useSSL=false";
//获取连接
conn = DriverManager.getConnection(url,"root","root");
// 更改自动提交为false,保证事务完整性:要么全完成,要么全失败
conn.setAutoCommit(false);
String sql = "insert into article vaules(null,?)"; // 主键id自增可以插null
pstmt.setString(2, "name");
pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
rsKey = pstmt.getGeneratedKeys(); // 获取插入的主键值结果集
rsKey.next();
int rootId = rsKey.getInt(1); //拿到主键值
//打印看看
System.out.println(rootId);
pstmt.executeUpdate();
conn.commit();
} catch (Exception e) {
//捕获异常回滚数据
try {
conn.rollback();
} catch (SQLException e2) {
e2.printStackTrace();
}
e.printStackTrace();
} finally {
try {
//开启自动提交
conn.setAutoCommit(true);
//关闭连接
if (rsKey != null) {
rsKey.close();
rsKey = null;
}
if(pstmt != null){
pstmt.close();
pstmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e3) {
e3.printStackTrace();
}
}
}
}

那我们接下来看看mybatis,mybatis的配置文件这里就不多说了,我们需要改的只有一个地方:xxxMapper.xml (其中xxx代表你用到的mapper),但有两种修改方法

具体实现如下:

方法一: 使用useGeneratedKeys

 <insert id="insert" parameterType="com.taotao.pojo.TbContentCategory" useGeneratedKeys="true" keyProperty="id">
insert into tb_content_category (id, parent_id, name,
status, sort_order, is_parent,
created, updated)
values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR},
#{status,jdbcType=INTEGER}, #{sortOrder,jdbcType=INTEGER}, #{isParent,jdbcType=BIT},
#{created,jdbcType=TIMESTAMP}, #{updated,jdbcType=TIMESTAMP})
</insert>

方法二:在mapper.xml中加入一条同事务的查询语句:select last_insert_id;

 <insert id="insert" parameterType="com.taotao.pojo.TbContentCategory" >
<!-- keyProperty:主键pojo的名字,returnType:使用的是mybatis对java.lang.Long类型的别称
order:对应的是这条语句是在插入前查询还是之后 -->
<selectkey keyProperty="id" returnType="long" order="AFTER">
SELECT LAST_INSERT_ID
</selectKey>
insert into tb_content_category (id, parent_id, name,
status, sort_order, is_parent,
created, updated)
values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR},
#{status,jdbcType=INTEGER}, #{sortOrder,jdbcType=INTEGER}, #{isParent,jdbcType=BIT},
#{created,jdbcType=TIMESTAMP}, #{updated,jdbcType=TIMESTAMP})
</insert>

这样我们在程序里就可以插入完成后就直接取主键id就可以了

参考转载请写明出处:http://www.cnblogs.com/hellxz/p/mybatis_studynote.html