1.为了使JDBC更加易于使用,spring在JDBC API 上定义了一个抽象层,从此建立了一个JDBC框架。JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法。每个模板方法都能控制整个过程。并允许覆盖过程中的特定任务。通过这种方式,可以再尽可能保持灵活性的情况下,将数据库存取的工作量降到最低。
2.JdbcTemplete在applicationContext中的配置:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${url}"></property>
<property name="username" value="${usename}"></property>
<property name="password" value="${password}"></property>
<property name="driverClassName" value="${driverClassName}"></property>
</bean>
<bean id="jdbcTemplament" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>
3.JdbcTemplate在dao层中的使用:(包括NamedParameterJdbcTemplate 使用具名参数)
public class BankDaoImp {
private JdbcTemplate jdbcTemplate;
private NamedParameterJdbcTemplate namedParameterJdbcTemplate ;
public void saveCardInfo(CardInfo ci){
/*String sql="insert into card_info values(?,?,?,?)";
jdbcTemplate.update(sql,ci.userName,ci.passwd,ci.money,ci.cardNum);*/
String sql="insert into card_info values (:card_num, :user_name, :passwd, :money)";
Map<String , Object> map= new HashMap<String , Object>();
map.put("card_num", "486");
map.put("user_name", "jdflkjsd");
map.put("passwd", "47896");
map.put("money", 500);
namedParameterJdbcTemplate.update(sql,map);
}
public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
return namedParameterJdbcTemplate;
}
public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
}
public CardInfo getCardInfoById(String id){
String sql ="select * from card_info where card_num = ?";
System.out.println("-------》");
return (CardInfo) jdbcTemplate.queryForObject(sql, new Object[]{id}, new RowMapper(){
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
// TODO Auto-generated method stub
CardInfo ci= new CardInfo();
System.out.println("---2----》");
while(rs.next()){
ci.cardNum=rs.getString("card_num");
ci.money=Integer.parseInt(rs.getString("money"));
ci.userName=rs.getString("user_name");
ci.passwd=rs.getString("passwd");
}
System.out.println("---3----》");
return ci;
}
});
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
4.事务的ACID特性:
原子性:确保动作要么全部完成,要么完全不起作用
一致性:数据和资源处于一种满足业务规则的一致状态中
隔离性:用户的操作不能混淆
持久性:一旦事务完成,无论发生什么系统错误,他的结果都不应该受到影响
5.在xml文件中对事务进行配置:
首先,配置事务管理器;
然后,将事务管理器加入到事务管理模板中,
接着,对事务管理器上的服务进行定义
最后,把该服务应用于切口
<!--配置事務管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!---
配置事務模板
-->
<bean id="txTemplate" class ="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="txManager"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="transfer*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.lh.spring.tx.*.*(..))" id="txPointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>