8).Spring - JdbcTemplate
JdbcTemplate:Spring简化的JDBC,Spring提供(spring-jdbc.jar),是自带的,直接用
获得JdbcTemplate:先将其放到spring中管理,再通过工厂获得
<!-- 管理DruidDataSource -->
<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
<property name="username" value="jwnming"></property>
<property name="password" value="Oracle123"></property>
<property name="initialSize" value="10"></property>
<property name="maxActive" value="20"></property>
<property name="minIdle" value="4"></property>
<property name="maxWait" value="4000"></property>
</bean>
<!-- 管理Spring的JdbcTemplate -->
<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="druid"></property>
</bean>
重要API:
① 增删改方法:
jdbcTemplate.update(sql,参数列表...);
② 查询方法(查询单个):
T t = jdbcTemplate.queryForObject(sql,映射工具RowMapper接口,绑定参数);
例子:
ClassPathXmlApplicationContext c= new ClassPathXmlApplicationContext("classpath:/applicationContext.xml");
jdbcTemplate = (JdbcTemplate) c.getBean("jt");
User user = jdbcTemplate.queryForObject("select id,username,password,sex from t_users where username = ? and password = ?",
new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int arg) throws SQLException {
User user = new User(rs.getString("id"), rs.getString("username"), rs.getString("password"), rs.getInt("sex"));
return user;
}
}, "蒋文明", "123");
return user;
注意:查询没有结果,异常形式告知。
③ 查询多条结果:List<T> list = jdbcTemplate.query(sql,RowMapper,绑定的参数);
Spring+JdbcTemplate开发应用:DAO层 + Service层
编码步骤:①表 ②实体 ③书写DAO、实现类 ④开发Service、实现类
10).Spring - 声明式事务
Spring声明式事务
操作步骤:
① 管理service的目标类(以及上面的JdbcTemplate、连接池)
② spring管理事务管理器
③ spring管理事务增强(tx:adivce 替代了 bean)
④ aop配置将增强加入service方法中
代码:
<!-- 管理DruidDataSource -->
<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
<property name="username" value="jwnming"></property>
<property name="password" value="Oracle123"></property>
<property name="initialSize" value="10"></property>
<property name="maxActive" value="20"></property>
<property name="minIdle" value="4"></property>
<property name="maxWait" value="4000"></property>
</bean>
<!-- 管理Spring的JdbcTemplate -->
<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="druid"></property>
</bean>
<!-- 管理UserDAOImpl -->
<bean id="udi" class="com.jwnming.dao.impl.UserDAOImpl">
<property name="jdbcTemplate" ref="jt"></property>
</bean>
<!-- 管理UserServiceImpl -->
<bean id="usi" class="com.jwnming.service.impl.UserServiceImpl">
<!-- UserDAO属性 -->
<property name="userDAO" ref="udi"></property>
</bean>
<!-- 事务管理器DataSourceTransactionManager -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入连接池 -->
<property name="dataSource" ref="druid"></property>
</bean>
<!-- 管理事务增强 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 事务增强属性 -->
<tx:attributes>
<!-- User 登录方法:只读、回滚异常为RuntimeExcepiton、支持事务 -->
<tx:method name="login" read-only="true" rollback-for="java.lang.RuntimeException" propagation="SUPPORTS"></tx:method>
<!-- User 注册方法:回滚异常为RuntimeException、必须事务 -->
<tx:method name="regist" rollback-for="java.lang.RuntimeException" propagation="REQUIRED"></tx:method>
<!--添加、修改、删除放到最后的位置 <tx:method name="*" rollback-for="java.lang.RuntimeException" propagation="REQUIRED"></tx:method> -->
</tx:attributes>
</tx:advice>
<!-- aop配置将事务增强加入UserServiceImpl的方法中 -->
<aop:config>
<!-- 声明事务的切入点 -->
<aop:pointcut id="pc" expression="execution(boolean com.jwnming.service.impl.UserServiceImpl.login(java.lang.String, java.lang.String))"></aop:pointcut>
<aop:pointcut id="pc1" expression="execution(boolean com.jwnming.service.impl.UserServiceImpl.regist(com.jwnming.entity.User))"></aop:pointcut>
<!--<aop:pointcut id="pc" expression="execution(* com.jwnming.service.impl.UserServiceImpl.*(..))"></aop:pointcut> -->
<!-- 组装:事务增强+切入点 -->
<aop:advisor pointcut-ref="pc" advice-ref="txAdvice"></aop:advisor>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"/>
</aop:config>
事务属性:
事务属性配置标签和属性
<tx:attributes>
<tx:method name="方法名1" read-only="只读" propagation="事务传播" rollback-for="回滚异常"></tx:method>
<tx:method name="方法名2" ></tx:method>
</tx:attributes>
① 事务回滚:rollback-for
指定service的方法,在什么异常情况下进行事务回滚操作
<tx:method name="regist" rollback-for="java.lang.RuntimeException"></tx:method>
默认: rollback-for默认值 java.lang.RuntimeException
② 只读事务:read-only=“true|false”
作用:可以让serviec的查询方法在数据库的内存中,事务中,不分配回滚段。节省内存
应用:service方法只有读操作,建议设置为只读:`read-only="true"`
③ 事务传播:propagation="SUPOORTS|REQUIRED"
场景:service调用service
SUPPORTS: 支持事务
特点:如果外部已经开始了事务,并融合到外部事务中;如果外部没有开启事务,则不开启事务
REQUIRED: 需要事务
特点:必须有一个事务。如果外部已经开启,则融合外部事务中。如果外部没有事务,则开启事务
④ 事务属性方法的简化:<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
含义:只要service方法以get开头,都适用于,只读,支持事务这些设置