JDBC数据库连接池及相关练习(学习自用)
目录
一、数据库连接池
1、是什么?
2、目的?
3、作用?
4、如何创建?
二、JDBC练习
一、数据库连接池
1、是什么?
Java 数据库连接池是一种用于管理数据库连接的资源池,它允许应用程序在需要时从池中获取连接,并在使用完毕后将连接归还到池中。
2、目的?
提高数据库连接的效率和性能,减少频繁创建和关闭连接的开销。
3、作用?
-
提高性能:减少了创建和关闭连接的开销,提高了数据库操作的效率。
-
资源管理:限制了同时打开的连接数量,避免了过多的连接消耗过多的系统资源。
-
连接验证:确保从连接池中获取的连接是可用的,避免了因连接失效导致的错误。
-
简化代码:使用连接池可以简化数据库连接的管理代码,提高代码的可维护性。
4、如何创建?
这里以阿里的Druid为例:
//数据库相关信息
private static final String driverClassName="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:3306/school?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
private static final String USER="root";
private static final String PASSWORD="123456";
//创建数据库连接池对象
ds=new DruidDataSource();
//设置驱动
ds.setDriverClassName(driverClassName);
//设置最大活跃连接数量
ds.setMaxActive(5);
//设置初始连接数量(上面的最大数量要大于初始数量)
ds.setInitialSize(3);
//设置最长等待时间
ds.setMaxWait(3000);
//设置数据库相关信息
ds.setUrl(URL);
ds.setUsername(USER);
ds.setPassword(PASSWORD);
//获取链接
Connection con=ds.getConnection();
注意:关闭Connection链接时并没有真的关闭 ,而是将其返回到连接池,以供其他线程操作。
二、JDBC练习
JDBCUtil类
//数据库相关信息
private static final String driverClassName="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:3306/school?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
private static final String USER="root";
private static final String PASSWORD="123456";
//创建数据库连接池
private static final DruidDataSource ds;
private static Connection con=null;
static {
ds=new DruidDataSource();
ds.setDriverClassName(driverClassName);
ds.setMaxActive(5);
ds.setInitialSize(3);
ds.setMaxWait(3000);
ds.setUrl(URL);
ds.setUsername(USER);
ds.setPassword(PASSWORD);
}
//创建链接
public static Connection getConnection(){
if(con==null){
try {
con=ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
return con;
}
//创建预编译对象
public static PreparedStatement getPreparedStatement(Connection connection,String sql,Object...params) throws SQLException {
PreparedStatement psta=connection.prepareStatement(sql);
for(int i=0;i<params.length;i++){
psta.setObject(i+1,params[i]);
}
return psta;
}
//关闭所有链接
public static void closeAll(Connection connection, PreparedStatement psta, ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(psta!=null){
try {
psta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//关闭connection链接
public static void closeCon(){
if(con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//查询指定数据,不返回了
public static void selectGoods(String sql,Object...params){
//1、创建链接
Connection connection=getConnection();
//2、创建预编译对象
PreparedStatement psta=null;
//3、创建查询结果集
ResultSet rs=null;
//4、创建列名类
ResultSetMetaData metaData=null;
try {
psta=getPreparedStatement(connection,sql,params);
rs=psta.executeQuery();
metaData = rs.getMetaData();
//列名数量
int count=metaData.getColumnCount();
//循环遍历结果集
while(rs.next()){
Map map= new TreeMap();
for(int i=1;i<=count;i++){
//列名
String column_name=metaData.getColumnName(i);
//列值
Object val=rs.getObject(i);
map.put(column_name,val);
}
System.out.println(map.toString());
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll(null,psta,rs);
}
}
//增删改通用方法
public static int write(String sql,Object...params){
//1、链接
Connection connection=getConnection();
//2、预编译对象
PreparedStatement psta=null;
//3、返回结果值
int result=-1;
try {
psta=getPreparedStatement(connection,sql,params);
result=psta.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll(null,psta,null);
}
return result;
}
//添加数据
public static int insertGoods(String sql,Object...params){
int result=write(sql,params);
return result;
}
//修改数据
public static int updateGoods(String sql,Object...params){
int result=write(sql,params);
return result;
}
//删除数据
public static int deleteGoods(String sql,Object...params){
int result=write(sql,params);
return result;
}
Test测试类:
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int result=-1;
int type=0;
while(true){
System.out.println("欢迎使用JAVA操作数据库系统,您可以进行以下操作(数字操作)");
System.out.println("1:查询 2:插入 3:修改 4:删除 0:退出本系统");
System.out.println("请输入您的操作:");
type=scanner.nextInt();
//丢弃当前换行
scanner.nextLine();
if(type==0){
System.out.println("Bye Bye~~");
break;
}
if(type==1){
//查询数据
System.out.println("请输入您要查询的语句:");
String sql1=scanner.nextLine();
System.out.println("您要查询的结果为:");
JDBCUtil.selectGoods(sql1);
}
if(type==2){
//添加数据
System.out.println("请输入您要插入的语句:");
String sql2=scanner.nextLine();
result=JDBCUtil.insertGoods(sql2);
if(result!=-1){
System.out.println("插入成功,影响了"+result+"条数据");
}else{
System.out.println("插入失败");
}
}
if(type==3){
//修改数据
System.out.println("请输入您要修改的语句:");
String sql3=scanner.nextLine();
result=JDBCUtil.insertGoods(sql3);
if(result!=-1){
System.out.println("修改成功,影响了"+result+"条数据");
}else{
System.out.println("修改失败");
}
}
if(type==4){
//删除数据
System.out.println("请输入您要删除的语句:");
String sql4=scanner.nextLine();
result=JDBCUtil.insertGoods(sql4);
if(result!=-1){
System.out.println("删除成功,影响了"+result+"条数据");
}else{
System.out.println("删除失败");
}
}
}
}