spring随笔(三)DataBase(一)

2014-11-24 02:08:46 · 作者: · 浏览: 0

1,Data access with JDBC

使用springJdbc非常简单。在我们写daoImpl的时候只需要继承spring的org.springframework.jdbc.core.support.JdbcDaoSupport该类。在实现以下需要实现的接口即可,再在需要实现的接口方法中使用通过继承JdbcDaoSupport类的jdbcTemplate对象的update、execute、query等方法完成我们需要的方法即可。

比如我们要写一个UserDaoImpl类泽代码如下:

package com.xiaohui.jdbc;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.PreparedStatementCallback;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class UserDaoImpl extends JdbcDaoSupport implements IUserDao {
	@Override
	public void save(User u) {
		String sql = "INSERT INTO user VALUES(NULL, )";
		this.getJdbcTemplate().update(sql, u.getName());
	}

	@Override
	public void update(User u) {
		String sql = "UPDATE  user SET name =  WHERE id= ";
		this.getJdbcTemplate().update(sql, u.getName(), u.getId());
	}

	@Override
	public void delete(Long id) {
		this.getJdbcTemplate().execute("delete from user where id=" + id);
	}

	@Override
	public List
   
     list() {
		String sql = "SELECT * FROM user";
		List
    
      users = this.getJdbcTemplate().query(sql, new ResultSetExtractor
     
      >() { @Override public List
      
        extractData(ResultSet rs) throws SQLException, DataAccessException { List
       
         userList = new ArrayList
        
         (); while (rs.next()) { User user = new User(); user.setId(rs.getLong("id")); user.setName(rs.getString("name")); userList.add(user); } return userList; } }); return users; } @Override public User getById(final Long id) { String sql = "select * from user where id= "; User u = this.getJdbcTemplate().execute(sql, new PreparedStatementCallback
         
          () { @Override public User doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException { ps.setLong(1, id); ResultSet set = ps.executeQuery(); while (set.next()) { User u = new User(); u.setId(id); u.setName(set.getString("name")); return u; } return null; } }); return u; } } 
         
        
       
      
     
    
   


同时我们需要给属性jdbcTemplate在xml中配置属性值xml如下:需要在source folder目录下创建一个jdbc.properties。

   

   
	
    
    
	
     
      
      
      
      
    
    
     
      
    
    
     
      
    

   


这样我们就可以通过获取userdao 来与数据库交互了。

2,spring事务管理

事务是一组操作的执行单元,相对于数据库操作来讲,事务管理的是一组SQL指令,比如增加,修改,删除等,事务的一致性,要求,这个事务内的操作必须全部执行成功,如果在此过程种出现了差错,比如有一条SQL语句没有执行成功,那么这一组操作都将全部回滚。

事务特性:

    atomic(原子性):要么都发生,要么都不发生。 consistent(一致性):数据应该不被破坏。 solate(隔离性):用户间操作不相混淆。 Durable(持久性):永久保存,例如保存到数据库中等。

    spring提供的两种事务管理方式 基于xml的事务管理和基于aop注解的管理事务。在spring中spring没有直接管理事务,而是将管理事务的责任委托给JTA或相应的持久性机制所提供的某个特定平台的事务实现

    事务管理器实现 目标
    org.springframework.jdbc.datasource.DataSourceTransactionManager 在单一的JDBC Datasource中的管理事务
    org.springframework.orm.hibernate3.HibernateTransactionManager 当持久化机制是hibernate时,用它来管理事务
    org.springframework.jdo.JdoTransactionManager 当持久化机制是Jdo时,用它来管理事务。
    org.springframework.transaction.jta.JtaTransactionManager 使用一个JTA实现来管理事务。在一个事务跨越多个资源时必须使用
    org.springframework.orm.ojb.PersistenceBrokerTransactionManager 当apache的ojb用作持久化机制时,用它来管理事务。

    理解事务属性--事物传播规则
      REQUIRED :业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务 NOT_SUPPORTED :声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务