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