JDBC、DBCP、C3P0、DRUID等连接数据库的方式及结果集处理的工具

# jdbc:
    导包:mysql-connector-java-5.1.37-bin.jar
    jdbc链接数据库分为六步:
    1、用反射注册驱动:Class.forName("com.mysql.jdbc.Driver");
    2、获得连接:Connection con = DriverManager.getConnection(url,username,password);
        其中:String url = "jdbc:mysql://localhost:3306/数据库名";
              String username = "root";String password = "密码";
    3、获得SQL语句的执行平台:PreparedStatement pst = con.PrepareStatement(sql);
        其中:String sql = "要执行的SQL语句";
    4、获得执行结果:ResultSet rs = pst.executeQuery();
        其中:executeQuery()方法用于执行DML操作,executeUpdate()方法用于执行DQL操作
    5、处理结果
    6、释放资源
    
#DBCP
    阿帕奇公司提供的连接池  导包 commons-dbcp-1.4.jar  但是该包里面的类依赖 commons-pool-1.5.6.jar 所以导两个包
                            同时需要导jdbc的驱动包
    数据库连接池一般只需配置好,不用创建连接,然后将一个没有连接的数据源传给一个处理结果的类
        例如:dbutils里面的QueryRunner qr = new QueryRunner(dataSource);
                           JdbcTemplate jt = new JdbcTemplate(dataSource);
        
    配置连接池对象:
    private static BasicDataSource dataSource = new BasicDataSource();

    static
    {
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/zero");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        dataSource.setInitialSize(10);  //初始化连接数
        dataSource.setMaxActive(8);  //最大连接数
        dataSource.setMaxIdle(5);    //最大空闲数
        dataSource.setMinIdle(1);  //最小空闲数

    }

    public static DataSource getDataSource()
    {
        return dataSource;
    }
    
#C3P0
    数据库连接池:导包:c3p0-0.9.5.2.jar,该包依赖 mchange-commons-java-0.2.12.jar ,也需要驱动包,配置文件用xml
    xml文件:
    <c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
      <!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/zero</property>
    <property name="user">root</property>
    <property name="password">123456</property>
    
    <!-- 连接池参数 -->
    <!--初始化申请的连接数量-->
    <property name="initialPoolSize">5</property>
    <!--最大的连接数量-->
    <property name="maxPoolSize">10</property>
    <!--超时时间-->
    <property name="checkoutTimeout">3000</property>
  </default-config>

  <named-config name="otherc3p0"> 
    <!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</property>
    <property name="user">root</property>
    <property name="password">root</property>
    
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">8</property>
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>
    获取数据库源:private static  DataSource dataSource = new ComboPooledDataSource();
    
#druid
    阿里巴巴开发的数据库连接池,效率很高 导包:druid-1.0.9.jar 同时需要驱动包。使用properties配置文件,配置文件中的健名固定
        driverClassName=com.mysql.jdbc.Driver
        url=jdbc:mysql://127.0.0.1:3306/zero
        username=root
        password=123456
        initialSize=5
        maxActive=10
        maxWait=3000
    获得数据源:
        InputStream is = DruidDemo01.class.getClassLoader().getResourceAsStream("druid.properties");
        Properties pro = new Properties();
        pro.load(is);
        DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
        
#DBUtils
    阿帕奇公司提供工具类,主要学习两个类(接口)   导包 commons-dbutils-1.6.jar
    1、Class QueryRunner  
    构造方法:QueryRunner()  
                update(con, sql, parms);DML操作,传入一个连接,sql语句和一个可变参数。可变参数是给?占位符赋值,最后需要关闭连接
                query(con, sql, new ArrayListHandler()); DQL操作,需要传递一个结果集处理对象,一共有8中结果集的处理方式
              QueryRunner(DataSource ds)
                有参构造,传入一个连接池的数据源 ,调用与无参构造的方法重载的DML,DQL方法,不需要传连接的参数,也不需要关闭
    2、Interface ResultSetHandler<T> 
    八种结果集处理方式:
    public class DBUtilsSelectTest
{
    private static Connection con = JDBCUtilsConfig.getConnection();
    public static void main(String[] args)throws Exception
    {
//        arrayHandler();
//        arrayListHandler();
//        beanHandler();
//        beanListHandler();
//        columnListHandler();
//        scalarHandler();
//        mapHandler();
        mapListHandler();
    }

