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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 厦门校区   /  2018-5-28 17:29  /  6390 人查看  /  53 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

吴鹏
总结

------------------------------------------------------------------
一 连接池:
顾名思义,用来放连接的池子,在程序加载的时候,预先将一些连接放在一个"池子"里,在使用的时候调用,用完再放回池子里;
以往使用连接的做法是,使用的时候创建连接对象,用完了以后再进行销毁,而当使用的连接很多时,创建和销毁连接需要的时间
会非常多,因此使用连接池,使用的时候调用连接,用完了后再放回连接池,大大节省了时间,提高了程序执行的效率;

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

二 C3P0:
1 使用之前,需先把c3p0的jar包导入到项目中;
2 创建C3P0的对象,通过手动或读取配置文件信息,都可以加载驱动,读取库文件和输入用户名及密码:
ComboPooledDataSource dataSource = new ComboPooledDataSource();
若使用手动加载信息的方法:
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setjdbcUrl("数据库所在的位置");
dataSource.setUser("数据库的用户名");
dataSource.setPasswore("数据库的密码");

而加载配置文件来加载信息的话,在创建ComboPooledDataSource()对象的时候,程序就会在src目录下寻找
默认的加载文件,c3p0-config.xml,需要注意的是,配置文件里面的内容的键是固定的,不能自己乱取名,否则
无法识别,
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        //加载驱动,要写上驱动的全类名;
        <property name="jdbcUrl">jdbc:mysql:///test</property>
        //数据库的地址;
        <property name="user">root</property>
        //数据库的用户名;
        <property name="password">wp</property>
        //数据库的密码;
        <property name="initialPoolSize">5</property>
        //连接库初始的连接数目;
        <property name="minPoolSize">5</property>
        //默认最小的连接数目;
        <property name="maxPoolSize">20</property>
        //连接库中最多有几个连接;
    </default-config>
以上为配置文件的范本,必须按以上格式;

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

Druid:
是一个连接池,使用方法与C3P0类似,也分为手动输入信息和读取配置文件信息;
同样的,需要导入druid的jar包;
创建对象:
DriudDataSource dataSource = new DruidDataSource();
手动输入调用的方法与c3p0类似:
dataSource.setDriverClassName("驱动的全类名");
dataSource.setUrl("数据库地址");
dataSource.setUsername("用户名");
dataSource.setPassword("密码");

