javaweb-03之数据库连接池

数据库连接池的概念:其实就是一个容器(集合),存放数据库连接的容器。

当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器,

好处:节约资源,用户访问高效,

实现:

标准接口:DataSource   javax.sql包下的

               方法:

                      获取连接:getConnection()

                      归还连接:Connection。close(),如果连接对象Connection是从连接中获取的,那么调用Connection。close()方法,则不会再关闭连接,而是归还,

一般我们不去实现它,由数据库厂商来实现。

c3p0连接池技术实现:

一:

导入jar包(两个)c3p0-0.9.5.2.jar   mchange-commans-java-0.2.12,jar,不要忘记导入驱动包,一共3个包

二:定义配置文件

名称:c3p0.properties  或者c3p0-config.xml

 路径:直接将文件放在src目录下即可

<c3p0-config>

    <!--默认配置-->

    <default-config>

        <property name="driverClass">com.mysql.jdbc.Driver</property>

        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property>

        <property name="user">root</property>

        <property name="password">root</property>

        <!-- initialPoolSize:初始化时获取三个连接,          取值应在minPoolSize与maxPoolSize之间。 -->

        <property name="initialPoolSize">5</property>

        <!-- maxIdleTime:最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。-->

        <property name="checkoutTimeout">3000</property>

        <!-- maxPoolSize:连接池中保留的最大连接数 -->

        <property name="maxPoolSize">10</property>

        <!-- minPoolSize: 连接池中保留的最小连接数 -->

        <property name="minPoolSize">3</property>

    </default-config>

    <!--配置连接池mysql-->

    <named-config name="otherc3p0">

        <property name="driverClass">com.mysql.jdbc.Driver</property>

        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property>

        <property name="user">root</property>

        <property name="password">root</property>

        <property name="initialPoolSize">5</property>

        <property name="maxIdleTime">30</property>

        <property name="maxPoolSize">8</property>

        <property name="minPoolSize">6</property>

        <property name="checkoutTimeout">3000</property>

    </named-config>

    <!--配置连接池2,可以配置多个-->

</c3p0-config>

三:创建核心对象,CombopooledDataSource

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class c3p0demo01 {
   
public static void main(String[] args) throws SQLException {
       
//1,创建数据库连接池对象
       
DataSource ds=new ComboPooledDataSource();
       
//2,获取连接对象
       
Connection  conn=ds.getConnection();
       
//3,打印
       
System.out.println(conn);

    }
}

--------------------------------------------------------------------

druid基本使用:

配置文件:db.propertis

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/db2

username=root

password=root

initialSize=5

maxActive=20

maxWait=2000

需要先获取连接池配置文件

  1. 获取数据库连接池对象:通过工厂来获取,DruidDataSourceFactory
  2. 获取连接

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class druid01 {
   
public static void main(String[] args) throws Exception {
       
//1,导入jar包,2,
        // 2,
定义配置文件
       
//3,加载配置文件
       
Properties pro = new Properties();
       
InputStream is = druid01.class.getClassLoader().getResourceAsStream("druid.properties");
       
pro.load(is);
       
// 4,获取连接词对象
       
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
       
//5获取连接
       
Connection conn = ds.getConnection();
       
System.out.println(conn);
    }

}

简化书写:定义一个druid工具类

定义一个类JDBCUtils

 提供静态代码块加载配置文件,初始化连接池对象

提供方法

      获取连接方法,

      释放资源

