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