jdbc 일괄 처리 & 사무 개념 및 성질

13062 단어 Java 기반
요점: 1.JDBC 사용 빠른 회고 2배치 처리실무, 일, 총무
####복습
  • 드라이브를 어떻게 등록하는가
  •                 Class.forName("com.sql.jdbc.Driver");
    

    2. 연결 대상을 어떻게 얻는가
                 DriverManager.getConnection(url,name,password);
    
                url  :  url             
                
                mysql url    :jdbc:myql:///mydb
    
  • sql문장을 조작할 수 있는 대상을 어떻게 얻는가
  •                 Statement st=conn.createStatement();      
                    
                    st.executeQuery();
                    st.executeUpdate();                
                    st.execute();
                    
                    PreparedStatement pst=conn.prepareStatement(sql);   //    ?
                    setXXX()
                    
                    executeQuery();
                    pst.executeUpdate();
    

    4. 질의 문을 실행하면 ResultSet을 받을 수 있습니다.
                    ResultSet  rs=st.executeQuery(sql);
                    
                    rs.next();
                    
                    getObject()
                    getInt();
    

    5. 자원 닫기
                    rs.close();
                    st.close();
                    conn.close();     
    

    ###다중 데이터 처리 정보. ###일괄 처리 일괄 처리 응용 프로그램: 한 번에 여러 개의 ql 문장을 실행할 수 있습니다
                
                1.Statement
    
                             addBatch(String sql)  //   sql        
                             cleaarBatch();        //     sql
                             executetBatch();      //    sql     
    
                2.PreparedStatement
    
                             addBatch();           //  SQL       
                             executeBaatch();      //    sql
    

    ###Statement와 PreparedStatement의 차이점 1.Statement는 서로 다른 ql문장을 실행하기에 적합합니다PreparedStatement는 같은 ql문장을 실행하기에 적합합니다.2.Statement는 실행할 때PreParedStatement보다 효율이 낮습니다. 1 #### 두 개의 데모를 보세요. 제가 먼저 jdbc를utils에 봉인할게요.
    package cn.lawfree.JDBC.util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ResourceBundle;
    
    public class JdbcUtil {
    
    	private static String DRIVER;
    	private static String URL;
    	private static String USERNAME;
    	private static String PASSWORD;
    
    	// private static final ThreadLocal tl = new
    	// ThreadLocal();
    
    	static {
    		//       
    		ResourceBundle bundle = ResourceBundle.getBundle("db");
    		DRIVER = bundle.getString("driver");
    		URL = bundle.getString("url");
    		USERNAME = bundle.getString("username");
    		PASSWORD = bundle.getString("pwd");
    
    	}
    	static {
    		try {
    			Class.forName(DRIVER);
    		} catch (ClassNotFoundException e) {
    			throw new RuntimeException("        ");
    		}
    	}
    
    
    	//        Connection     
    	public static Connection getConnection() {
    		Connection conn = null;
    
    		try {
    			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    
    		} catch (SQLException e) {
    			// throw new RuntimeException("      ");
    			e.printStackTrace();
    		}
    		return conn;
    	}
    
    	//     Connection  
    	public static void closeConnection(Connection conn) throws SQLException {
    		if (conn != null) {
    			conn.close();
    		}
    	}
    
    	//   Statement  
    	public static void closeStatement(Statement st) throws SQLException {
    		if (st != null) {
    			st.close();
    		}
    	}
    
    	//   ResultSet  
    	public static void closeResultSet(ResultSet rs) throws SQLException {
    		if (rs != null) {
    			rs.close();
    		}
    	}
    }
    
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import cn.lawfree.JDBC.util.JdbcUtil;
    
    //statement    
    public class Demo1 {
    	public static void main(String[] args) throws SQLException {
    
    		String sql0 = "use t_testpatch";
    		String sql1 = "create table user(id int,name varchar(20),sex varchar(10),age int  )";
    		String sql2 = "insert into user values(1,'tom','male','20')";
    		String sql3 = "insert into user values(2,'fox','male','30')";
    		String sql4 = "update user set age=40 where id=1";
    
    		// 1.  Connection  
    		Connection conn = JdbcUtil.getConnection();
    		// 2.  Statement  
    		Statement st = conn.createStatement();
    
    		// 3. sql     st 
    		st.addBatch(sql0);
    		st.addBatch(sql1);
    		st.addBatch(sql2);
    		st.addBatch(sql3);
    		st.addBatch(sql4);
    
    		// 4.   
    		st.executeBatch();
    
    		// 5.    
    		st.close();
    		conn.close();
    	}
    }
    
    package cn.lawfree.JDBC.batch;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import cn.lawfree.JDBC.util.JdbcUtil;
    
    //PreparedStatement      
    public class demo2 {
    	public static void main(String[] args) throws SQLException {
    		Connection conn = JdbcUtil.getConnection();
    		String sql = "insert into user values(?,?,?,?)";
    		PreparedStatement pst = conn.prepareStatement(sql);
    
    		for (int i = 1; i < 10; i++) {
    			pst.setInt(1, i);
    			pst.setString(2, "name" + i);
    			pst.setString(3, "male");
    			pst.setInt(4, 20 + (int) (Math.random() * 10));
    
    			//       
    			pst.addBatch();
    
    		}
    
    		//   
    		pst.executeBatch();
    
    		pst.close();
    		conn.close();
    		conn.close();
    	}
    }
    
    

    ##사무는 통속적으로 말하면 사무란 한 조의 조작을 가리키는데 이 조의 조작을 구성하는 기능을 말한다. 모두 성공하지 않으면 모두 성공하지 못한다.데이터베이스 본의식이 업무를 제공한다.2. jdbc는 사무에 대한 처리를 제공한다.
    ###1.데이터베이스에서 사무 처리 mysql 사무는 자동으로 제출됩니다. ------기본적으로, 사무는 자동으로 제출되고, 하나의 sql 문장은 하나의 단독 사무oracle 사무는 수동으로 제출됩니다.commit
                start transaction ------    
                rollback          ------  
                commit            ------          
    

    mysql에서 제출 방식을 설정할 수 있습니까?show variables like ‘%commit’; 제출 방식 set autocomit=off/on 보기;자동 커밋 해제
    start transaction rollback commit 사용 시연
                     create table acount(
                          id int,
                          name varchar(10),
                          money int
                     )       
                     
                     insert into account values(1,'aaa',1000);      
                     insert into account values(2,'bbb',1000);          
                     insert into account values(3,'ccc',1000);           
                     
                     aaa--   -->bbb  500 
                     update acount set money=money-500 where name='aaa';   aaa  500.
                     update acount set money=money+500 where name='bbb';   bbb  500.
    

    트랜잭션 작업 1.start transcation. 2.
                     update acount set money=money-500 where name='aaa';   aaa  500.
                     update acount set money=money+500 where name='bbbb';   bbb  500.
    

    3. 데이터에 문제가 있음 발견 – >rollback;4. commit
    ###2.jdbc 사무 처리
    Connection에서 제공
                                 setAutoCommit(boolean f);  //-----         
                                 rollback();                //-----     
                                 commit();                  //-----    
    

    이 세 가지 방법은 jdbc에서 업무를 처리하는 세 가지 방법입니다. Savepoint 스크롤 포인트 con.setSavepoint(); 가져오기(롤백 포인트 설정)
                                 rollback(Savepoint) ;//     
    

    데모 하나 보실래요?
    package cn.lawfree.JDBC.transaction;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    //           
    //      ,       
    public class AccountDao {
    
    	//   
    	public void save(double money, String name, Connection conn)
    			throws SQLException {
    		String sql = "update account set money=money+? where name=? ";
    
    		PreparedStatement pst = conn.prepareStatement(sql);
    
    		pst.setDouble(1, money);
    		pst.setString(2, name);
    
    		int row = pst.executeUpdate();
    		if (row == 0) {
    			throw new RuntimeException("    ");
    		}
    
    		pst.close();
    
    	}
    
    	//   
    	public void get(double money, String name, Connection conn)
    			throws SQLException {
    		String sql = "update account set money=money-? where name=?";
    
    		PreparedStatement pst = conn.prepareStatement(sql);
    
    		pst.setDouble(1, money);
    		pst.setString(2, name);
    
    		int row = pst.executeUpdate();
    		if (row == 0) {
    			throw new RuntimeException("    ");
    		}
    		pst.close();
    
    	}
    }
    
    
    package cn.lawfree.JDBC.transaction;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Savepoint;
    
    import cn.itcast.lawfree.util.JdbcUtil;
    
    //       service  ,          
    //             
    public class AccountService {
    	public void hk() {
    
    		AccountDao dao = new AccountDao();
    		Connection conn = JdbcUtil.getConnection();
    		//      ------setAutoCommit(false);
    
    		Savepoint point = null;
    
    		try {
    			conn.setAutoCommit(false);
    			// 1. a    500
    
    			dao.get(500, "aaa", conn);
    
    			//        
    			point = conn.setSavepoint();
    
    			// 2.    500;
    			dao.save(500, "bbb", conn);
    		} catch (SQLException e) {
    			//   
    			// rollback
    			try {
    				conn.rollback(point);
    			} catch (SQLException e1) {
    				e1.printStackTrace();
    			}
    		} finally {
    
    			try {
    				// commit
    				conn.commit();
    				//   conn
    				JdbcUtil.closeConnection(conn);
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    
    		}
    
    	}
    }
    
    

    ### 트랜잭션의 특성(ACID) 1.원자성(Atomicity) 원자성이란 사무는 분할할 수 없는 작업 단위로 사무 중의 조작이 모두 발생하거나 발생하지 않는 것을 가리킨다.Consistency(Consistency) 트랜잭션 전후 데이터의 무결성이 일치해야 합니다.격리성(Isolation) 사무의 격리성은 여러 사용자가 데이터베이스에 동시 방문할 때 한 사용자의 사무가 다른 사용자의 사무소에 의해 방해될 수 없고 여러 개의 사무 간의 데이터는 서로 격리되어야 한다는 것을 말한다.지속성(Durability) 지속성은 하나의 업무가 일단 제출되는 것을 가리킨다.그것은 데이터베이스에서의 데이터에 대한 변화가 영구적이기 때문에 다음에 데이터베이스에 고장이 발생하더라도 그에 아무런 영향을 주어서는 안 된다
    사무의 격리성을 중점적으로 소개하는데 사무의 격리성을 고려하지 않으면 문제를 일으킬 수 있다
  • 한 사무를 더럽히고 다른 사무로 읽는 미제출 데이터
                             A    B 100,   
                             B       100
                             A   
                             B      100   
    
  • 2. 두 번 반복해서 읽을 수 없는 데이터가 일치하지 않습니다(update 조작을 강조하는데 데이터의 총 조항은 변하지 않습니다.
                                          Read committed.            
    

    데모 읽기 불가:
                                A     B 100,   
                                B        (   : Read committed       )
                                A   ,      100
                                
                                           ,        .
    
  • 허독(환독) 두 번 읽은 데이터가 일치하지 않음(인스터트 조작, 데이터의 총 항목 변화를 강조함)
  • ### 트랜잭션의 격리 수준 데이터베이스에는 4가지 격리 수준이 있습니다.Serializable: 더러운 읽기와 반복적인 읽기와 허독이 발생하는 것을 피할 수 있습니다.(직렬화) 2.Repeatable read: 더러운 읽기와 중복 읽기가 발생하는 것을 피할 수 있습니다. (commit을 입력하면 최신 데이터를 얻을 수 있습니다.)(중복 읽기 가능) 허독을 피할 수 없다.Read committed: 더티(dirty) 읽기 방지(커밋됨) 4.Read uncommitted: 최하위 수준, 위의 상태는 보장할 수 없음(읽기가 커밋되지 않음)
    ####mysql 기본 격리 레벨은 무엇입니까?격리 레벨은 어떻게 설정합니까?
    mysql 기본 격리 레벨은 Repeatable read 레벨입니다
                        select @@tx_isolation              
                        
                        set session transaction isolation level          
                                  
                        set session transaction isolation level Read uncommitted;
                        
                        serializable             
                        
                              ,        
    

    다음은 mysql로 서로 다른 사무 격리 단계에서 무슨 일이 일어날지 구체적으로 살펴봅시다.
  • 시계 account을 준비하고 두 개의Mysql로 열고 이렇게:
  • Mysql의 기본 사무 격리 단계는 Repeatable read인 것을 알고 있습니다. 더러운 읽기와 중복 읽기를 피할 수 있는지 살펴보겠습니다.
  • csdn으로 포토카드 폭발?나중에 시간 나면 다시...
  • ###JDBC 트랜잭션 격리 수준 설정
             connection     
            setTransactionIsolation(int level)           
            
                            
    

    소결:1.Statementment와PreparedStatement가 일괄 처리를 실행하는 특징Statement는 여러 가지 다른 sqlPreparedStatement를 실행하기에 적합하고 같은 sql2를 실행하기에 적합하다.사무 1조 조작은 모두 성공하든지 아니면 모두 성공하지 못하든지.mysql의 사무관리 1.start transcation rollback commit. 2. mysql의 사무는 기본적으로 autocommit=on입니다. autocommit=offoracle 데이터베이스에서 수동으로 수정할 수 있습니다. 사무는 수동으로 제출해야 합니다.jdbc 관리 업무
                         Connection  
                                  1.setAutoCommit(boolean flag)
                                  2.rollback
                                  3.commit
                                  4.Savepoint   
    

    5. 트랜잭션 특성(중점)
                          ACID
                                        gelixing                                                                                             
    

    6. 격리성은 격리성을 고려하지 않으면 어떤 문제가 발생합니까?
                                  1.       2.         3  (  )
    

    7. 격리 단계
                          1.Serializable:                   .(   )
                          2.Repeatable read:               (    commit        ) .(    )          
                          3.Read committed:         (    )
                          4.Read uncommitted:    ,         (    )    
    

    8.jdbc는 업무의 격리 단계를 어떻게 설정합니까
                          setTranscationIsolation(int level)     
    

    좋은 웹페이지 즐겨찾기