    //只将结果集的第一条记录存储到Object[]中
    public static void arrayHandler()throws Exception
    {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort";
        Object[] query = qr.query(con, sql, new ArrayHandler());
        System.out.println(Arrays.toString(query));
        DbUtils.closeQuietly(con);
    }

    //只将结果集的记录存储到Object[]中,然后存放在list集合中
    public static void arrayListHandler()throws Exception
    {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort";
        List<Object[]> result = qr.query(con, sql, new ArrayListHandler());
        for (Object[] objects : result)
        {
            for (Object object : objects)
            {
                System.out.print(object+"\t");
            }
            System.out.println();
        }
        DbUtils.closeQuietly(con);
    }

    //将结果集的第一条记录封装到JavaBean对象中
    public static void beanHandler()throws Exception
    {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort";
        Sort sort = qr.query(con, sql, new BeanHandler<Sort>(Sort.class));
        System.out.println(sort);
        DbUtils.closeQuietly(con);
    }

    //将结果集的记录封装到JavaBean对象中,然后存放在List中
    public static void beanListHandler()throws Exception
    {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort";
        List<Sort> list = qr.query(con, sql, new BeanListHandler<Sort>(Sort.class));
        for (Sort sort : list)
        {
            System.out.println(sort);
        }
        DbUtils.closeQuietly(con);
    }

    //将结果集中指定列的字段值封装到List集合中
    public static void columnListHandler()throws Exception
    {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort";
        List<Object> list = qr.query(con, sql, new ColumnListHandler<Object>("sname"));
        for (Object obj : list)
        {
            System.out.println(obj);
        }
        DbUtils.closeQuietly(con);
    }

    //用于单数据的操作
    public static void scalarHandler()throws Exception
    {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT COUNT(*) FROM sort";
        Long count = qr.query(con, sql, new ScalarHandler<Long>());
        System.out.println(count);
        DbUtils.closeQuietly(con);
    }

    //将结果集的第一行存放在map集合中,其中key为列名,value为对应的值
    public static void mapHandler()throws Exception
    {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort";
        Map<String, Object> map = qr.query(con, sql, new MapHandler());
        for (String s : map.keySet())
        {
            Object value = map.get(s);
            System.out.println(s+" --> "+value);
        }
        DbUtils.closeQuietly(con);
    }

    //将结果集封装到map中,其中key为列名,value为对应的值,然后将所有的键值对封装到一个List中
    public static void mapListHandler()throws Exception
    {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort";
        List<Map<String, Object>> list = qr.query(con, sql, new MapListHandler());
        for (Map<String, Object> map : list)
        {
            for (String s : map.keySet())
            {
                Object value = map.get(s);
                System.out.print(s+"\t"+value+"\t");
            }
            System.out.println();
        }
        DbUtils.closeQuietly(con);

    }
}

#JdbcTemplate
    与dbutils类似,用于处理结果集
    Class JdbcTemplate  
    构造方法:JdbcTemplate() 
              JdbcTemplate(DataSource dataSource)
    常用方法:
        update():执行DML语句。增、删、改语句
        queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
            注意:这个方法查询的结果集长度只能是1
        queryForList():查询结果将结果集封装为list集合
            注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
        query():查询结果,将结果封装为JavaBean对象
        query的参数:RowMapper
            一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
            new BeanPropertyRowMapper<类型>(类型.class)
        queryForObject:查询结果,将结果封装为对象
            一般用于聚合函数的查询
              
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值