1.事務
1.1 事務的四大特性是:
原子性(Atomicity):原子性。
一致性(Consistency):事務執行後,數據庫狀態與其它業務規則保持一致。
隔離性(Isolation):併發中的多個事務不會相互干擾。
持久性(Durability):一旦事務提交成功,事務中所有的數據操作都必須被持久化到數據庫中。
1.2 jdbc事務
在jdbc中處理事務,都是通過Connection完成的!
同一事務中所有的操作,都在使用同一個Connection對象!
jdbc處理事務的代碼格式:
try {
con.setAutoCommit(false);//開啓事務…(true:設置爲自動提交事務)
….
con.commit();//try的最後提交事務
} catch() {
con.rollback();//回滾事務
}
2.數據庫連接池
2.1 DBCP連接池
commons-pool.jar
commons-dbcp.jar
import org.apache.commons.dbcp.BasicDataSource;
...
BasicDataSource ds = new BasicDataSource();
ds.setUsername("root");
ds.setPassword("123");
ds.setUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setMaxActive(20);
ds.setMaxIdle(10);
ds.setInitialSize(10) ;
// 使用
Connection con = ds.getConnection();
2.2 C3P0 連接池
c3p0-0.9.2-pre1.jar
mchange-commons-0.2.jar
(1)手動配置
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setUser("root");
ds.setPassword("123");
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setAcquireIncrement(5) ;
ds.setInitialPoolSize(20) ;
ds.setMinPoolSize(2) ;
ds.setMaxPoolSize(50) ;
Connection con = ds.getConnection();
(2)配置文件
配置文件可以是properties,也可以是xml。(可用於提供多個配置信息)
配置文件要求:
文件名稱:必須叫c3p0-config.xml
文件位置:必須在src下
使用:
ComboPooledDataSource ds = new ComboPooledDataSource();
Connection con = ds.getConnection();
(3)Tomcat配置連接池
在server.xml中,或在conf/catalina/localhost/下創建xml文件
獲取Tomcat資源
Context cxt = new InitialContext();
DataSource ds = (DataSource)cxt.lookup("java:/comp/env/myc3p0");
Connection con = ds.getConnection();
3.ThreadLocal
ThreadLocal類只有三個方法:
- void set(T value):保存值;
- T get():獲取值;
- void remove():移除值。
ThreadLocal內部其實是個Map來保存數據。雖然在使用ThreadLocal時只給出了值,沒有給出鍵,其實它內部使用了當前線程做爲鍵。
class MyThreadLocal<T> {
private Map<Thread,T> map = new HashMap<Thread,T>();
public void set(T value) {
map.put(Thread.currentThread(), value);
}
public void remove() {
map.remove(Thread.currentThread());
}
public T get() {
return map.get(Thread.currentThread());
}
}
4. DBUtils包
DBUtils是對JDBC的簡單封裝,Jar包:dbutils.jar
QueryRunner:
- update():執行insert、update、delete;
int update(Connection con, String sql, Object… params)
int update(String sql, Object… params)
@Test
public void fun1() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "insert into user values(?,?,?)";
qr.update(JdbcUtils.getConnection(), sql, "u1", "zhangSan", "123");
}
@Test
public void fun2() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "insert into user values(?,?,?)";
qr.update(sql, "u1", "zhangSan", "123");
}
- ResultSetHandler:把ResultSet轉換成目標類型的接口
// 實現類
MapHandler:單行處理器!把結果集轉換成Map<String,Object>,其中列名爲鍵!
MapListHandler:多行處理器!把結果集轉換成List<Map<String,Object>>;
BeanHandler:單行處理器!把結果集轉換成Bean,該處理器需要Class參數,即Bean的類型;
BeanListHandler:多行處理器!把結果集轉換成List<Bean>;
ColumnListHandler:多行單列處理器!把結果集轉換成List<Object>,使用ColumnListHandler時需要指定某一列的名稱或編號,例如:new ColumListHandler(“name”)表示把name列的數據放到List中。
ScalarHandler:單行單列處理器!把結果集轉換成Object。一般用於聚集查詢,例如select count(*) from tab_student。
- query():執行select語句;
public <T> T query(String sql, ResultSetHandler<T> rh, Object… params)
public <T> T query(Connection con, String sql, ResultSetHandler<T> rh, Object… params)
- batch():執行批處理。
更新一行記錄時需要指定一個Object[]爲參數,如果是批處理,那麼就要指定Object[][]爲參數了。即多個Object[]就是Object[][]了,其中每個Object[]對應一行記錄
@Test
public void fun10() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "insert into tab_student values(?,?,?,?)";
Object[][] params = new Object[10][]; //表示 要插入10行記錄
for(int i = 0; i < params.length; i++) {
params[i] = new Object[]{"S_300" + i, "name" + i, 30 + i, i%2==0?"男":"女"};
} //參數值
qr.batch(sql, params);
}