A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 zhangyiling5 于 2016-9-25 12:03 编辑

   ①.  DBCP概念(容器)、意义(提升性能);  ps:容器就是连接池

   ②.  常见的连接池:DBCPC3P0

   ③. 使用DBCP需导入4个包:
file:///C:/Users/UPA/Documents/My%20Knowledge/temp/b38743de-797b-47cc-bf59-cd05c167b52a/128/index_files/31300274.png



   ④. ResultSetHandler 结果集(用于接收select查询语句返回信息):
ArrayHandler  查询记录的第一行
ArrayListHandler  查询记录的所有行, 封装到集合中
BeanHandler  以对象的方式查询记录的第一行
BeanListHandler    以对象的方式查询记录的所有行, 封装到 LIst集合中
ColumnListHandler 查询记录的列,封装到 List集合中
ScalarHandler 查询单个数据, 如:count(*) where id > 1,  查询 id列中 大于1的个数
MapHandler   查询记录的第一行,可获取列名, 封装到Map集合中
MapListHandler  查询记录的所有行, 可获取列名,将Map集合封装 List集合中

          一. DBCP我的使用演示:

1.  数据库:
file:///C:/Users/UPA/Documents/My%20Knowledge/temp/b38743de-797b-47cc-bf59-cd05c167b52a/128/index_files/31760259.png

2.  配置文件:
file:///C:/Users/UPA/Documents/My%20Knowledge/temp/b38743de-797b-47cc-bf59-cd05c167b52a/128/index_files/31842877.png

3.  DBCP工具类:
[Java] 纯文本查看 复制代码
import java.io.FileInputStream;
import java.util.Properties;
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class DBCPUtils {
        // 创建 DBCP 核心类 BasicDataSource
        private static BasicDataSource dataSource = new BasicDataSource();
        
        // 定义为静态代码块,让DBCPUtils类一加载,就初始化 BasicDataSource
        static {
                // 声明一个配置文件集合
                Properties per = new Properties();
                
                try {
                        // 加载配置文件中的内容到Map集合中
                        per.load(new FileInputStream("dbcp.properties"));
                        
                        // 获取集合中的 键 所对应的值
                        String driverClass = per.getProperty("driverClass");
                        String url = per.getProperty("url");
                        String username = per.getProperty("username");
                        String password = per.getProperty("password");
                        
                        // 设置BasicDataSource类的初始值
                        dataSource.setDriverClassName(driverClass);
                        dataSource.setUrl(url);
                        dataSource.setUsername(username);
                        dataSource.setPassword(password);
                        
                } catch (Exception e) {
                        e.printStackTrace();
                        throw new RuntimeException("初始化失败");
                }
        }
        
        // 因为 BasicDataSource类 实现了 DataSource接口,所以这里可以使用多态,返回的实际是BasicDataSource实现类
        public static DataSource getDataSource (){
                return dataSource;
        }
}


4.  使用DBCP对数据库进行操作演示:
[Java] 纯文本查看 复制代码
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;

public class DBCP_Demo {
        
        // 因为在以下静态方法中多次用到,所以这里将 DBUtils与DBCP的核心 定义为静态成员变量
        // QueryRunner为DBUtils的核心,BasicDataSource为DBCP的核心
        public static QueryRunner qr = new QueryRunner(DBCPUtils.getDataSource());
        
        public static void main(String[] args) throws SQLException {
                //insert();
                //update();
                //select();
                //delete();
        }

        // 增
        public static void insert() throws SQLException {
                // 1.获取DBCP连接池
                //DataSource dataSource = DBCPUtils.getDataSource();
                
                // 2.向dbutils工具 核心类QueryRunner 构造中传入 DataSource 的实现类 BasicDataSource连接池(作用:使程序运行更高效)
                //QueryRunner qr = new QueryRunner(dataSource);
                
                // 3.声明sql语句
                String sql = "insert into user values (null,?,?)";
                
                // 4.执行sql语句,并返回一个行数影响值(影响了几行记录)
                int result = qr.update(sql, "zhang","12345");
                
                // 5.打印反馈的影响值
                System.out.println(result);
                
                // !连接池不用释放资源
        }
        
        // 改
        public static void update() throws SQLException{
                String sql = "update user set username = ?, password = ? where id = ?";
                int result = qr.update(sql, "michael", "54321", 1);
                System.out.println(result);
        }
        
        // 查
        public static void select() throws SQLException {
                String sql = "select username,password from user";
                // 执行sql语句,并返回匿名类所对应的结果集
                List<Object[]> list = qr.query(sql, new ArrayListHandler());
                // 获取并打印结果集中的信息
                /*for (Object[] objs : list) {
                        for (Object obj : objs) {
                                // 显示 数据库中所有的 账号、密码信息
                                System.out.print(obj+"  ");
                        }
                }*/
                
                //因为知道查询结果只有2个列名,也可以使用以下方式遍历
                for (Object[] objs : list) {
                        Object username = objs[0];
                        Object password = objs[1];
                        System.out.println("帐号:"+username+"\t密码:"+password);
                }
        }
        
        // 删
        public static void delete() throws SQLException {
                String sql = "delete from user where id = ?";
                int result = qr.update(sql, 1);
                System.out.println(result);
        }
}


1 个回复

倒序浏览
有知道怎么插入图片不显示路径名称的方法吗?
谢谢各位。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马