我想知道当你用方法注释方法时实际发生了@Transactional什么?当然,我知道Spring会将该方法包装在Transaction中.
但是,我有以下疑问:
注意:由于此机制基于代理,因此只会拦截通过代理进入的"外部"方法调用.这意味着'自调用',即目标对象中调用目标对象的其他方法的方法,即使被调用的方法被标记,也不会在运行时导致实际的事务
@Transactional!
资料来源:http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html
为什么只有外部方法调用才会在Transaction下而不是自调用方法?
我正在浏览Spring支持的数据访问技术,我注意到它提到了多个选项,我不确定它们之间的区别:
据我所知,Spring JDBC提供了模板,用于减少用于通过简单的旧方式访问数据库的样板代码 - 您编写自己的SQL查询.
Spring-ORM提供了通过ORM技术访问数据库的简化模板,如Hibernate,My(i)Batis等.
Spring-DAO按照Spring的网站:
Spring中的数据访问对象(DAO)支持旨在使您能够以一致的方式轻松使用JDBC,Hibernate或JDO等数据访问技术
我对ORM与JDBC有一点关系,因为它们针对的是访问数据库的不同方式.但Spring-DAO简直令人困惑!
有谁能请澄清这三者之间究竟有什么不同?哪种情况应该首选?
此外,还有另一个项目Spring-DATA可用(http://projects.spring.io/spring-data/)现在,它是否是Spring支持的所有数据访问技术的父项目,或者它只是Spring的新名称-dao?
对于一个新项目,JPA始终是处理关系数据的推荐工具,还是有些情况下Spring JdbcTemplate是更好的选择?您的回复中需要考虑的一些因素:
使用现代(大约2012年)Spring JDBC模板调用存储过程的正确方法是什么?
说,我有一个存储过程声明了两个IN和OUT参数,如下所示:
mypkg.doSomething(
id OUT int,
name IN String,
date IN Date
)
Run Code Online (Sandbox Code Playgroud)
我遇到过CallableStatementCreator必须明确注册IN和OUT参数的基础方法.在JdbcTemplate课堂上考虑以下方法:
public Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters)
Run Code Online (Sandbox Code Playgroud)
当然,我知道我可以像这样使用它:
List<SqlParameter> declaredParameters = new ArrayList<SqlParameter>();
declaredParameters.add(new SqlOutParameter("id", Types.INTEGER));
declaredParameters.add(new SqlParameter("name", Types.VARCHAR));
declaredParameters.add(new SqlParameter("date", Types.DATE));
this.jdbcTemplate.call(new CallableStatementCreator() {
@Override
CallableStatement createCallableStatement(Connection con) throws SQLException {
CallableStatement stmnt = con.createCall("{mypkg.doSomething(?, ?, ?)}");
stmnt.registerOutParameter("id", Types.INTEGER);
stmnt.setString("name", "<name>");
stmnt.setDate("date", <date>);
return stmnt;
}
}, declaredParameters);
Run Code Online (Sandbox Code Playgroud)
declaredParameters当我在csc实施中注册时,目的是什么?换句话说,为什么我需要传递一个 …
我正在学习JdbcTemplate和NamedParameterJdbcTemplate的奇迹.我喜欢我所看到的,但有没有简单的方法来查看它最终执行的底层SQL?我希望看到这个用于调试目的(例如,在外部工具中调试生成的SQL).
我是Spring3.x的初学者,我正在学习Spring DAO的支持.我想知道NamedParameterJdbcTemplate和JdbcTemplate之间的区别.通过表现哪一个是最好的.什么时候去NamedParameterJdbcTemplate,什么时候去JdbcTemplate.你的答案对我这样的初学者有很大的帮助.
嗨,我正在尝试使用HikariCP与Spring连接池.我正在使用jdbcTempLate和JdbcdaoSupport.
这是我的数据源的spring配置文件:
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="dataSourceClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="dataSource.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="dataSource.user" value="username"/>
<property name="dataSource.password" value="password"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
但不幸的是,生成以下错误消息:
Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.zaxxer.hikari.HikariDataSource]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.zaxxer.hikari.HikariDataSource.<init>()
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何解决这个问题?
有人能指出一些关于可用于Java的不同Query DSL库之间性能比较的资源,如:Querydsl,jOOQ,JEQUEL,activejdbc,iciql等等......
背景:我使用Spring JDBC模板,但仍然需要以纯字符串格式编写查询.虽然我在编写直接查询时没有问题,但我担心直接依赖于DB表名.我不想使用任何ORM框架,如Hibernate或JPA/EclipseLink.我需要尽可能高的原始性能(IMO,它们适用于更多以CRUD为中心的应用程序).我可以为这些DSL提供一些轻微的开销,只要它有点(我相信,它主要是StringBuilder/String连接!)
我考虑过在某些xml中使用外部化的命名查询.但只是试图评估不同的Query DSL库提供的价值.
编辑:更多关于我的要求: 我想知道使用他们的API方法构建中等复杂查询时这些之间的性能比较.我需要的是使用任何这些查询DSL库生成查询字符串并将其传递给Spring JDBC模板.所以,我想知道如果添加这个中间步骤会导致相当大的性能损失,我想使用命名查询或构建我自己的库,它只使用StingBuilder或类似的方法
用jOOQ,iciql,QueryDSL更新我的经验:
虽然我错过了在我的原帖中提到这一点,但我也热衷于易用性和我在实体类中需要的开销(如果需要任何额外的注释或实现).
jOOQ:
Iciql:
QueryDSL:
(所有观察对我都知之甚少;如果其中任何一个不正确,请更正)
综上所述,我坚持编写命名查询:(但由于Lukas Eder的答案似乎解释了我原来的帖子关注(表现),我接受了他的.
我试图使用hsqldb-2.3.4从Spring应用程序连接.
我使用以下详细信息创建了数据库
Type : HSQL Database Engine Standalone
Driver: org.hsqldb.jdbcDriver
URL: jdbc:hsqldb:file:mydb
UserName: SA
Password: SA
Run Code Online (Sandbox Code Playgroud)
我在"MYDB"模式下创建了一个名为ALBUM的表
在spring配置文件中:
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dbcpDataSource" />
</bean>
<bean id="dbcpDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:file:mydb" />
<property name="username" value="SA" />
<property name="password" value="SA" />
</bean>
Run Code Online (Sandbox Code Playgroud)
在我的春季控制器中,我正在做 jdbcTemplate.query("SELECT * FROM MYDB.ALBUM", new AlbumRowMapper());
它给了我例外:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT * FROM MYDB.ALBUM]; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege …Run Code Online (Sandbox Code Playgroud) 我正在使用spring jdbctemplate并运行如下查询:
SELECT COLNAME FROM TABLEA GROUP BY COLNAME
没有传递任何命名参数,但是,列名称COLNAME将由用户传递.
问题
有没有办法让占位符,比如?列名?例如SELECT ? FROM TABLEA GROUP BY ?
如果我想简单地运行上面的查询并得到一个List<String>最好的方法?
目前我在做:
List <Map<String, Object>> data = getJdbcTemplate().queryForList(query);
for (Map m : data)
System.out.println(m.get("COLNAME"));
Run Code Online (Sandbox Code Playgroud) spring-jdbc ×10
java ×7
spring ×7
jdbctemplate ×5
jdbc ×4
hikaricp ×1
hsqldb ×1
jooq ×1
jpa ×1
performance ×1
querydsl ×1
spring-aop ×1
spring-data ×1
spring-orm ×1
sql ×1