最近看了看spring的东西,发现注解是个好东西。不过在应用到JDBC DAO的时候遇到点小麻烦。现在和大家分享一下。
我们知道我们使用spring的JDBC功能时候,无非是继承spring提供的三个JDBC DAO的父类。
JdbcDaoSupport,NamedParameterJdbcDaoSupport,SimpleJdbcDaoSupport。其中在3.0以后SimpleJdbcDaoSupport已经被标记为过期了。原因是3.0以后只支持JAVA5环境应用,所以SimpleJdbcDaoSupport的特性前两个DAO父类都已经提供了。
在原来上我们继承这个种DAO的父类目的主要是为了使用它们自己JDBC模板。
/* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.jdbc.core.namedparam; import org.springframework.jdbc.core.support.JdbcDaoSupport; /** * Extension of JdbcDaoSupport that exposes a NamedParameterJdbcTemplate as well. * * @author Thomas Risberg * @author Juergen Hoeller * @since 2.0 * @see NamedParameterJdbcTemplate */ public class NamedParameterJdbcDaoSupport extends JdbcDaoSupport { private NamedParameterJdbcTemplate namedParameterJdbcTemplate; /** * Create a NamedParameterJdbcTemplate based on the configured JdbcTemplate. */ @Override protected void initTemplateConfig() { this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(getJdbcTemplate()); } /** * Return a NamedParameterJdbcTemplate wrapping the configured JdbcTemplate. */ public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() { return namedParameterJdbcTemplate; } }
上面是用NamedParameterJdbcDaoSupport类的源代码,我们发现其中有一个叫做NamedParameterJdbcTemplate的成员变量和一个getNamedParameterJdbcTemplatef方法。
我们在平时开发的时候就继承这个类,在自己的方法中调用getNamedParameterJdbcTemplate()方法获取模板。再利用模板的回调进行数据库操作,这就是Spring引以自豪的模板模式。有兴趣的可以查看模板模式这个比较牛X的设计模式,对大家的程序设计提高很有好处的。但是这种模式有一个比较大的问题,我估计伟大的ROD先生设计Spring这部分的时候没有想到后来JAVA世界中出现了注解这个东东,因为在spring早期版本的的时候还完全都是XML的配置时代。从源代码看这个类的设计是2003年的时候。在XML配置时代我们除了要继承spring的JDBC父类以外还有做一件事情很重要,就是在XML中配置Data source属性的注入。
<bean class="com.tjsinfo.springauto.dao.SubUserDAO"> <property name="dataSource" ref="dataSource"</property> </bean>
就想现在这样,可是现在是注解的天下了。大家都已少配置多注解多约定为时尚(不过我个人感觉过度的使用注解和约定对于软件管理的要求很重要)。我们怎么才能使datasouce注解的方式注入到自己的DAO内呢?
小弟我一开始想了很多办法都不行,比如自己定义一个datasouce成员变量,在变量上增加注解。后来我看看源代码突然领悟到。问题的关键不在于datasouce,其实我们只要可以获得JdbcTemplate就可以了。
我的实现如下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <context:component-scan base-package="com.tjsinfo.springauto"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/springmvc" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg ref="dataSource" /> </bean> </beans>
在XML文件中配置一个NamedParameterJdbcTemplate,我用的是NamedParameterJdbcTemplate用别的模板的可以换成自己的熟悉的模板,对这个模板的注入DataSource。
自己的DAO中这样注解
package com.tjsinfo.springauto.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import com.tjsinfo.springauto.vo.User; @Repository("userDAO") public class SuperUserDAO implements IUserDAO { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; private static final String ADDUSERSQL = "INSERT INTO `t_system_user` (`id`,`loginname`,`password`,`systemname`,`state`,`sort`) VALUES (:id,:loginname,:password,:systemname,:state,:sort);"; public Boolean addUser(User user) { // TODO Auto-generated method stub BeanPropertySqlParameterSource beanPropertySqlParameterSource = new BeanPropertySqlParameterSource(user); namedParameterJdbcTemplate.update(ADDUSERSQL, beanPropertySqlParameterSource); return true; } }
直接使用一个模板的成员变量,在上面注解而且连原来的spring的父类也不用继承了。也算是解耦了。
这是小弟的自己的解决办法,不知道会不会有什么问题,不过我自己JUnit测试操作都是可以的。
欢迎大家拍砖,spring博大精深献丑了。
相关推荐
`@ConfigurationProperties`注解允许我们将YAML或properties配置文件中的属性绑定到`DataSource`的配置上,`prefix = "spring.datasource"`指定了配置前缀。 Spring Boot的自动配置机制(Auto Configuration)会在...
Spring MVC、Spring和Spring JDBC是Java开发中非常重要的三大框架,它们构成了Spring框架的核心部分,广泛应用于企业级应用开发。本实例源码旨在提供一个整合这三者的基础模板,帮助开发者理解和掌握它们之间的协同...
这使得我们可以在测试中注入所需的Bean,例如DataSource、JdbcTemplate或NamedParameterJdbcTemplate,这些都是SpringJDBC的核心组件。 下面是如何设置一个基本的测试场景: 1. 引入必要的依赖:在项目中添加JUnit...
在这个初始化工程中,已经包含了对DataSource的支持,这意味着我们可以方便地配置数据库连接,并通过Spring的DAO支持进行数据访问。 在Spring项目中,通常会有一个`applicationContext.xml`或类似的配置文件,用于...
在本篇Spring学习笔记中,我们将探讨如何使用Spring框架的注解方式来管理事务,这是一种在现代Java应用中广泛采用的方法。Spring框架以其强大的依赖注入和面向切面编程能力,为事务管理提供了简洁且高效的解决方案。...
在Spring框架中,JDBC的使用可以通过DataSource和JdbcTemplate等类进行简化,减少了手动处理连接、事务和异常的繁琐工作。 将Struts2、Spring和JDBC集成,首先需要在项目中引入相关的jar包。这些jar包通常包括...
例如,如果一个类有一个名为`dataSource`的属性,我们可以在该属性上使用`@Resource`注解,Spring会自动寻找名字为`dataSource`的bean并将其注入。`@Resource`注解可以用于字段、setter方法或者构造器参数,支持JSR-...
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://...
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> ``` 其中,`dataSource`是你的数据源引用。 2...
在Spring JDBC中,我们需要创建一个名为`DataSource`的配置,用于连接数据库,如`applicationContext.xml`或`beans.xml`: ```xml <bean id="dataSource" class="org.springframework.jdbc.datasource....
Spring的DAO支持是其核心模块之一,用于简化数据访问层(DAO)的开发,通过将固定的数据访问逻辑和业务逻辑分离,提高了代码的可维护性和复用性。Spring的DAO设计模式主要体现在模板(Template)和回调(Callback)...
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 数据库连接属性 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> ...
12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. ...
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> <!-- 启用基于注解的事务管理 --> <!-- ...
3. **@Transactional注解**:在Java代码中,我们可以在Service层或者DAO层的方法上使用`@Transactional`注解,指定事务的属性,如传播行为、隔离级别、超时时间等。例如: ```java @Service public class ...
示例中的`sample1-jdbc`可能包含一个简单的DAO(Data Access Object)类,使用`JdbcTemplate`执行SQL查询。例如,创建一个用户的方法如下: ```java @Autowired private JdbcTemplate jdbcTemplate; public ...
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> ``` 5. **使用注解控制事务**:在需要进行事务...
<bean id="sqlSessionFactory" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> ``` - 最后,配置MyBatis的...
本文将深入探讨Spring中如何配置事务管理,包括JDBC事务的使用。 首先,Spring支持两种事务管理方式:声明式事务管理和编程式事务管理。声明式事务管理通过在XML配置文件或注解中定义事务边界,使事务管理与业务...
6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...