JDBC java.sql.Statement
类有一个cancel()
方法.这可以在另一个线程中调用以取消当前运行的语句.
如何使用Spring实现这一目标?我无法找到在运行查询时获取对语句的引用的方法.我也找不到类似取消的方法.
这是一些示例代码.想象一下这需要10秒才能执行,有时根据用户的要求,我想取消它:
final int i = simpleJdbcTemplate.queryForInt("select max(gameid) from game");
Run Code Online (Sandbox Code Playgroud)
我如何修改这个,所以我有一个java.sql.Statement
对象的引用?
private void insertIntoMyTable (Myclass m) {
String query = "INSERT INTO MYTABLE (NAME) VALUES (?)";
jdbcTemplate.update(query, m.getName());
}
Run Code Online (Sandbox Code Playgroud)
当上面的查询插入记录时,ID
表中的列会自动增量.
有没有办法在插入时获得这个自动递增的ID.所以在这个例子中我的方法的返回值是int
给出以下示例POJO :(假设所有属性的Getters和Setter)
class User {
String user_name;
String display_name;
}
class Message {
String title;
String question;
User user;
}
Run Code Online (Sandbox Code Playgroud)
可以轻松查询数据库(在我的情况下是postgres)并使用BeanPropertyRowMapper填充Message类列表,其中db字段与POJO中的属性匹配:(假设DB表具有POJO属性的对应字段).
NamedParameterDatbase.query("SELECT * FROM message", new BeanPropertyRowMapper(Message.class));
Run Code Online (Sandbox Code Playgroud)
我想知道 - 是否有一种方便的方法来构造单个查询和/或创建行映射器,以便在消息中填充内部"用户"POJO的属性.
也就是说,查询中每个结果行的一些语法魔术:
SELECT * FROM message, user WHERE user_id = message_id
Run Code Online (Sandbox Code Playgroud)
生成一个Message列表,其中填充了关联的User
使用案例:
最终,这些类作为一个序列化对象从Spring Controller传回,这些类是嵌套的,因此生成的JSON/XML具有不错的结构.
目前,通过执行两个查询并在循环中手动设置每个消息的用户属性来解决此问题.可用,但我想一个更优雅的方式应该是可能的.
更新:使用解决方案 -
感谢@Will Keeling使用自定义行映射器获得答案的灵感 - 我的解决方案添加了bean属性映射,以自动化字段分配.
需要注意的是构造查询以使相关的表名具有前缀(但是没有标准约定来执行此操作,因此以编程方式构建查询):
SELECT title AS "message.title", question AS "message.question", user_name AS "user.user_name", display_name AS "user.display_name" FROM message, user WHERE user_id = message_id
Run Code Online (Sandbox Code Playgroud)
然后,自定义行映射器将创建多个bean映射,并根据列的前缀设置其属性:(使用元数据获取列名称).
public Object mapRow(ResultSet rs, int i) throws …
Run Code Online (Sandbox Code Playgroud) 有没有办法使用PostgreSQL json/hstore JdbcTemplate
?esp查询支持.
例如:
hstore:
INSERT INTO hstore_test (data) VALUES ('"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"')
SELECT data -> 'key4' FROM hstore_test
SELECT item_id, (each(data)).* FROM hstore_test WHERE item_id = 2
Run Code Online (Sandbox Code Playgroud)
为Json
insert into jtest (data) values ('{"k1": 1, "k2": "two"}');
select * from jtest where data ->> 'k2' = 'two';
Run Code Online (Sandbox Code Playgroud) 似乎找不到使用JdbcTemplate查询从表中获取一个字符串的方法.这是我的sql返回的表:
ID | STREET_NAME
------------------------
1 | Elm street
Run Code Online (Sandbox Code Playgroud)
现在我应该如何获得STREET_NAME的价值.SQL总是返回一行,因此无需担心返回多行.
对于某些背景信息: 同一查询中的INNER JOIN和COUNT
用Tony Stark回答我的表.
但是如何使用JdbcTemplate从中提取"Elm street"?
我正在尝试使用jdbcTemplate连接到Java中的数据库,我得到以下错误.我用谷歌搜索了很长时间,我找到的所有解决方案都没有解决我的问题.我尝试了几个不同的DB(SQLServer和MySQL),但都没有.
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/promotion-handler-admin] threw exception [Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!] with root cause
com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:202)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
...
Run Code Online (Sandbox Code Playgroud)
这是我的属性文件:
app.driverClassName=net.sourceforge.jtds.jdbc.Driver
app.url=jdbc:sqlserver://myUrl:port;databaseName=my_database
app.username=myUsername
app.password=myPassword
Run Code Online (Sandbox Code Playgroud)
web应用/ …
我正在使用JdbcTemplate
从数据库中检索Bean.这是我的方法:
public List<trackerv3Livedata> getTrackerData() {
return List<trackerv3Livedata> live = (List<trackerv3Livedata>) jdbcTemplate.queryForList("select * from mmitrackerv3_livedata where accountid =?",new Object[]{aid}, trackerv3Livedata.class);
}
Run Code Online (Sandbox Code Playgroud)
和trackerv3Livedata bean结构如下:
public class trackerv3Livedata implements Serializable {
private static final long serialVersionUID = 2409168269491619888L;
private int deviceid;
private Long timestamp;
private Mmitrackerv3Device mmitrackerv3Device;
private Mmitrackerv3Account mmitrackerv3Account;
private double latitude;
private double longitude;
private Double altitude;
private Double speedkph;
private Double heading;
private Double gpssignal;
private Integer geozoneid;
private Double distancekm;
private Double gsmsignal;
private Double mainpower;
private …
Run Code Online (Sandbox Code Playgroud) 我有一个方法'databaseChanges',它以迭代的方式调用2个操作:A,B.'A'第一,'B'最后."A"和"B"可以是Ç reate,û PDATE d elete功能在我的永久存储,Oracle数据库11g.
比方说,
'A'更新表Users中的记录,属性zip,其中id = 1.
'B'在表爱好中插入记录.
场景:已调用databaseChanges方法,'A'操作并更新记录.'B'运行并尝试插入记录,发生了某种情况,抛出了异常,异常是冒泡到databaseChanges方法.
预期: 'A'和'B'没有任何改变."A"所做的更新将会回滚.'B'没有改变任何东西,嗯......有一个例外.
实际: 'A'更新似乎没有回滚.'B'没有改变任何东西,嗯......有一个例外.
一些代码
如果我有连接,我会做类似的事情:
private void databaseChanges(Connection conn) {
try {
conn.setAutoCommit(false);
A(); //update.
B(); //insert
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception ei) {
//logs...
}
} finally {
conn.setAutoCommit(true);
}
}
Run Code Online (Sandbox Code Playgroud)
问题:我没有连接(请参阅带问题的标签)
我试过了:
@Service
public class SomeService implements ISomeService {
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
@Autowired
private NamedParameterJdbcTemplate npjt;
@Transactional
private void databaseChanges() throws Exception {
A(); …
Run Code Online (Sandbox Code Playgroud) 我有一个问题,使用spring框架的MapSqlParameterSource将null值传递给NamedParameterJdbcTemplate.谁知道怎么做?
目前我的代码是:
String sql = "update person set project = :project where id = :id;";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("project ", null);
params.addValue("id ", 1);
int count = newNamedParameterJDBCTemplate().update(sql, params);
Run Code Online (Sandbox Code Playgroud)
这是我得到NullPointerException的地方.
我有一个工作的RowMapper代码,它将数据库表行映射到java对象.我想用lambda表达式来改变实现.但是,我总是得到错误; 代码段如下;
String queryString = "select * from person where person_id = ? ";
RowMapper rowMapper = (rs, rowNum) -> {
Person p = new Person();
p.setName(rs.getString("personName"));
p.setAddress(rs.getString("address"));
p.setAge(rs.getInt("age"));
}
Person person = getJdbcTemplate().query(queryString, personId, rowMapper);
return person;
Run Code Online (Sandbox Code Playgroud)
有人可以帮我正确实现代码吗?有想法得到人名单吗?
jdbctemplate ×10
java ×9
spring ×6
jdbc ×2
postgresql ×2
hsqldb ×1
hstore ×1
jtds ×1
lambda ×1
mysql ×1
oracle ×1
spring-boot ×1
spring-mvc ×1
sql ×1