JDBC一對一,一對多,多對多,事務隔離級別

package com.zjy.jdbc.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbcp.BasicDataSource;

import com.zjy.jdbc.model.PageBean;

public class DBUtil {
    private static BasicDataSource datasource;
    public static Connection getConnectionByJdbc() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8";
            String username = "root";
            String password = "密碼";
            Connection conn = DriverManager.getConnection(url, username,
                    password);
            return conn;
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
    public static Connection getConnection() {
        try {
          return getConnectionByDataSource();
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
    public static boolean execute(String sql) {
        try {
            Connection conn = DBUtil.getConnection();
            Statement st = conn.createStatement();
            boolean result = st.execute(sql);
            st.close();
            conn.close();
            return result;
        } catch (SQLException e) {
            throw new IllegalArgumentException(e);
        }
    }

    public static List<Map<String, Object>> executeQuery(String sql) {
        try {
            Connection conn = DBUtil.getConnection();
            Statement st = conn.createStatement();
            ResultSet set = st.executeQuery(sql);
            ResultSetMetaData metaData = set.getMetaData();
            List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
            int columnCount = metaData.getColumnCount();
            while (set.next()) {
                Map<String, Object> map = new HashMap<String, Object>();
                for (int i = 1; i <= columnCount; i++) {
                    String name = metaData.getColumnName(i);
                    Object value = set.getObject(name);
                    map.put(name, value);
                }
                result.add(map);
            }
            set.close();
            st.close();
            conn.close();
            return result;
        } catch (SQLException e) {
            throw new IllegalArgumentException(e);
        }
    }

    public static Map<String, Object> executeQuerySingle(String sql) {
        List<Map<String, Object>> list = executeQuery(sql);
        return list.get(0);
    }

    public static long getTotalRows(String sql) {
        int start = sql.indexOf("from");
        String countSql = "select count(*) as totalRows "
                + sql.substring(start);
        Map<String, Object> row = DBUtil.executeQuerySingle(countSql);
        long totalRows = (Long) row.get("totalRows");
        return totalRows;
    }

    public static PageBean<Map<String, Object>> executePage(String sql,
            long pageSize, long pageId) {
        PageBean<Map<String, Object>> result = new PageBean<Map<String, Object>>();
        long count = getTotalRows(sql);
        long pageTotal = count % pageSize == 0 ? count / pageSize : count
                / pageSize + 1;// 修正分頁總數
        pageId = pageId > pageTotal ? pageTotal : pageId;// 修正分頁編號
        long start = (pageId - 1) * pageSize;// 計算開始位置
        start=start<=0?0:start;
        long end = pageId * pageSize;
        end = end > count ? count : end;// 結算結束位置
        sql = sql + " limit " + start + "," + pageSize;
        List<Map<String, Object>> list = DBUtil.executeQuery(sql);
        result.setPageContent(list);
        result.setPageId(pageId);
        result.setPageTotal(pageTotal);
        return result;
    }
    public static Connection getConnectionByDataSource(){
        try {
            if(datasource==null){
                datasource = new BasicDataSource();
                datasource.setDriverClassName("com.mysql.jdbc.Driver");
                datasource.setUrl("jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8");
                datasource.setUsername("root");
                datasource.setPassword("密碼");
                datasource.setMaxWait(1000);//最大等待時間
                datasource.setMaxIdle(20);//最大空閒數
                datasource.setMaxActive(20);//最大活躍數
                datasource.setTestOnBorrow(true);//取得連接時
                datasource.setTestOnReturn(true);//連接返回時
                datasource.setTestWhileIdle(true);//空閒時候,檢測連接是否有效
                datasource.setValidationQuery("select count(*) from customer");
            }
            Connection conn=datasource.getConnection();
            return conn;
        } catch (SQLException e) {
            throw new IllegalArgumentException(e);
        }
    }
}
----------------------------------------------------------------

package com.zjy.jdbc.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Savepoint;
import java.sql.Statement;

import com.zjy.jdbc.dao.impl.AccountDao;
import com.zjy.jdbc.model.Account;
import com.zjy.jdbc.model.ExistsStatus;

public class Thread1 {
    //取款
    public static void main(String[] args) {
         try {
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8";
                String username = "root";
                String password = "密碼";
                Connection conn = DriverManager.getConnection(url, username,
                        password);
               conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
                conn.setAutoCommit(false);
                String query="select * from account where id=1";
                Statement st=conn.createStatement();
                ResultSet set=st.executeQuery(query);
                double balance=0d;
                if(set.next()){
                    balance=set.getDouble("balance");
                    System.out.println("取款線程讀取到的餘額="+balance);
                }
                String update="update account set balance="+(balance+500)+" where id=1";
                st.execute(update);
                conn.commit();
                st.close();
                conn.close();
            } catch (Exception e) {
                throw new IllegalArgumentException(e);
            }

    }

}
----------------------------------------------------------

package com.zjy.jdbc.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Thread2 {
    public static void main(String[] args) {
         try {
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8";
                String username = "root";
                String password = "密碼";
                Connection conn = DriverManager.getConnection(url, username,
                        password);
                conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
                conn.setAutoCommit(false);
                String query="select * from account where id=1";
                Statement st=conn.createStatement();
                ResultSet set=st.executeQuery(query);
                double balance=0d;
                if(set.next()){
                    balance=set.getDouble("balance");
                    System.out.println("轉帳匯入線程讀取到的餘額="+balance);
                }
                String update="update account set balance="+(balance-300)+" where id=1";
                st.execute(update);
               
                conn.commit();
            } catch (Exception e) {
                throw new IllegalArgumentException(e);
            }

    }
}
-----------------------------------------

package com.zjy.jdbc.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Thread3 {
    public static void main(String[] args) {
         try {
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8";
                String username = "root";
                String password = "密碼";
                Connection conn = DriverManager.getConnection(url, username,
                        password);
                conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
                conn.setAutoCommit(false);
                String query="select * from account where id=1";
                Statement st=conn.createStatement();
                ResultSet set=st.executeQuery(query);
                if(set.next()){
                    double balance=set.getDouble("balance");
                    System.out.println("第一次讀取到的餘額="+balance);
                }
                set=st.executeQuery(query);
                if(set.next()){
                    double balance=set.getDouble("balance");
                    System.out.println("第二次讀取到的餘額="+balance);
                }
                set=st.executeQuery(query);
                if(set.next()){
                    double balance=set.getDouble("balance");
                    System.out.println("第三次讀取到的餘額="+balance);
                }
                conn.commit();
            } catch (Exception e) {
                throw new IllegalArgumentException(e);
            }

    }
}
------------------------------------------------

package com.zjy.jdbc.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


public class Thread4 {
    //取款
    public static void main(String[] args) {
         try {
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8";
                String username = "root";
                String password = "密碼";
                Connection conn = DriverManager.getConnection(url, username,
                        password);
                conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
                conn.setAutoCommit(false);
                String query="select * from account where id=1";
                Statement st=conn.createStatement();
                ResultSet set=st.executeQuery(query);
                double balance=0d;
                if(set.next()){
                    balance=set.getDouble("balance");
                    System.out.println("取款線程讀取到的餘額="+balance);
                }
                balance=balance+500;
                String update="update account set balance="+(balance)+" where id=1";
                st.execute(update);
                conn.commit();
                balance=balance+300;
                update="update account set balance="+(balance)+" where id=1";
                st.execute(update);
                conn.commit();
                st.close();
                conn.close();
            } catch (Exception e) {
                throw new IllegalArgumentException(e);
            }

    }

}
---------------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章