1,配置连接池DBCP
public class TestDBCP {
private static String driver;
private static String url,user,pass;
private static Connection conn = null;
private static Statement sta = null;
private static ResultSet rs = null;
private static BasicDataSource bs =null;
1-1,静态块内配置连接池基本属性
static{
try {
Properties p = new Properties();
FileInputStream is = new FileInputStream("JDBC.properties");
p.load(is);
driver = p.getProperty("driver");
url = p.getProperty("url");
user = p.getProperty("user");
pass = p.getProperty("pass");
//配置连接池
bs = new BasicDataSource();
//设置连接时加载的驱动
bs.setDriverClassName(driver);
//设置连接的url
bs.setUrl(url);
//设置用户名
bs.setUsername(user);
//设置密码
bs.setPassword(pass);
//设置初始连接数
bs.setInitialSize(20);
//设置最大的空闲连接数
bs.setMaxIdle(10);
//设置最小空闲连接数
bs.setMinIdle(5);
//设置最大的连接数
bs.setMaxActive(100);
//设置连接超时
bs.setMaxWait(3000);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
1-2获取连接的方法
public static Connection getConn(){
if(conn==null)
try {
//通过连接池获取连接
conn = bs.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
1-3关闭资源的方法
public static void closeAll(Connection conn,Statement sta,ResultSet rs){
try {
if(conn !=null && conn.isClosed()){
conn.close();
TestDBCP.conn = null;
}
if(sta!= null){
sta.close();
}
if(rs!= null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
1-4测试
public static void selDepr01(){
PreparedStatement pre = null;
ResultSet rs = null;
try {
conn = TestDBCP.getConn();
String sql = "select * from dept01";
pre = conn.prepareStatement(sql);
rs = pre.executeQuery();
while(rs.next()){
System.out.print(rs.getInt(1)+"\t");
System.out.print(rs.getString(2)+"\t");
System.out.print(rs.getString(3)+"\t");
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
TestDBCP.closeAll(conn, pre, rs);
}
}
}
2,连接池C3P0
步骤: (1)配置properties文件
(2)取出文件内容
(3)创建连接池对象:
ComboPooledDataSource cds = new ComboPooledDataSource();
(4)设置驱动信息;
cds.setDriverClass(driver);//设置数据库驱动
cds.setJdbcUrl(url);//设置url
cds.setUser(user);//设置用户名
cds.setPassword(pass);//设置密码
(5)设置初始化连接池信息
cds.setInitialPoolSize(20);//设置初始的连接数
cds.setMaxPoolSize(100);//设置最大的空闲连接数
cds.setMinPoolSize(10);//设置最小的空闲连接数
cds.setCheckoutTimeout(3000);//设置连接超时时间
cds.setAcquireIncrement(5);//设置c3p0一次获取连接的数量(每次增加的)
例如:
Properties p = new Properties();
FileInputStream is = new FileInputStream("JDBC.properties");
p.load(is);
driver = p.getProperty("driver");
url = p.getProperty("url");
user = p.getProperty("user");
pass = p.getProperty("pass");
//创建连接池对象
cds = new ComboPooledDataSource();
//设置数据库驱动
cds.setDriverClass(driver);
//设置url
cds.setJdbcUrl(url);
//设置用户名
cds.setUser(user);
//设置密码
cds.setPassword(pass);
//设置初始的连接数
cds.setInitialPoolSize(20);
//设置最大的空闲连接数
cds.setMaxPoolSize(100);
//设置最小的空闲连接数
cds.setMinPoolSize(10);
//设置连接超时时间
cds.setCheckoutTimeout(3000);
//设置c3p0一次获取连接的数量(每次增加的)
cds.setAcquireIncrement(5);
3,通用的更新方法
public static int updateUtil(Connection conn,String sql,Object[] obj){
int i = 0;
PreparedStatement pre = null;
try {
pre = conn.prepareStatement(sql);
//循环赋值sql语句的占位符
if(obj!=null){
for(int j =0;j<obj.length;j++ ){
pre.setObject(j+1, obj[j]);
}
}
//执行sql语句
i = pre.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
TestC3P0.closeAll(conn, pre, null);
}
return i;
}
4,通用的查询方法
4-1,查询方法体
注释: Callback 为接口内
有抽象方法:public List getCallBack(ResultSet rs) ;
public static List helpQuery(Connection conn,String sql,Object[] obj,Callback back){
PreparedStatement pre = null;
ResultSet rs = null;
try {
pre = conn.prepareStatement(sql);
if(obj !=null){
for(int i = 0;i<obj.length;i++){
pre.setObject(i+1, obj[i]);
}
}
rs = pre.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return back.getCallBack(rs);
}
4-2,调用时的方法体
通过实现匿名内部类
//查询部门表
public static void selDept01()
conn = TestC3P0.getConnection();
String sql = "select * from dept01";
List list = null;
list = helpUpdate.helpQuery(conn, sql, null,new Callback() {
@Override
public List getCallBack(ResultSet rs) {
//定义一个集合装对象
List list = new ArrayList();
deptDemo d = null;
try {
while(rs.next()){
d= new deptDemo();
d.setDeptno(rs.getString("deptno"));
d.setDname(rs.getString("dname"));
d.setLoc(rs.getString("loc"));
list.add(d);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
TestC3P0.closeAll(conn, null, rs);
}
return list;
}
});
Iterator ite = list.iterator();
while(ite.hasNext()){
Object obj = ite.next();
if(obj instanceof deptDemo){
deptDemo d = (deptDemo)obj;
System.out.println(d.toString());
}
}
}
5,批处理语句
5-1用statement批处理
* statement处理批语句:
* 优点:可以任意添加不同类型的SQL语句(查询语句select除外)
* 缺点:容易出现sql注入,不能进行预处理
public void testBatch(){
//获取连接
conn = TestC3P0.getConnection();
//创建statement的对象
try {
sta = conn.createStatement();
//创建要处理的SQL语句
String sql1 = "insert into dept01 values(60,'abc','你大爷')";
String sql2 = "delete from dept01 where deptno = 40";
//把要执行的SQL语句添加到执行的载体中(sta)
sta.addBatch(sql1);
sta.addBatch(sql2);
//执行SQL
sta.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally{
TestC3P0.closeAll(conn, pre, null);
}
}
5-2用preparedstatement批处理
* preparedstatement批处理
* 优点:可以进行预处理,不需要每次都进行编译,从而提高处理效率
* 缺点:只能对同一种类型的sql进行处理
public void testBatch01(){
try {
conn = TestC3P0.getConnection();
String sql = "insert into dept01 values(?,?,?)";
pre = conn.prepareStatement(sql);
pre.setInt(1, 40);
pre.setString(2, "A");
pre.setString(3, "上海");
pre.addBatch();
//清除每个占位符的内容
pre.clearParameters();
pre.setInt(1, 70);
pre.setString(2, "B");
pre.setString(3, "北京");
pre.addBatch();
pre.clearParameters();
pre.setInt(1, 80);
pre.setString(2, "C");
pre.setString(3, "南京");
pre.addBatch();
pre.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally{
TestC3P0.closeAll(conn, pre, null);
}
}
6,事务
* 事务:把多个sql语句组织成一个工作单元,不可分割的整体
* 整个事务的操作要么都成功要么都失败
* jdbc中事务是默认开启的.执行一条sql语句就相当于一个事务,执行过后马上自动提交
* 如果要手动的控制事务:
* 1,关闭自动提交事务
* 2,开启事务
* 3,如果没有出现异常,那么最后提交事务才能生效
* 4,如果出现异常,那么就让整个事务进行回滚,使之前的操作无效
public class TestTransaction {
private static Connection conn = null;
private static PreparedStatement pre = null;
private static Savepoint sp =null;
public static void testTrans(){
try {
conn = TestC3P0.getConnection();
//检测当前连接的事务是否开启,是true,否则false
boolean b = conn.getAutoCommit();
System.out.println(b);
//1,关闭自动提交事务
conn.setAutoCommit(false);
//2.开启事务
//创建一个SQL语句
String sql = "insert into dept01 values(90,'K','KN')";
pre = conn.prepareStatement(sql);
pre.executeUpdate();
//设置保存点
sp = conn.setSavepoint();
String sql2 = "insert into dept01 values(60,'KK','KKN')";
pre = conn.prepareStatement(sql2);
pre.executeUpdate();
String sql1 = "delete from dept01 where deptno = 70";
pre = conn.prepareStatement(sql1);
pre.executeUpdate();
//手动提交事务
conn.commit();
} catch (SQLException e) {
try {
//如果出现异常就回滚所有数据
//conn.rollback();
//回滚到指定地点
conn.rollback(sp);
//并提交shiwu
conn.commit();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}