JDBC连接池以及动态SQL处理

复习一下:

1.先创建一个properties配置文件

ClasssName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@服务器IP:端口号:名称
user=设置的用户名
password=设置的密码
maxActive=最大连接数量
maxWait=最大等待时间

2.加载读取配置文件

package day02;

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;

/** * 该类用于管理数据库连接 * @author adminitartor * */ public class DBUtil { //数据库连接池 private static BasicDataSource ds;

static{

    Properties prop = new Properties();
    try {
        prop.load(new FileInputStream("config.properties"));
        String className = prop.getProperty("classname");
        String url = prop.getProperty("url");
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        int maxActive = Integer.parseInt(prop.getProperty("maxactive"));
        int maxWait = Integer.parseInt(prop.getProperty("maxwait"));
        //初始化连接池
        ds = new BasicDataSource();
        //将JDBC建立连接所需要的信息设置到连接池中

        //Class.forName(...)
        ds.setDriverClassName(className);

        //DriverManager.getConnection(...)
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);

        //设置连接池最大连接数
        ds.setMaxActive(maxActive);
        //设置最大等待时间
        ds.setMaxWait(maxWait);


    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


}
/**
 * 获取数据库连接
 * @return
 */
public static Connection getConnection() 
                          throws Exception{

    return ds.getConnection();
}
/**
 * 关闭给定的连接
 * @param conn
 */
public static void closeConnection(Connection conn){
    try {

        conn.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

3.处理动态的SQL

java.sql.PreparedStatement  该接口是Statement的子接口。设计目的是为了执行动态SQL语句。这样的SQL称为预编译SQL,这种SQL语句会将动态信息以"?"代替,先进行占位。然后将该SQL发送给数据库生成执行计划。然后当需要执行该SQL时,只需要将?需要的实际数据再次传递给数据库即可。
* 1:由于先将SQL语句发送给数据库,并生成了执行计划(语义已经确定),就不存在拼接SQL导致改变SQL语义(SQL注入攻击)的问题了。
* 2:由于执行计划已经生成,当大批量执行SQL时每次只需要将?表示的实际值传入,那么数据库会重用执行计划,这就减少了服务器的压力。

    Connection conn = null;
    try {
        conn = DBUtil.getConnection();

   //使用PreparedStatement
  String sql = "INSERT INTO userinfo "
  + "(id,username,password,email,nickname,account) "
  + "VALUES "
  + "(seq_userinfo_id.NEXTVAL,?,?,?,?,?)";
  PreparedStatement ps
  = conn.prepareStatement(sql);

  ps.setString(1, "liucan");
  ps.setString(2, "123456");

  ps.setString(3, "liu@qq.com");
  ps.setString(4, "hello");
  ps.setDouble(5, 5000.0);

  int d = ps.executeUpdate();
  if(d>0){
  System.out.println("插入成功!");
  }

    } catch (Exception e) {
        e.printStackTrace();
    } finally{
        if(conn != null){
            DBUtil.closeConnection(conn);
        }
    }
}`      

转载于:https://www.cnblogs.com/liumaolong/p/6080357.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值