jdbc 지원 및 사물 관리

1. Spring jdbc 지원
Spring 은 관련 jar 패 키 지 를 도입 하여 c3p 0 연결 풀 을 지원 합 니 다.
public class App {
    //     
    ApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/h_jdbc/bean.xml");
    
    @Test
    public void testApp() throws Exception {
        UserDao ud = (UserDao) ac.getBean("userDao");
//      ud.save();
        System.out.println(ud.findById(5));
        System.out.println(ud.getAll());
    }
}

class UserDao {
    
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    
    public void save() {
        String sql = "insert into t_dept(deptName) values('test');";
        jdbcTemplate.update(sql);
    }
    
    public Dept findById(int id) {
        String sql = "select * from t_dept where deptId=?";
        List list = jdbcTemplate.query(sql,new MyResult(), id);
        return (list!=null && list.size()>0) ? list.get(0) : null;
    }
    
    public List getAll() {
        String sql = "select * from t_dept";
        List list = jdbcTemplate.query(sql, new MyResult());
        return list;
    }

    class MyResult implements RowMapper{
        //         
        @Override
        public Dept mapRow(ResultSet rs, int index) throws SQLException {
            Dept dept = new Dept();
            dept.setDeptId(rs.getInt("deptId"));
            dept.setDeptName(rs.getString("deptName"));
            return dept;
        }       
    }
}

class Dept {
    private int deptId;
    private String deptName;
    public int getDeptId() {
        return deptId;
    }
    public void setDeptId(int deptId) {
        this.deptId = deptId;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
    
}


    
    
    
        
        
        
        
        
        
        
        
    
    
    
    
        
    
    
    
    
        
    
  

2. Spring 사무 관리
Spring 은 사무 통제 의 실현 을 제공 했다.사용자 가 Spring 의 성명 식 사무 관 리 를 사용 하려 면 설정 파일 에 만 설정 하면 됩 니 다.사용 하고 싶 지 않 을 때 설정 을 직접 제거 합 니 다.이것 은 사무 제어 에 대한 최대한 의 결합 을 실현 했다.
Spring 성명 식 사무 관리자 클래스: Jdbc 기술: DataSourceTransactionManager Hibernate 기술: HibernateTransactionManager
메모: 한 업무 의 성공: 호출 된 서 비 스 는 성공 적 으로 실행 되 었 으 며, 서비스 에서 호출 된 모든 dao 가 성공 적 으로 실행 되 었 음 을 의미 합 니 다.사 무 는 반드시 서비스 층 에서 통일 적 으로 통제 해 야 한다.
2.1 XML 방식 의 실현



    
    
    
        
        
        
        
        
        
        
        
    
    
    
    
        
    
    
    
    
        
    
 
    
    
        
    
    
    
    
    
        
    
    
    
    
        
            
        
    
    
    
    
        
        
    
    
 
public class App {

    @Test
    public void testApp() throws Exception {
        //    
        ApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/a_tx/bean.xml");
        
        //     
        Dept dept = new Dept();
        dept.setDeptName("  :    ");
        
        DeptService deptService = (DeptService) ac.getBean("deptService");
        deptService.save(dept);
        
    }
}

class DeptService {
    
    //     dao  
    private DeptDao deptDao;
    public void setDeptDao(DeptDao deptDao) {
        this.deptDao = deptDao;
    }

    /*
     *     ?
     */
    public void save(Dept dept){
        //      
        deptDao.save(dept);
        
        int i = 1/0; //   :   Service.save()        
        
        //      
        deptDao.save(dept);
    }
}

class DeptDao {
    
