web_day10 dbcp c3p0 dbutils

create database mydb character set utf8;
alert database mydb character set utf8;

1.自定义连接池为了不去经常创建连接和释放对象而占用大量资源

-----JdbcTool3 -----------获得connection(通过·)和释放资源------------
public class JdbcTool3 {
    private static String drive;
    private static String sql;
    private static String username;
    private static String passord;
    static {
        try {
            ClassLoader classLoader = JdbcTool3.class.getClassLoader();
            InputStream input = classLoader.getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(input);
            drive = properties.getProperty("driver");
            sql = properties.getProperty("url");
            username = properties.getProperty("username");
            passord = properties.getProperty("psaaword");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection connection() {
        try {
            Class.forName(drive);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Connection con = null;
        try {
            con = DriverManager.getConnection(sql, username, passord);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return con;
    }
    public static void relese(Statement sta, Connection con, ResultSet res) {
        if (res != null) {
            try {
                res.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (sta != null) {
            try {
                sta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
---------有了conn之后便是创建几个放入连接池,在使用完后同样回收到连接池---
implements 是重写接口所以需要全部覆盖
public class MyDatasource implements DataSource{
    
private static LinkedList<Connection> pool=new LinkedList<>();
    static{
        Connection conn=null;
        for (int i = 0; i < 5; i++) {
            conn=JdbcTool3.connection();
            pool.add(conn);
        }
    }
    /**放回池中
     * @param conn
     */
    public static void backConnection(Connection conn) {        
        pool.add(conn);
    }
    @Override
    public Connection getConnection() throws SQLException {
        if (pool.size()==0) {
            Connection conn=null;
            for (int i = 0; i < 5; i++) {
                conn=JdbcTool3.connection();
                pool.add(conn);
            }
        }
        return pool.remove(0);
    }
  • 修饰者设计模式:为了将.close修改成把链接放回连接池而不是释放
--------修改原本的功能重写一个类继承connection,为了修改.close方法--------
因为实例化所以同样需要重写prepareStatement方法
public class ColectionMackClose implements Connection {

    private static LinkedList<Connection> pool;
    private static Connection con;

    public ColectionMackClose(Connection con, LinkedList<Connection> pool) {
        this.pool = pool;
        this.con = con;
    }
    @Override
    public void close() throws SQLException {

        pool.add(con);
    }
    @Override
    public PreparedStatement prepareStatement(String sql) throws SQLException {
        return con.prepareStatement(sql);
    }
----------获得con之后用新的类ColectionMackClose 包装得到重写的con---------
public class MyDatasource1 implements DataSource{
    
    private static LinkedList<Connection> pool=new LinkedList<>();
    static{
        Connection conn=null;
        for (int i = 0; i < 5; i++) {
            conn=JdbcTool3.connection();
            ColectionMackClose myCollection = new ColectionMackClose(conn, pool);
            pool.add(myCollection);
        }
    }
    @Override
    public Connection getConnection() throws SQLException {
        if (pool.size()==0) {
            Connection conn=null;
            for (int i = 0; i < 5; i++) {
                conn=JdbcTool3.connection();
                ColectionMackClose myCollection = new ColectionMackClose(conn, pool);
                pool.add(myCollection);
            }
        }
        return pool.remove(0);
    }

2.c3p0连接池,使用较多

  • 导包
    从SourceForge 网站下载最新的版本
    http://sourceforge.net/projects/c3p0/
    出现找不到或无法加载主类 cn.fb.textDatasource.C3p0Text,从项目文件夹.path文件中删除多余路径
    注意添加两个文件c3p0-0.9.5.2.jar和mchange-commons-java-0.2.11.jar(有时候没mchange也行,和版本有关?)
图片.png
------c3p0-config.xml名称唯一放在scr下-----
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql:///web09</property>
    <property name="user">root</property>
    <property name="password">0616</property>
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">20</property>
  </default-config>
  
  <named-config name="text">
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql:///web09</property>
    <property name="user">root</property>
    <property name="password">0616</property>
  </named-config>
  

</c3p0-config>
------c3p0会自动获取xml文件配置---使用set方法设置也行---
public class C3p0Utiles {
private static ComboPooledDataSource datasourse=new ComboPooledDataSource("text");如果没参数会自动加载default
public static ComboPooledDataSource getCombpdatasource() {
    return datasourse;
    
}
public  static  Connection getCon() {
    try {
        return datasourse.getConnection();
    } catch (SQLException e) {

    
    throw new RuntimeException(e);
    }
}
}
-----------text----------------
public  void textadd2() {
        Connection con = null;
        PreparedStatement pst = null;
        try {
            con =C3p0Utiles.getCon();
            String sql = "insert into product values(?,?,?,null)";
            pst = con.prepareStatement(sql);
            pst.setString(1, "p022");
            pst.setString(2, "云河2");
            pst.setDouble(3, 30);
            int row = pst.executeUpdate();
            if (row > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            JdbcTool3.relese(pst, con, null);
        }
    }

3.dbcp

图片.png

同样使用.properties文件,BasicDataSourceFactory创建

private static DataSource dataSource;
    static {
        try {
            InputStream input = DbcpUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties pro = new Properties();
            pro.load(input);
            dataSource = BasicDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public static DataSource  getdatasource() {
        return dataSource;
    }
    public  static  Connection getconnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
-------------properties----放在src下-----------
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web09?useUnicode=true&characterEncoding=utf8
username=root
psaaword=0616

4.dbutils

图片.png
MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
BeanListHandler:多行处理器!把结果集转换成List<Bean>;
ColumnListHandler:多行单列处理器!把结果集转换成List<Object>,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
--------------------------------------------
@Test
    public void fun1() throws SQLException {
        DataSource ds = JdbcUtils.getDataSource();
        QueryRunner qr = new QueryRunner(ds);
        String sql = "select * from tab_student where number=?";
        Map<String,Object> map = qr.query(sql, new MapHandler()[把一行记录转换成一个Map,其中键为列名称,值为列值], "S_2000");
        System.out.println(map);
    }
    
    @Test
    public void fun2() throws SQLException {
        DataSource ds = JdbcUtils.getDataSource();
        QueryRunner qr = new QueryRunner(ds);
        String sql = "select * from tab_student";
        List<Map<String,Object>> list = qr.query(sql, new MapListHandler()[把转换集转换成List<Map>,其中每个Map对应一行记录]);
        for(Map<String,Object> map : list) {
            System.out.println(map);
        }
    }
    
    @Test
    public void fun3() throws SQLException {
        DataSource ds = JdbcUtils.getDataSource();
        QueryRunner qr = new QueryRunner(ds);
        String sql = "select * from tab_student where number=?";
        Student stu = qr.query(sql, new BeanHandler<Student>(Student.class)[把结果集转换成一个Bean对象,在使用BeanHandler时需要指定Class,即Bean的类型], "S_2000");
        System.out.println(stu);
    }
    
    @Test
    public void fun4() throws SQLException {
        DataSource ds = JdbcUtils.getDataSource();
        QueryRunner qr = new QueryRunner(ds);
        String sql = "select * from tab_student";
        List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class));[需要将列名化为属性把结果集转换成List<Bean>,其中每个Bean对应一行记录]
        for(Student stu : list) {
            System.out.println(stu);
        }
    }
    
    @Test
    public void fun5() throws SQLException {
        DataSource ds = JdbcUtils.getDataSource();
        QueryRunner qr = new QueryRunner(ds);
        String sql = "select * from tab_student";
        List<Object> list = qr.query(sql, new ColumnListHandler("name")[多行单例处理器,即获取name列数据]);
        for(Object s : list) {
            System.out.println(s);
        }
    }
    
    @Test
    public void fun6() throws SQLException {
        DataSource ds = JdbcUtils.getDataSource();
        QueryRunner qr = new QueryRunner(ds);
        String sql = "select count(*) from tab_student";
        Number number = (Number)qr.query(sql, new ScalarHandler()[单行单列处理器,一般用于聚合查询,在使用ScalarHandler时可以指定列名,如果不指定,默认为第1列。]);
        int cnt = number.intValue();[对聚合函数的查询结果,有的驱动返回的是Long,有的返回的是BigInteger,所以这里我把它转换成Number,Number是Long和BigInteger的父类!然后我再调用Number的intValue()或longValue()方法就OK了。]
        System.out.println(cnt);
    }
@Test
    public void add() {
        try {
            QueryRunner qr = new QueryRunner(C3p0Utiles.getCombpdatasource());
            String sql = "insert into product values(?,?,?,null);";
            Object[] product = { "p017", "抱抱", 2000 };
            int row = qr.update(sql, product);
            if (row > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • MySQL远程登录 MySQL MAC5.7.17及以上版本中文显示乱码问题 若编码信息如图,则无需设置。若dat...
    PengFly阅读 763评论 0 0
  • 1.连接池思想 为什么必须使用数据库连接池: 普通的JDBC数据库连接(Connectiond对象)使用 Driv...
    贾里阅读 865评论 0 0
  • 声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互...
    凯哥学堂阅读 1,041评论 0 0
  • 前段时间公司内部博客上凯哥分享了一篇关于mysql字符集编码的文章,之前我对mysql字符集一块基本没有深究过,看...
    __七把刀__阅读 6,436评论 14 18
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139