目录
1.连接池介绍
为什么需要连接池呢?
Java程序操作数据库,必须获得一个连接Connection
实际操作中,我们要先获得连接,使用完成后还有关闭连接。这两个操作都比较耗时。
思考:那有没有什么比较方便不耗时的方法呢?当我们要用的时候只需要调用一下就ok,用完了再还回去。这样岂不是免去了【获得、关闭连接】节省了很多时间?那应该怎么实现呢?
连接池,将我们所需要的连接,放入池子里,形成公共连接。且该池子中的连接被调用时,有且只能被一个人使用,当该连接被归还时,即可恢复为公共连接,被别人重新调用。
2.druid
我用的是这个:druid-1.1.22.jar
1.将这个jar包导入项目,再建一个配置文件,内容如下:
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=a
initialSize=10
maxActive=20
maxWait=1000
initialSize为最小连接数
maxAction为最大连接数
maxWait为最长等待时间
2.建一个测试类,读取配置文件
用static框住,这样一开始就能自动·读取文件了
private static DataSource datasourse;
static {
Properties p=new Properties();
try {
p.load(new FileInputStream("src/project_2/druid.properties"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
datasourse=DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
第二种
private static DataSource datasourse;
static {
try {
//读取配置文件
InputStream inputStream =test.class.getClassLoader()
.getResourceAsStream("druid.properties");
//获取Properties对象,加载到该对象中
Properties properties = new Properties();
//获取配置文件
properties.load(inputStream);
//创建druid工厂
datasourse = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
3.获取连接池连接
调用这个方法就能获取连接了
public static Connection getconnection() throws SQLException {
return datasourse.getConnection();
}
4.更新任意一张表
public static int update(String sql,Object...args) throws SQLException {
Connection conn=null;
PreparedStatement pstmt=null;
conn=getconnection();//获取连接
pstmt=conn.prepareStatement(sql);
ParameterMetaData p=pstmt.getParameterMetaData();
//获取占位符
int count=p.getParameterCount();
//赋值
for(int i=0;i<count;i++) {
pstmt.setObject(i+1,args[i]);
}
int num=pstmt.executeUpdate();
conn.close();
pstmt.close();
return num;
}
5.查询任意一张表
public static void select(String sql,Object...args) throws SQLException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
Connection conn=getconnection();
PreparedStatement pstmt=conn.prepareStatement(sql);
ParameterMetaData ptmd=pstmt.getParameterMetaData();
int count=ptmd.getParameterCount();
for(int i=0;i<count;i++) {
pstmt.setObject(i+1, args[i]);
}
ResultSet rs=pstmt.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
int col=rsmd.getColumnCount();
//System.out.println("列数"+col);
String []name=new String[col];
for(int i=0;i<col;i++) {
name[i]=rsmd.getColumnName(i+1);
}
int sum=0;
while(rs.next()) {
for(int i=0;i<col;i++) {
Object value=rs.getObject(name[i]);
System.out.print(value+"\t");
}
System.out.println();
sum++;
}
System.out.println("一共查到"+sum+"条数据");
conn.close();
pstmt.close();
rs.close();
}
6.删除
public static int delete(String sql,Object...args) throws SQLException {
Connection conn=getconnection();
PreparedStatement pstmt=conn.prepareStatement(sql);
ParameterMetaData ptmd=pstmt.getParameterMetaData();
int count=ptmd.getParameterCount();
for(int i=0;i<count;i++) {
pstmt.setObject(i+1, args[i]);
}
int result=pstmt.executeUpdate();
return result;
}
7.测试
public static void main(String[] args) throws SQLException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
int sum=update("update stu set sage=? where sid=?",60,1);
System.out.println("成功修改"+sum+"条数据");
select("select * from stu where sid=?",1);
int sum1=delete("delete from stu where sid=?",1);
System.out.println("成功删除"+sum+"条数据");
}