使用 Spring JDBC 将数据插入外部表
Posted
技术标签:
【中文标题】使用 Spring JDBC 将数据插入外部表【英文标题】:Insert data into foreign table using Spring JDBC 【发布时间】:2013-01-05 01:01:14 【问题描述】:我的 mysql 数据库中有两个表:
CREATE TABLE table1 (
id int auto_increment,
name varchar(10),
CONSTRAINT pk_id primary key(id)
)
和
CREATE TABLE table2 (
id_fk int,
stuff varchar(30),
CONSTRAINT fk_id FOREIGN KEY(id_fk) REFERENCES table1(id)
)
我想在这两个表中插入一条记录。基本上,我有 id、name 和 stuff 作为数据。如何使用 Spring JDBC 将它们插入到两个表中?
我正在插入表格,如下所示:
SimpleJdbcInsert insert1 = new SimpleJdbcInsert(this.getDataSource())
.withTableName("table1")
.usingColumns("name");
Map<String, Object> parameters1 = new HashMap<String, Object>();
parameters1.put("name", myObj1.getStuff());
insert.execute(parameters1);
插入table2时,如何从table1获取id值?
SimpleJdbcInsert insert2 = new SimpleJdbcInsert(this.getDataSource())
.withTableName("table2")
.usingColumns("stuff");
Map<String, Object> parameters2 = new HashMap<String, Object>();
parameters2.put("stuff", myObj2.getStuff());
insert.execute(parameters2);
另外,我如何维护交易?
另外,如何获取给定名称的数据?
非常感谢任何帮助!
【问题讨论】:
【参考方案1】:请看这个简单的例子,Test 类中的所有方法都是事务性的,请阅读 Spring Framework 文档了解更多信息
@Transactional
public class Test
@Autowired
DataSource ds;
public void test1() throws Exception
Map<String, Object> params = new HashMap<String, Object>();
params.put("c1", "test");
SimpleJdbcInsert insert = new SimpleJdbcInsert(ds).withTableName("t1").usingColumns("c1")
.usingGeneratedKeyColumns("id");
long id = insert.executeAndReturnKey(params).longValue();
params = new HashMap<String, Object>();
params.put("stuff", "stuff");
params.put("id_fk", id);
SimpleJdbcInsert insert2 = new SimpleJdbcInsert(ds).withTableName(
"table2").usingColumns("stuff", "id_fk");
insert2.execute(params);
NamedParameterJdbcTemplate tmpl = new NamedParameterJdbcTemplate(ds);
params = new HashMap<String, Object>();
params.put("id", id);
String c1 = tmpl.queryForObject("select c1 from t1 where id = :id", params, String.class);
上下文
<context:annotation-config />
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test?user=root&password=root" />
</bean>
<bean class="Test" />
【讨论】:
感谢您的示例代码。我可以看到您正在插入表 t1,但是使用从表 t1 生成的 id 插入表 t2 呢? 谢谢...还有一个问题:我是否需要添加带有数据源作为属性的 transactionManager bean?谁将调用 transactionManager? 是的,您需要进行事务处理,因为您在 1 种方法中有 2 次插入。 tx:annotation-driven + @Transactional + transactionManager 让 Spring 明白 test1() 必须是 1 个事务以上是关于使用 Spring JDBC 将数据插入外部表的主要内容,如果未能解决你的问题,请参考以下文章
使用spring jdbc时将长(+20行sql)外部化的干净方法? [关闭]