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);
}
}
}
---------------------------------------------------