    //     JdbcTemplate  
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void save(Dept dept){
        String sql = "insert into t_dept (deptName) values(?)";
        jdbcTemplate.update(sql,dept.getDeptName());
    }
}

class Dept {
    private int deptId;
    private String deptName;
    public int getDeptId() {
        return deptId;
    }
    public void setDeptId(int deptId) {
        this.deptId = deptId;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }   
}

2.2 주해 방식 의 실현
주 해 를 사용 하여 Spring 의 성명 식 사무 관 리 를 실현 하 는 것 이 더욱 간단 합 니 다!단계: 1) Aop 관련 jar 파일 2) bean. xml 에 설명 식 트 랜 잭 션 관리 및 응용 트 랜 잭 션 관리자 클래스 3) 트 랜 잭 션 제 어 를 추가 할 곳 에 주석 을 지정 해 야 합 니 다. @ Transactional
@ Transactional 주석: 1) 응용 업무 의 주석 2) 방법 에 정의: 현재 방법 은 spring 의 성명 식 사무 3) 를 클래스 에 정의 합 니 다. 현재 클래스 의 모든 방법 은 Spring 성명 식 사무 관 리 를 사용 합 니 다.4) 부모 클래스 에 정의: 부모 클래스 를 실행 할 때 사 무 를 적용 합 니 다.



    
    
    
        
        
        
        
        
        
        
        
    
    
    
    
        
    
    
    
    
        
    
    
    
    
    
    
    
    
    
  
public class App {

    @Test
    public void testApp() throws Exception {
        //    
        ApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/b_anno/bean.xml");
        
        //     
        Dept dept = new Dept();
        dept.setDeptName("  :    ");
        
        DeptService deptService = (DeptService) ac.getBean("deptService");
        deptService.save(dept);
    }
    
    //          
    @Test
    public void testApp2() throws Exception {
        //1.   bean.xml    ,      
        //ApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/b_anno/bean.xml");

        //2.            ,      
        //ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{});
        
        //3.          
        ApplicationContext ac = 
            new ClassPathXmlApplicationContext("cn/itcast/b_anno/bean.xml");
        //3.1            bean  
        //DeptDao deptDao = (DeptDao) ac.getBean("deptDao");
        //3.2             【      IOC       ,    】
        //DeptDao deptDao = ac.getBean(DeptDao.class);
        //3.3   ,     
        //DeptDao deptDao = ac.getBean("deptDap", DeptDao.class);
        //3.4      bean     
        //int count = ac.getBeanDefinitionCount();
        String[] names = ac.getBeanDefinitionNames();
        System.out.println(Arrays.toString(names));
    }
}

@Service
public class DeptService {
    
    //   dao
    @Resource
    private DeptDao deptDao;
    
    //   dao
    @Resource
    private LogDao logDao;

    /*
     *     ?
     */
    @Transactional(
            readOnly = false,  //     
            timeout = -1,       //           
            //noRollbackFor = ArithmeticException.class,  //          
            isolation = Isolation.DEFAULT,              //        ,      
            propagation = Propagation.REQUIRED          //        
    )
    public void save(Dept dept){
        logDao.insertLog();  //       【        】
        int i = 1/0;
        deptDao.save(dept);  //     
    }
}

@Repository
public class DeptDao {
    
    @Resource
    private JdbcTemplate jdbcTemplate;

    public void save(Dept dept){
        String sql = "insert into t_dept (deptName) values(?)";
        jdbcTemplate.update(sql,dept.getDeptName());
    }
}

//   :       
@Repository
public class LogDao {
    
    @Resource
    private JdbcTemplate jdbcTemplate;
    
    //       
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insertLog() {
        jdbcTemplate.update("insert into log_ (content) values('   Dept11..')");
    }
}

public class Dept {

    private int deptId;
    private String deptName;
    public int getDeptId() {
        return deptId;
    }
    public void setDeptId(int deptId) {
        this.deptId = deptId;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }   
}

트 랜 잭 션 전파 행위: Propagation. REQUIRED 가 지정 한 현재 방법 은 트 랜 잭 션 환경 에서 실행 되 어야 합 니 다.현재 실행 중인 방법 이 이미 존재 한다 면 현재 업무 에 가입 할 것 입 니 다.Propagation.REQUIRED_NEW 에서 현재 방법 을 지정 하려 면 업무 환경 에서 실행 해 야 합 니 다.현재 실행 중인 방법 이 이미 존재 한다 면: 트 랜 잭 션 이 끊 깁 니 다.항상 새로운 사 무 를 시작 합 니 다. 실행 이 끝 난 후;방금 끊 은 일 은 계속 되 었 다.

좋은 웹페이지 즐겨찾기