下面是详解Java MyBatis 插入数据库返回主键的攻略。
一、前置条件
在讲解插入数据库返回主键之前,需要先了解以下几个前置条件:
- 数据库主键必须是自增长的,例如MySQL的AUTO_INCREMENT。
- 数据库引擎必须支持返回主键,例如MySQL的InnoDB引擎支持。
二、具体实现
1.使用MyBatis的insert方法返回主键
MyBatis提供了insert方法来实现插入数据,并且支持返回主键,其代码如下:
<insert id="insertUser" parameterType="User">
INSERT INTO user(username, password) VALUES(#{username}, #{password})
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
在这个例子中,我们首先使用了MyBatis的insert
标签来实现插入用户数据的操作。接下来使用了selectKey
标签,将SELECT LAST_INSERT_ID()语句作为其内容,用来查询刚刚插入的记录的主键,并将其赋值给属性为id
的User
对象。其中,keyProperty
表示返回的主键对应的属性名,resultType
表示主键的类型,order
表示在insert语句执行之后查询主键。
在实际代码中,需要在Mapper接口的方法中添加相应的实现,例如:
public interface UserMapper {
int insertUser(User user);
}
2.使用JDBC的PreparedStatement实现
除了使用MyBatis的方式外,还可以使用JDBC的PreparedStatement
实现插入数据并返回主键。具体实现代码如下:
public int insertUser(User user) {
int result = 0;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "INSERT INTO user(username, password) VALUES(?, ?)";
conn = dataSource.getConnection();
ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.executeUpdate();
rs = ps.getGeneratedKeys();
if (rs.next()) {
int id = rs.getInt(1);
user.setId(id);
result = id;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
在这个示例中,我们首先定义了一个Connection
对象和PreparedStatement
对象,通过使用JDBC连接池获取连接对象,然后使用prepareStatement
方法创建SQL语句的预编译对象,并通过设置参数实现传递参数的操作。接下来是执行executeUpdate
语句,执行SQL语句并返回受影响的行数。
然后,我们使用getGeneratedKeys
方法获取插入数据后的主键结果集。如果结果集存在,我们就可以通过getInt(1)
方法获取主键的值,并将其赋值为用户对象的属性值。最后,关闭连接、声明语句和结果集对象,返回插入数据后的主键。
三、示例
下面提供两个示例,一个使用MyBatis,另一个使用JDBC的PreparedStatement。
示例1:使用MyBatis
public void testInsertUser() {
User user = new User();
user.setUsername("test");
user.setPassword("123456");
userMapper.insertUser(user);
System.out.println("插入成功,主键为:" + user.getId());
}
示例2:使用JDBC的PreparedStatement
public void testInsertUser() {
User user = new User();
user.setUsername("test");
user.setPassword("123456");
int id = userMapper.insertUser(user);
System.out.println("插入成功,主键为:" + id);
}
四、总结
在本文中,我们讲解了如何使用MyBatis和JDBC的PreparedStatement实现插入数据并返回主键的操作。尤其重要的是,在使用MyBatis时,数据库必须支持返回主键,而且主键必须是自增长的,否则将无法正常返回主键。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java MyBatis 插入数据库返回主键 - Python技术站