读取文件,是通过创建Preperties对象,调用其方法,通过字节输入流读取配置文件:
Properties properties = new Properties();
properties.load(new FileInputStream("src/配置文件"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
后面可以直接获得连接对象,执行操作等;

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

三 DBUtils:
是一个工具类,封装了JDBC的代码,大大简化了代码的输入,增强了开发的效率;
它是由阿帕奇提供的一个工具类库,在使用之前,也需要导入DBUtils的jar包;
核心运行类:QueryRunner()
构造方法:
无参:QueryRunner()
有参:QueryRunner(DataSource ds)

方法:
int update(String sql,Object...params);
传入一个sql语句,和若干个可变参数的值,返回值是int类型,代表了改变(增,删,改)的行数;

int update(Connection conn,String sql,Object...params);
传入一个连接对象,一个sql语句,和若干个的可变参数的值,返回值是int类型,代表了改变(增,删,改)的行数;

T query(String sql,ResultSetHandler<T> rsh,Object...params);
传入一个sql语句,一个rsh集合,若干个可变参数的值;

T query(Connection conn,String sql,ResultSetHandler<T> rsh,Object...params);
传入一个连接对象,一个sql语句,一个rsh集合,若干个可变参数的值;

在一般情况下,如果执行增删改查操作:
构造:
有参:QueryRunner(DataSource ds)

方法:
int update(String sql,Object...params);
传入一个sql语句,和若干个可变参数的值,返回值是int类型,代表了改变(增,删,改)的行数;

T query(String sql,ResultSetHandler<T> rsh,Object...params);
传入一个sql语句,一个rsh集合,若干个可变参数的值;

如果有事务管理的话:
构造:
无参:QueryRunner()

方法:
int update(Connection conn,String sql,Object...params);
传入一个连接对象,一个sql语句,和若干个的可变参数的值,返回值是int类型,代表了改变(增,删,改)的行数;

T query(Connection conn,String sql,ResultSetHandler<T> rsh,Object...params);
传入一个连接对象,一个sql语句,一个rsh集合,若干个可变参数的值;

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

四 JDBC、JDBCUtils、C3P0、Druid、DBUtils:

JDBC是一套完整的接口规范的API,规范了java与数据库的连接;
JDBCUtils是把JDBC中重复的代码抽取出来的一个工具类;
C3P0是一个连接池;
Druid是一个连接池;
DBUtils是一个封装了JDBC的工具类,由阿帕奇组织提供的,旨在简化代码,提高编程的效率;


回复 使用道具 举报
2902 初级黑马 2018-5-29 10:12:27
42#
今天学习了事务,连接池,dubt;
事务有三个步骤,开启事务,就是不让系统自动提交,通过connection对象setAutoCommit(flase);来设置手动提交
操作多条sql语句;全部执行为出错,则通过connection对象.commit来结束事务 保存数据,如果执行sql语句过程
中有错误发生则通过捕获异常,在catch中回滚事务,让数据库回到开始事务的状态,结束事务;这三个方法都要用同一
个connection对象;
连接池,为了不让每次访问数据库都创建一个新的连接池,使用完后就销毁,我们学习了连接池,提高了运行效率,连接池
在数据加载时就初始化好多个连接对象,访问者访问直接在连接池取一个连接对象,实现数据访问,完成后将连接对象归
还到连接池,这样避免了大量创建和销毁连接对象的情况发生.主要我们学习c3p0连接池.
回复 使用道具 举报
本帖最后由 1748341437 于 2018-5-29 10:28 编辑


2018/5/28 林玮

今天学了三个知识,一是事务,二是连接池,三是DBUtils工具类,最后还拓展了一个知识--开源连接池C3P0(据说以后工作会经常用到);

事务呢是逻辑上的一组操作,而这组操作要么全部成功要么全部失败,他有三个方法都是
通过connection对象创建出来的,而添加了这三个方法的代码就是一组事务了.
第一个方法:conn.setAutoCommit(false);--开启事务,顾名思义主要用于开启事务,
要注意的一点是括号里加false是只开启不自动提交,反之则是开启并自动提交;
第二个方法:conn.commit();--提交事务,如果开启事务自动提交了事务了的话就
不用写这个方法了,但这样写不好,所以我们还是用手动提交事务的方法.
的三个方法:conn.rollback();--回滚事务,如果代码里有错误,他就可以回滚到开始的
一个状态.由于他本身就有异常,所以要用try--catch()封装一下;
注意事项:1.事务的连接对象必须是同一个连接对象;2.不能不写提交事务;
连接池是一个类,可以储存连接到内存内存中.我们可以自定义连接池类但是不够完善,所以就了解了一个开源连接池.在没学连接池的时候,我们如果要用到连接池了,就创建连接池,然后销毁(释放资源),这是一个很浪费资源的方法,如果有100万个用户我们就要创建100万个连接对象了.学完连接池就不一样了,当用户使用到连接的时候从连接池中去拿,用完归还回去,供其他用户使用.这样就会形成一个循环不用再我们自己一直创建那么多的连接对象,再销毁;我们在用它的时候,它创建的连接池对象有一个下限和一个上限,都是我们自己给定的,这个不重要,有多少个同时使用连接的用户就设置多少个...
DBUtils工具类呢,好像没什么好讲的,顾名思义嘛.就是jdbc的一个工具类用于简化代码的;
主要就是后面的那个开源连接池C3P0了,其实除了C3P0还有一个Druid开源连接池,这个不重要了解一下就好,因为以后主要就用C3P0的.由于开发项目啥的都要用到C3P0,所以这个还是蛮重要的;当然是用C3P0之前肯定是有准备工作的,在使用它之前得先导jar包,还要导一个后缀民为.xml的配置文件(注意文件名不能改,我们现在导的是c3p0-config.xml就是这个"c3p0-config"不能改导进去是什么就是什么),然后就可以开始使用了;

今天讲的东西不多但是逻辑比较强,不同以往傻瓜式记忆,所以以后写代码时也要多加思考了;
回复 使用道具 举报
凌辉:
今天主要要掌握C3P0的用法和DBUtils的使用
为了不浪费资源我们要先创建连接池的工具类,
在C3P0调用连接池的连接,
在DBUtils核心类调用连接池,
要多使用几次,记熟练
回复 使用道具 举报
吴俊斌
一.事务管理的三个方法: 一个事务开启,setAutoCommit(Boolean AutoCommit)也就是在开头把自动提交改为手动提交
第二个是提交commit()在代码没有异常的情况下执行  第三个是回滚rollBack()在代码报错的时候执行,退回事务开启时候的状态

二.自定义常量池
   1.一个类实现DataSource接口,重写获得连接的方法,思路先创建一个不能被修改的集合泛型是连接对象,在构造方法里给它添加
几个连接,在获得连接方法里通过集合的remove()得到连接对象,不用get()的原因是因为不方便归还
   2.还要添加一个归还的方法,就是用户在调这个方法的时候传一个连接对象过来,在添加到集合中.但是这样用户就要多记很多
方法,我们可将连接.close的方法改为归还的方法,因为connection是接口,我们要使用装饰者模式就是创建一个类去实现connection
接口,在创建一个包装类,在构造方法把connection对象传过来,这样我们的包装类就有了.close方法,在将里面的方法替换成归还就好了

三.Druid和c3p0开源连接池
  这两个使用方法差不多,都有两种方式.都是先要导包,创建对象,但是C3P0更为简单,第一种方式都一样都有手动设置通过对象加载驱动,
路径,账号,密码   第二种方式就不同了,druid配置环境变量的内容不能乱改,文件名可以随意写,路劲也可随便放.C3P0的文件名,路径,还有
文件内容都是固定的不能乱改.使用上也不同,Druid需要通过对象.load(输入流找到配置文件),而C3P0直接创建对象就搞定了

四.DBUtils
    这是一个工具类库,使用的时候的需要创建queryrunner对象需传一个连接池对象,使用update的增删改,使用query查询
回复 使用道具 举报
                                JDBC高级
批处理操作
        可以将一批SQL语句一起执行
基本使用
        添加批处理
                addBatch();
        执行批处理
                executeBatch();
        清空批处理
                clearBatch();
        为了防止批处理时产生内存溢出 应设置条件每隔一个时间段执行批处理 并清空批处理

                               
                                        JAVA操作事务
管理事务
        1 开启事务        setAutoCommit(false) 关闭事务自动提交功能
        2 提交事务: 没有问题的时候→数据生效,事务结束        commit()
        3 回滚事务: 有问题的时候→数据不生效,回滚事务        rollback();
                连接事务的对象必须为同一对象


                                        连接池
概述
        相当于一个装有连接的容器,使用连接的话,可以从连接池中进行获取,使用完成之后将连接归还给连接池.
        在服务器初始化时就初始化一些连接.把连接放入内存中,使用的时候从内存中获取,使用完成后归还给连接池.
作用
        提升性能 减少连接对象的创建和销毁


                                        自定义连接池
接口 DataSource
        1 实现接口 DataSource
        2 初始化多个连接
                创建list集合存储连接对象
                在空参构造中给集合添加连接对象
        3 重写getConnection方法               
                删除集合中第0个元素 return删除的元素对象(防止同一个连接对象重复被调用)       
        4 编写归还连接方法
                给集合添加传入的连接对象

问题及解决
        问题
                创建连接池对象 不方便程序的扩展       
                额外提供自定义方法提高了使用难度
        解决
                将close方法重写为归还方法(增强一个类中的方法)
                        1 采用继承的方式 重写父类的方法(使用条件:必须能够创建父类对象)
                        2 装饰者模式
                                使用条件 1 包装类和实现类要实现相同的接口
                                              2  包装类中获得实现类的引用(包装类中使用了实现类的对象)
                                为了简化编程 提供一个模版类(模版类继承接口的所有方法 需要全部重写)
                                        让包装类继承模版类 包装类有参构造 传入接口子对象和集合对象 将close方法改为归还方法
                        改写工具类的获得连接对象方法
                                创建包装类对象 传入连接对象和集合 增强close方法 返回增强后的连接对象



                                        Druid连接池
概述
        阿里旗下的开源连接池产品,可以与Spring框架进行快速整合.
        引入jar包和连接池驱动
使用1(手动方式)
        获取连接池对象 new DruidDataSource
        手动设置参数 dataSource.set

使用2(配置方式)
        属性文件中的key不可改变
        创建配置文件对象 new Properties
        读取配置文件 p.load(new ReaderFile)
        创建连接对象 DruidDataSourceFactory.create(P)

       
                                        C3P0开源连接池
引入jar包
使用1(手动方式)
        创建连接池  new ComboPooledDataSource
        设置参数        cbo.set
       
使用2(配置文件)
        在src路径下创建配置XML文件 文件名必须为(c3p0-config.xml) 配置连接池
        创建连接池 new ComboPooledDataSource 会默认去查找c3p0-config文件 之后即可直接使用


                                        改写工具类
创建 private final连接池对象
创建 获取连接对象方法
创建 获取连接池方法


                                        DbUtils
概念
        对JDBC进行了简单封装的开源工具类库 简化了JDBC的编程


QueryRunner 核心运行类
方法
        update(sql,可变参数) 增删改
        query(sql,可变参数)        查询
       
增删改操作
        创建QueryRunner运行类对象
        使用update传入SQL语句进行操作
查询操作
        创建QueryRunner运行类对象
        使用query传入SQl语句 匿名ResultSetHandler对象 泛型java类
        查询一条记录 获取数据赋值给java类中的成员变量
        查询多条数据 创建集合 泛型java类 创建java类对象 赋值 添加到集合中
        遍历集合 打印所有java类对象(需要重写toString方法)
回复 使用道具 举报
本帖最后由 凉面要趁热吃 于 2018-5-30 09:01 编辑

黄进安:

1.      事务的批量处理
l  使用了voidaddBatch(String sql) 执行SQL命令
l  使用了int[]executeBatch()  对这些执行命令进行批量处理,全部执行成功返回更新计数组成的数组
2.      JDBC的连接对象进行事务管理
通过连接对象获取:事务的开启,提交和回滚
开启: 连接对象.setAutoCommit(false); false部让事务自动提交
提交: 连接对象.commit();
回滚: 连接.rollback(); 置于catch语句中,即事务出现异常时回滚事务
3.      自定义连接池用到了一种设计模式: 装饰者模式
--->装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能
l  装饰对象和真实对象有相同的接口
l  将真实对象传递到装饰对象的构造方法中,实现对真实对象的引用
l  在装饰对象中对需求的方法进行重写操作,完成我们需要的功能需求
4.    对c3p0连接池的使用:
l  如果使用配置文件的方式,配置文件名c3p0-config.xml 不可随意更改且必须放在当前项目的src文件夹下,因为在连接池对象ComboPooledDataSource的底层源代码中已经设置好了文件的指定路径及其文件名,同理里面定义的一些变量名也不能更改.
l  优化工具类:在工具类中创建连接池对象ComboPooledDataSource,使用静态修饰,使其仅随工具类的加载而创建一次;抽取创建获取连接池和连接的方法
5.    使用DBUtils工具类:
l  获取核心类: QueryRunner(连接池对象);
l  通过核心类对数据库进行CRUD操作的方法: intupdate(“SQL执行语句?,?”,Object… args);即底层代码使用的是PrepareStatement预编译的 SQL 语句的对象

回复 使用道具 举报
邵倩


Connection 有两个作用:创建连接和管理事务.
事务是一组操作,这组操作的各个组成部分 要么全成功,要么全失败.
conn.setAutoCommit(false); 开启事务,false确保事务不能自动提交----获取连接后
conn.commit(); 提交事务---sql语句执行完后
conn.rollback(); 回滚事务---catch到异常后


连接池
装连接对象的容器.
创建和销毁连接对象需要耗费时间,而连接池可以实现在服务器初始化的时候就初始化一些连接,并放入内存中,要用的时候从内存中获取,使用完成后放回连接池,从内存获取和归还的效率远高于创建和销毁.
连接池对象被创建的时候 连接也会创建 而且是多个.

自定义连接池 emmmm...不重要,因为以后也不用自己写连接池,而是借用一些开源连接池产品如Druid或C3P0等.


Druid
手动设置参数的方式不用掌握,主要学习配置文件方式设置参数
Druid配置方式可以使用属性文件配置
文件名没有规定但是属性文件中的key是一定的,如driverClassName=... ,url=...

C3P0
一个开源的JDBC连接池,目前使用最多的连接池
配置文件的路径/名称/name属性都不能随意写,大小写都要严格按照要求写,只能放在src下,文件名c3p0-config.xml
开发步骤:
1.导入mysql驱动包和c3p0的jar包
2.配置文件 修改值
3.工具类,这个工具类中创建了一个c3p0连接池,还有3个方法 获得连接池,从连接池中获得连接和释放资源.
4.建表
5.写一个测试类 贾琏欲执事

Dbutils
Apache组织提供的一个对JDBC进行简单封装的开源工具类库,简化开发,不影响程序性能
增删改的操作除了sql语句外一模一样
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());//创建核心类
queryRunner.update("insert into account values (null,?,?)", "ddd",10000);



注意:凡是使用JDBC操作数据库 都要导mysql的驱动包
配置文件只能放在src下

回复 使用道具 举报 1 0
王清松
连接池:存放连接对象的内存区域,让资源稀少的连接对象可以被重复使用,减少了连接创建和销毁的次数,提高程序的效率

JDBC:Java Data Base Connectivity Java数据库连接
JDBCUtils: 我们自己定义的JDBC工具类
C3P0:封装好的连接池工具
Druid:阿里封装好的连接池工具
DBUtils:阿帕奇封装好的JDBC工具类

用Java的IDE管理事务
1.事务开启(Connection对象).setAutoCommit(false);区别于SQL语句starttransaction
2.事务回滚(Connection对象).rollback;
3.事务提交(Connection对象).commit;

编写自定义连接池:
1.编写实现DataSource接口的类
2.创建集合List<Connection>存放连接
3.在构造函数中构造连接
4.编写获取连接的方法
5.编写归还连接的方法

问题:
1.使用接口实现类完成构造,不方便程序扩展
2.需要用户记住额外的归还方法,不方便使用

解决:
1.继承conn对象所属类,重写其close()方法,因为不知道类名,无法控制其构造函数,所以不可行
2.动态绑定代理(为学习)
3.使用装饰者类(如同字符高效流对字符流进行包装) Connectivity Java数据库连接
JDBCUtils: 我们自己定义的JDBC工具类
C3P0:封装好的连接池工具
Druid:阿里封装好的连接池工具
DBUtils:阿帕奇封装好的JDBC工具类

用Java的IDE管理事务
1.事务开启(Connection对象).setAutoCommit(false);区别于SQL语句starttransaction
2.事务回滚(Connection对象).rollback;
3.事务提交(Connection对象).commit;

编写自定义连接池:
1.实现
回复 使用道具 举报
林恒山
添加事务的代码:调用Connection里面的getAutoCommit()开启事务;commit()提交事务;rollback()回滚事务.
因为连接资源宝贵,不断的创建和销毁效率并不高,因此有了连接池,连接池是一个存放连接的容器,需要使用的时候可以从连接池拿取连接,不需要的时候存放到连接池里面.放在连接池的连接并不会在用完之后就直接销毁掉.
2种连接池:
1.阿里的druid,直接创建druid,手动设置连接数据库的参数,另外一种则是将参数写在properties配置文件里面.
2.阿帕奇的C3P0,第一种也是创建C3P0对象,手动设置参数,第二种则是把参数写在名字为c3p0-config.xml中.
DUBtils完成增删改的操作
创建QueryRunner对象,调用QueryRunner对象的update进行增删改,调用QueryRunner对象的query进行查.
回复 使用道具 举报
Do1 中级黑马 2018-5-30 18:48:39
51#
本帖最后由 Do1 于 2018-5-30 21:50 编辑

郑泽珑

mysql数据库默认是自动提交事务的,我们可以通过3个方法来设置事务的回滚 提交,防止在处理SQL时期间发生错误而导致数据传输的错误,
第一个是 setAutoCommit(false); 这个方法设置了将默认的提交改为false.
然后再通过 commit();方法手动提交结果
如果处理的过程中报错了就可以通过rollback();方法进行回滚回到设置默认提交时的值

连接池是因为普通的连接每次都要创建一个连接给一个用户,用户使用完毕后释放资源,会造成性能及内存上的影响,通过连接池可以预先建立好n个连接,用户从连接池中获取连接,使用完毕后归还,这里的归还需要重写工具类Connection中的close方法.
重写工具类Connection中的close方法需要先将它的其它方法实现,然后重写close,将close改为归还,即将用户使用完毕后的Connection接口 加入连接池接口List集合 conn.add(List).

Druid是阿里旗下的一个开源连接池,使用方法和c3p0基本一致,不过c3p0有方便直接配置的xml文件
这类开源连接池方法中直接帮你提供了连接池,我们不需要再去手动创建连接加入集合,非常方便用户使用

JDBCUtils工具类的改写,直接引用c3p0工具类中的创建连接池方法,留几个close方法即可

DBUtils是将sql编译语句进一步的简化,只需2句话即可完成编译操作,
一是创建QuerRunner对象需要传入一个连接池
二是通过不同的参数将数据传递,给一个javabean对象,这个对象里面有setget方法保存和取值



回复 使用道具 举报
白有旺
JDBC  今天学了 自定义工具类连接数据库 比较复杂 了解就好
重点掌握 C3P0 DBUtils
回复 使用道具 举报
123
您需要登录后才可以回帖 登录 | 加入黑马