### JDBC保存对象并返回主键知识点详解 #### 一、背景介绍 在Java开发中,JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。通过JDBC,开发者可以在Java应用程序中连接各种数据库,并执行SQL语句来实现数据的操作。 本文将重点讲解如何使用JDBC保存一个Java对象到数据库,并获取插入后自动生成的主键值。 #### 二、关键概念 1. **PreparedStatement**:预编译的SQL语句,它可以提高执行效率,并有助于防止SQL注入攻击。 2. **KeyHolder**:用于保存数据库操作后生成的主键值的对象。 3. **JdbcTemplate**:Spring框架中的一个类,用于简化JDBC的使用,提供了一组方便的方法来处理数据库操作。 #### 三、代码解析 假设我们有一个`MessageText`对象,需要将其保存到数据库,并希望在保存后能够获取到自动生成的主键值。下面是具体的实现步骤: ```java public long saveMessageText(MessageText messageText) throws SQLException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date time = messageText.getTime(); final String time1 = sdf.format(time); final String sql = "insert into tb_message_text(id, content, time) values(null, ?, ?)"; final String mess = messageText.getContent().toString(); KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcHandler.getJdbcTemplate().update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection con) throws SQLException { PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); ps.setString(1, mess); ps.setString(2, time1); return ps; } }, keyHolder); int intValue = keyHolder.getKey().intValue(); System.out.println(intValue); return intValue; } ``` 1. **使用`SimpleDateFormat`格式化日期**:首先使用`SimpleDateFormat`将`Date`对象格式化为字符串,以便于存储到数据库中。 2. **定义SQL语句**:使用占位符`?`代替实际参数值,这使得SQL语句更加安全,避免了SQL注入的风险。 3. **创建`PreparedStatement`**:通过`PreparedStatement`设置SQL语句及其参数值。其中`Statement.RETURN_GENERATED_KEYS`表示执行完SQL语句后返回生成的主键值。 4. **使用`KeyHolder`保存主键**:`KeyHolder`用于保存执行SQL语句后生成的主键值。这里使用`GeneratedKeyHolder`,它是`KeyHolder`的一个实现类。 5. **执行SQL语句**:通过`JdbcTemplate`的`update`方法执行SQL语句。该方法接受两个参数:`PreparedStatementCreator`用于创建`PreparedStatement`,`KeyHolder`用于保存生成的主键。 6. **获取并返回主键值**:通过`KeyHolder`获取并返回自动生成的主键值。 #### 四、注意事项 1. **SQL语句的安全性**:使用`PreparedStatement`可以有效避免SQL注入的风险,确保应用的安全性。 2. **资源管理**:在实际项目中,通常会使用连接池管理数据库连接,以提高性能和资源利用率。 3. **异常处理**:示例代码中没有展示异常处理逻辑,在实际开发中应该添加适当的异常捕获和处理机制,确保程序的健壮性和可靠性。 通过上述方法,我们可以有效地使用JDBC保存Java对象到数据库,并获取自动生成的主键值。这对于实现持久层操作非常重要,尤其是在进行对象与数据库之间的映射时。
public long saveMessageText(MessageText messageText) throws SQLException {
// TODO Auto-generated method stub
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date time = messageText.getTime();
final String time1 = sdf.format(time);
final String sql="insert into tb_message_text (id,content,time) values(null,?,?)";
final String mess=messageText.getContent().toString();
KeyHolder keyHolder=new GeneratedKeyHolder();
jdbcHandler.getJdbcTemplate().update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con)
throws SQLException {
PreparedStatement ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
ps.setString(1, mess);
ps.setString(2,time1);
return ps;
}
}, keyHolder);
int intValue = keyHolder.getKey().intValue();
System.out.println(intValue);
return intValue;
}
//保存消息 对象
public long saveMessageText(Message message) {
// TODO Auto-generated method stub
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Django和OpenCV的智能车视频处理系统.zip
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip