标签: spring-jdbc

春天 - @Transactional - 后台会发生什么?

我想知道当你用方法注释方法时实际发生了@Transactional什么?当然,我知道Spring会将该方法包装在Transaction中.

但是,我有以下疑问:

  1. 我听说Spring创建了一个代理类?有人可以更深入地解释这一点.实际存在于该代理类中的是什么?实际班级会发生什么?我怎样才能看到Spring创建的代理类
  2. 我还在Spring文档中读到:

注意:由于此机制基于代理,因此只会拦截通过代理进入的"外部"方法调用.这意味着'自调用',即目标对象中调用目标对象的其他方法的方法,即使被调用的方法被标记,也不会在运行时导致实际的事务@Transactional!

资料来源:http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

为什么只有外部方法调用才会在Transaction下而不是自调用方法?

java spring transactional spring-jdbc spring-aop

313
推荐指数
6
解决办法
15万
查看次数

Spring DAO vs Spring ORM vs Spring JDBC

我正在浏览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?

spring spring-jdbc spring-orm spring-data

96
推荐指数
1
解决办法
7万
查看次数

JPA vs Spring JdbcTemplate

对于一个新项目,JPA始终是处理关系数据的推荐工具,还是有些情况下Spring JdbcTemplate是更好的选择?您的回复中需要考虑的一些因素:

  • 新数据库模式与预先存在的模式和表
  • 开发人员专业水平
  • 易于与数据缓存层集成
  • 性能
  • 还需要考虑其他相关因素吗?

java spring jpa spring-jdbc jdbctemplate

72
推荐指数
5
解决办法
6万
查看次数

用于调用存储过程的Spring JDBC模板

使用现代(大约2012年)Spring JDBC模板调用存储过程的正确方法是什么?

说,我有一个存储过程声明了两个INOUT参数,如下所示:

mypkg.doSomething(
    id OUT int,
    name IN String,
    date IN Date
)
Run Code Online (Sandbox Code Playgroud)

我遇到过CallableStatementCreator必须明确注册INOUT参数的基础方法.在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实施中注册时,目的是什么?换句话说,为什么我需要传递一个 …

java spring spring-jdbc jdbctemplate

70
推荐指数
3
解决办法
20万
查看次数

在Spring JdbcTemplate中查看底层SQL?

我正在学习JdbcTemplate和NamedParameterJdbcTemplate的奇迹.我喜欢我所看到的,但有没有简单的方法来查看它最终执行的底层SQL?我希望看到这个用于调试目的(例如,在外部工具中调试生成的SQL).

sql jdbc spring-jdbc

55
推荐指数
4
解决办法
8万
查看次数

NamedParameterJdbcTemplate与JdbcTemplate

我是Spring3.x的初学者,我正在学习Spring DAO的支持.我想知道NamedParameterJdbcTemplate和JdbcTemplate之间的区别.通过表现哪一个是最好的.什么时候去NamedParameterJdbcTemplate,什么时候去JdbcTemplate.你的答案对我这样的初学者有很大的帮助.

java spring jdbc spring-jdbc jdbctemplate

36
推荐指数
2
解决办法
4万
查看次数

如何使用Spring为HikariCP设置数据源?

嗨,我正在尝试使用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)

谁能告诉我如何解决这个问题?

spring jdbc spring-jdbc jdbctemplate hikaricp

36
推荐指数
4
解决办法
10万
查看次数

比较Querydsl,jOOQ,JEQUEL,activejdbc,iciql和其他查询DSL

有人能指出一些关于可用于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:

  • 需要将实体属性更改为特定于库的方式
  • 可以返回SQL查询字符串

Iciql:

  • 实体可以映射到没有或很少的变化(可以使用总共3种方式映射)
  • 但由此限制只选择查询(更新/删除/ ...再次要求实体更改)

QueryDSL:

  • 使用表绑定实体的多种方法(支持使用JPA注释的库特定方式除外).但我们至少需要修改实体
  • 没有简单/直接的方式来获取查询字符串

(所有观察对我都知之甚少;如果其中任何一个不正确,请更正)

综上所述,我坚持编写命名查询:(但由于Lukas Eder的答案似乎解释了我原来的帖子关注(表现),我接受了他的.

java performance spring-jdbc querydsl jooq

31
推荐指数
2
解决办法
2万
查看次数

HSQL数据库用户缺少权限或对象未找到错误

我试图使用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)

java spring hsqldb spring-jdbc

28
推荐指数
3
解决办法
6万
查看次数

如何在jdbctemplate中查询列表<String>

我正在使用spring jdbctemplate并运行如下查询:

SELECT COLNAME FROM TABLEA GROUP BY COLNAME

没有传递任何命名参数,但是,列名称COLNAME将由用户传递.

问题

  1. 有没有办法让占位符,比如?列名?例如SELECT ? FROM TABLEA GROUP BY ?

  2. 如果我想简单地运行上面的查询并得到一个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)

java jdbc spring-jdbc jdbctemplate

25
推荐指数
3
解决办法
8万
查看次数