关于java基础--连接池与通用的操作数据库更新方法


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(connnull, 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(connprenull);

}

}

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(connprenull);

}

}

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

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值