获取连接池的方法

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCutils10 {
   
//1,定义成员变量DataSource
   
private  static DataSource ds;
   
static {
       
try {
           
//1,加载配置文件
           
Properties   pro=new Properties();
           
pro.load(JDBCutils10.class.getClassLoader().getResourceAsStream("druid.properties"));
           
//2.获取DataSource
           
ds= DruidDataSourceFactory.createDataSource(pro);
        }
catch (IOException e) {
            e.printStackTrace();
        }
catch (Exception e) {
            e.printStackTrace();
        }
    }
   
//获取链接
   
public static Connection  getconnection() throws SQLException {
       
return ds.getConnection();
    }
   
//释放资源
   
public static  void  close(Statement stmt,Connection  conn){
       
if(stmt!=null){
           
try{
                stmt.close();
            }
catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
       
if(conn!=null){
           
try{
                conn.close();
            }
catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
   
public static  void  close(ResultSet rs, Statement stmt, Connection  conn){
       
if(rs!=null){
           
try{
                rs.close();
            }
catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
       
if(stmt!=null){
           
try{
                stmt.close();
            }
catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
       
if(conn!=null){
           
try{
                conn.close();
            }
catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
   
//获取连接词的方法
   
public static DataSource getDataSource(){
       
return  ds;
    }
}

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

//使用工具类
public class druid10 {
   
public static void main(String[] args) {
     
//添加一条操作
       
Connection  conn=null;
       
PreparedStatement  pstmt=null;


     
try{
         
//1,获取连接
         
conn=JDBCutils10.getconnection();
         
//2,定义sql
         
String   sql="insert  into   account  values(null,?,?)";
         
//获取pstmt对象
         
pstmt=conn.prepareStatement(sql);
         
//赋值
         
pstmt.setString(1,"张飞");
          pstmt.setDouble(
2,2000);
         
//5,指向sql
         
int count = pstmt.executeUpdate();
         
System.out.println(count);
      }
catch (SQLException throwables) {
          throwables.printStackTrace();
      }
finally {
         
JDBCutils10.close(pstmt,conn);

      }
    }
}

------------------------------------------------------------------

spring jdbc:

spring框架对jdbc的简单封装,提供了一个jdbctemplate对象简化jdbc的开发,

步骤:

  1. 导入jar包
  2. 创建jdbctemplate对象,依赖于数据源DataSource

jdbctemple   template=new  jdbctemplate(ds);

       3,调用jdbctemplate的方法来完成CRUD的操作

 *update():执行增删改查

                     *queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value,将这条记录封装成一个集合。

           注意:  这个方法查询的结果集长度只能是  1

*queryForlist():查询结果将结果集封装为List集合

  注意:将每一条记录封装成一个map集合,再将map集合装载到list集合中

*query():查询结果将结果集封装为JavaBean对象

query():的参数:RowMapper

  一般我们使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装

  new BeanPropertyRowMapper<类型>(类型.class)

*queryForobject():查询结果将结果集封装为对象

  一般用于聚合函数的查询。

import cn.cast.jdbc.druid.JDBCutils10;
import org.springframework.jdbc.core.JdbcTemplate;

public class Templatedemo01 {
   
public static void main(String[] args) {
       
//1-导入jar
       
//2-创建Template对象
       
JdbcTemplate  template=new JdbcTemplate(JDBCutils10.getDataSource());
       
//3-调用方法
       
String sql="update account    set salary=50   where  id=?";
       
int count=template.update(sql,3);
       
System.out.println(count);
    }
}

实例练习:

import cn.itcast.demo.Emp;

import cn.itcast.utils.jdbcutils01;

import org.junit.Test;

import org.springframework.jdbc.core.BeanPropertyRowMapper;

import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

import java.util.Map;

public class template111 {

    private JdbcTemplate template=new JdbcTemplate(jdbcutils01.getDataSourec());

    //junit单元测试,可以让方法独立运行

//  /1- 修改1号记录数据的salary为100

    @Test

    public  void test1(){

       // JdbcTemplate template=new JdbcTemplate(jdbcutils01.getDataSourec());

        // 3调用方法

        String sql="update  emp set salary=15000 where  id=1";

        int count=template.update(sql);

        System.out.println(count);

    }

//2-     添加一条记录

    @Test

    public void test2(){

      String sql="insert  into emp(id,name,salary) values(?,?,?)";

      int count=template.update(sql,18,"鬼精",10000);

        System.out.println(count);

    }

//3-     删除刚才添加的记录

@Test

public void test3(){

    String sql="delete from emp where id=?";

    int count=template.update(sql,18);

    System.out.println(count);

}

//4-     查询id为1的记录,将其封装为map集合

@Test

public void test4(){

    String sql="select * from emp where id=?";

    Map<String,Object> map=template.queryForMap(sql,1);

    System.out.println(map);

}

//5-     查询所有的记录,封装成list

@Test

public void test5(){

    String sql="select * from emp ";

    List<Map<String,Object> > list=template.queryForList(sql);

   for(Map<String,Object> ss:list){

       System.out.println(ss);

   }

}

//6-     查询所有的记录,将其封装成emp对象的集合

@Test

public void test6(){

    String sql="select * from emp ";

    List<Emp> list=template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));

    for(Emp  ee:list){

        System.out.println(ee);

    }

}

//7-     查询总记录数

@Test

public void test7(){

    String sql="select count(id) from emp ";

    Long  total=template.queryForObject(sql,Long.class);

    System.out.println(total);

}

}

总结:这里一共记录了两个数据库连接池的使用,一个jdbctemplate的使用。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值