[Java] 纯文本查看 复制代码
快速入门:
准备:
建表+实体类
导包:
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar
spring-web-4.2.4.RELEASE.jar
spring-test-4.2.4.RELEASE.jar
//日志相关jar
commons-logging-1.2.jar
log4j-1.2.16.jar
//AOP相关jar包
com.springsource.org.aopalliance-1.0.0.jar
spring-aop-4.2.4.RELEASE.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
//DB相关jar包
spring-tx-4.2.4.RELEASE.jar
spring-jdbc-4.2.4.RELEASE.jar
//数据库驱动jar包
mysql-connector-java-5.1.7-bin.jar
//C3P0jar包
c3p0-0.9.2.1.jar
mchange-commons-java-0.2.3.4.jar
在src目录下创建db.properoties配置文件,提供数据库连接信息
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///springtest
jdbc.username=root
jdbc.password=123
创建applicationContext.xml文件
需要创建的对象:
连接池——单例
注入到JdbcTemplate对象
JdbcTemplate
注入到dao层对象(注解形式)
dao层
注入到service层对象(注解形式)
service层
注入到单元测试对象(注解形式)
<!-- 引入外部的properties文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!--
创建内置连接池
等价于 DriverManagerDataSource dmDs = new DriverManagerDataSource();
-->
<bean id="dmDs" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClass}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}"/>
</bean>
<!--
创建c3p0连接池
等价于 ComboPooledDataSource c3p0Ds = new ComboPooledDataSource();
-->
<bean id="c3p0Ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--dao层未继承JdbcDaoSupport-->
<!-- 创建JdbcTemplate对象 -->
<bean id="jdbcTeplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="c3p0Ds"></property>
</bean>
<!--创建Dao层对象-->
<bean id="accountDao" class="com.itnannan.dao.AccountDaoImpl"></bean>
<!--dao层继承JdbcDaoSupport-->
<bean id="accountDao" class="com.itnannan.dao.AccountDaoImpl">
<!-- 当注入dataSource后,底层会自动创建一个JdbcTemplate -->
<property name="dataSource" ref="c3p0Ds" />
</bean>
<!--service层对象-->
<bean id ="accountService" class="com.itnannan.service.AccountServiceImpl"/>
单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class JTemplateTest {
@Autowired
private AccountService accountService;
@Test
public void test01(){
accountService.account("tom", "fox", 100);
}
}
//获取对象(查询结果为一条记录)
User user = jdbcTemplate.queryForObject("select * from t_user where id =?",
new BeanPropertyRowMapper<User>(User.class),1);
//获取对象集合(查询结果为多条记录)
List<User> user = jTemplate.query("select * from t_user", new BeanPropertyRowMapper<User>(User.class));
声明式事务管理:
事务管理的核心:同一个连接
XML形式:
目的:使转账方法获得增强,实现事务管理
需要:
连接池
dao层继承JdbcDaoSupport //需要连接池对象和数据库交互
//以上为了操作数据库
--------------------------------我是分割线--------------------------
//以下为了实现事务管理(AOP)
service //需要dao层对象操作数据库
事务管理器
事务通知
切面
配置applicationContext.xml文件
<!-- 目标对象,也是测试需要的对象 -->
<bean id ="accountService" class="com.itnannan.service.AccountServiceImpl2"/>
<!--
创建c3p0连接池
等价于 ComboPooledDataSource c3p0Ds = new ComboPooledDataSource();
-->
<bean id="c3p0Ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--dao层对象-->
<bean id="accountDao" class="com.itnannan.dao.AccountDaoImpl">
<!-- 当注入dataSource后,底层会自动创建一个JdbcTemplate -->
<property name="dataSource" ref="c3p0Ds" />
</bean>
<!-- 目标对象,也是测试需要的对象service -->
<bean id ="accountService" class="com.itnannan.service.AccountServiceImpl"></bean>
<!--配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--事务的管理需要连接-->
<property name="dataSource" ref="c3p0Ds"></property>
</bean>
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
tx:attributes
<!--
name:必需的,对哪些方法进行事务控制
isolation 可选 设置事务隔离级别 默认是DEFAULT
propagation:可选 设置事务传播 默认值 REQUIRED
timeout 可选 超时时间 默认值-1
read-only 可选 默认值是false 如果不是只读,它可以对insert update delete操作,如果是只读不可以。
rollback-for 可选 可以设置一个异常,如果产生这个异常,触发事务回滚
no-rolback-for 可选 可以设置一个异常,如果产生这个异常,不会触发事务回滚
-->
<tx:method name="account" read-only="false"/>
/tx:attributes
/tx:advice
<!-- 配置切面 -->
aop:config
<aop:pointcut expression="execution(* com.itnannan.service.AccountServiceImpl.account(..))" id="XPoint"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="XPoint"/>
/aop:config
单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public Test{
//测试service对象的方法,需要service对象
@Autowired
private AccountService accountService;
@Test
public void test(){
accountService.account("tom","fox",500);
}
}
Annotation形式:
目的:使转账方法获得增强,实现事务管理
需要:
连接池
dao层继承JdbcDaoSupport //需要连接池对象和数据库交互
//以上为了操作数据库
//以下为了实现事务管理(AOP)
service //需要dao层对象操作数据库
事务管理器
配置注解需要的参数
配置applicationContext.xml文件:
<!-- 引入外部的properties文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 目标对象,也是测试需要的对象 -->
在service层添加注解注入dao
<bean id ="accountService" class="com.itnannan.service.AccountServiceImpl2"/>
<!--
创建c3p0连接池
等价于 ComboPooledDataSource c3p0Ds = new ComboPooledDataSource();
-->
<bean id="c3p0Ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--dao层-->
<bean id="accountDao" class="com.itnannan.dao.AccountDaoImpl">
<!-- 当注入dataSource后,底层会自动创建一个JdbcTemplate -->
<property name="dataSource" ref="c3p0Ds" />
</bean>
<!--配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="c3p0Ds"></property>
</bean>
<!-- 配置注解需要的参数 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
service层注解:
在类或要增强方法上添加@Transactional即可