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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

同学们,今天继续学习了JDBC,重点就是对连接池的理解C3P0连接池DBUtils的使用

今日需要掌握的有:
  • 能够用自己的话阐述什么是连接池,有什么好处?
  • 会使用Druid和C3P0连接池改写工具类
  • 会使用DBUtils对数据进行增删改查
  • 能够用自己的话解释几个易混淆的概念:JDBC、JDBCUtils、C3P0、Druid、DBUtils

请同学们按照如上要求,总结今日所学。




53 个回复

正序浏览
本帖最后由 13163997058 于 2018-5-29 11:49 编辑

王刘锁
看着写过的代码才能想起来今天学习了什么!首先是事务的处理,主要就是一个Connection接口,它有两个作用一是创建连接二是管理事务! 这个接口中有一些方法用来管理事务.事务就是一组操作,这组操作的各个步骤要么全部成功要么全部失败.事务的管理方法:
开启事务:conn.setAutoCommit(false);括号内写false意思是不自动提交事务
提交事务:conn.commit();回滚事务:conn.rollback();
然后学习了连接池的工作原理,主要学习的是怎么自定义一个连接池当然这不是今天的重点,所以不多记录,能做到理解会用就可以!接下来学习的是一些开源的连接池像阿里巴巴的Druid,阿帕奇的C3PO,老师说重点掌握C3PO,那今天就多练习一下C3PO好了.敲了好多遍的代码结果做作业的时候又是一脸懵的去翻笔记,这真的很愁人!下面是凭记忆记录的,不知道能有多少错误!那种很麻烦的手动连接的方式就不写了,直接记配置文件的方式.
首先配置文件的注意事项:文件名字不能乱改,是固定的 c3po-config.xml
然后是里面的属性也不能改,都是系统认定的!那我们能改的只有具体的值classname,url,user,password,这些内容.
那c3po的创建连接池的方式是:ComboPooledDataSource dataSource = new ComboPooledDataSource();其它的好像就没有什么变化的了!
还有就是DBUtils工具类.不过今天没来得及练习.就不记录了,明天练习完了再添加!!
来补充一下昨天没写完的DBUtils,今天上午在敲完日常作业后准备去练习一下
DBUtils的CURD操作,结果创建好Java文件不知道怎么去写代码,后来去翻了笔记发现
笔记中也没有什么信息,最后去了百度百科去查了一下,大概有了一些理解,又去代码
中写了几遍,在这里记录一下自己的理解,首先DBUtils是一个工具类库,
它主要是封装了我们的JDBC代码,以前我们用JDBC来和数据库建立连接并做一些CRUD
的操作,那时候我们的代码会很繁琐而且重复性太高.后来我们可以自定义工具类把注
册驱动和建立连接的方法还有释放资源的方法放到工具类中,这样很大程度上简化我
们的代码,而且复用性提高很多,可是即便有了工具类还是代码还是不够完美,那么
DBUtils的作用就凸显出来了,它对JDBC的封装极大程度简化我们的代码,让我们可以
用两行代码就完成CRUD的操作,那我们去使用它就需要记住它的主要核心类
QueryRunner,首先我们需要通过构造方法来获取到QueryRunner对象,一种是无参
QueryRunner()创建的是一个没有连接的对象,操作数据库的时候还要创建连接比较麻
烦,但是可以手动管理事务,第二种是有参QueryRunner(DataaSource ds),这个构造参
数是一个连接池对象,在这里我们可以用我们之前定义的JDBCUtils2这个工具类来获
取C3PO的连接池,这个构造出来的对象不用我们再获取连接,而且是自动管理事务,
那重要的是要记住CRUD操作的方法,一个增删改,一个查询,查询还没学先不记录,
有参增删改:update(String sql,object...param);
无参增删改:update(Connection conn,String sql,object...param);
这里面直接写sql语句,后面的参数是解决sql注入问题的那个?对应的值,sql语句中有
多少?后面就有多少个值!而且顺序和类型必须对应!无参的不过是多给一个连接对象,
练习的时候我尝试用一个QueryRunner对象去同时执行多条sql语句结果没有报错,但
是这好像也没什么用!!

回复 使用道具 举报
常小天
今天继续学习JDBC的内容。首先学习的是JDBC的事务管理。事务管理的三个方法:setAutoCommit(Boolean AutoCommit)、commit()、rollBack()。需要注意的点有两个,一是在一个事务中三个方法要用同一个连接对象调用,二是rollBack()要放在捕获异常结构的catch{}。接下来学习的是连接池。所谓连接池,就是一个存放连接对象的容器,它内部已经创建了多个连接,当外部用户访问的时候,它就把内部的连接以remove()的形式取出来给用户使用,当用户使用结束后再以add()的方式归还给连接池。以此方式节约资源,提升效率。第三方连接池种类多样,今天重点学习的是C3P0连接池。使用C3P0连接池大步骤分3步,第一是导包,要将C3P0的jar包导入项目。第二步是添加配置文件。这一步很关键,稍有差错就会导致无法正常使用C3P0连接池。这里要注意三点,一是配置文件的存放路径必须是当前项目的SRC文件夹下,不能存放到其他文件夹,也不能存放到SRC文件夹的子文件夹中,二是配置文件的名称只能是C3P0-config.xml,三是配置文件中的格式和key的名称都只能使用C3P0所规定的内容,只有value值可以自行修改,所以这里建议直接拷贝现成的配置文件再加以修改来使用。这三点其实都只有一个目的,就是保证C3P0的底层代码能够顺利找到配置文件并加载。因为其底层代码是将配置文件路径写死的,所以一旦没有按照它的规定来添加配置文件,就会导致它找不到配置文件,找不到配置文件就无法连接数据库,之后的操作也就无从谈起。使用C3P0的第三步就是编写代码使用C3P0。根据构造创建C3P0连接池的对象即可,再拿链接库对象调用方法获取连接,后面的步骤与之前学习的内容相同。今天学习的最后一部分内容是DBUtils工具类,它就是一个简化JDBC代码的工具类,它将JDBC编码中的众多重复部分进行封装,让开发者可以以极其简洁的语句进行开发。首先创建核心类QueryRunner对象,其构造方法中传入一个C3P0链接库,第二步调用update方法进行数据库的增删改操作。
回复 使用道具 举报
本帖最后由 AsusCoder 于 2018-5-29 12:03 编辑

曾耀峰
一、初步学习事务   
事务在代码中的作用是当执行更新操作后,如果代码后面的代码存在异常,那么被更新的数据会返回原来的状态,确保数据不会因为代码异常而更新丢失。
掌握事务的3个方法:
开启事务:conn.setAutoCommit(false):在conn链接对象获取完后,就可以开启事务
提交事务:conn.commmit():当所有sql执行完毕后,可以提交事务
回滚事务:conn.rollback();写在catch代码块中,如果出现代码异常,会执行catch代码块中的回滚事务。
二、连接池      
1.理解:池在编程中通常理解为装某种数据的容器。   
   在JDBC中,如果每个用户的请求都是创建一个连接对象,使用完毕后销毁。这样在大规模用户的请求中,对内存是一种很沉重的负担。所以提出连接池的概念,连接池是装有连接对象的容器,使用连接的话,可以从连接池中进行获取,使用完成之后将连接还给连接池。连接池从内存中获取和归还的效率要远远高于创建连接对象和销毁的效率
2.自定义连接池
      在javax包中提供了一个连接池类DataSource,里面的getConnction()方法可以获得连接对象。编写自定义的连接池要有以下功能:1.连接池中预先存放一些定义好的连接对象 2.需要使用的时候,从连接池中获取;使用完毕后归还到连接池。
      编写步骤:
      1).实现接口:
          新建MyDataSource类,实现DataSource()接口。载入要实现的所有方法
      2).建立连接池:
          新建一个List<Connection>容器,代表一个连接池
      3).编写获取连接的方法:
          将接口方法getConnection() 提到前面,其他接口方法不必管。在里面添加:return list.remove(0);
      4).初始化连接对象
          在默认构造函数MyDataSource()中初始化N个连接对象,存放到集合List中。注意,在这里的建立的连接对象从JDBCUtils中获取。
          connList.add(JDBCUtils.getConnection());
      5).使用完毕归还:
          添加一个归还方法,void addBack(Connection conn) 里面写connList.add(conn);
     测试使用:
       (1)定义MyDataSource dataSource = new MyDataSource();
       (2)从链接池中获取连接:Connction conn = dataSource.getConnection();
       (3)使用完毕后,归还。dataSource.addBack(conn);
3.自定义连接池出现的问题与解决:
       1).问题:
         (1)使用接口的实现完成的构造:这种写法不方便程序的扩展
        (2)额外提供了方法归还连接:这种方式增加使用连接池的难度。
      2).解决方法:
          原来在Connction中式有一个close方法的,close方法完成了连接的销毁。做一个事情,将原有的连接的close方法改为归还。
          -(1).现在要做的事情是如何将原有的close方法的逻辑改为归还(增强一个类中的方法)
          -(2).如何增强一个类中的方法,有3种方式
           [1].使用继承的方式:
              继承这种方式是最为简单的,但是有条件是,必须控制这个类的构造
           [2].采用装饰者模式:
              装饰该类,使该类功能变得强大。比如,一个美女去整双眼皮,人还是这个人,只是比原来更漂亮,眼睛更大。
              -使用条件:
               一、增强的类和被增强的类实现相同的接口
               二、在增强的类中获得被增强的类的引用
           [3].动态代理(后面学习)
        3)装饰者模式增强自定义连接池类_实现步骤:
          [1].定义一个MyConnectionWrapper 实现Connction接口
          [2].初始化构造函数,Connction conn对象。
          [3].载入接口需要实现的方法,出现问题了:Connction中有40+个方法,而我们只需要一个close()方法
          [4].解决步骤3的问题,应该简化编程。提供一个模板类(模板类原封不动的将接口中的所有方法实现,但没有增强)
           编写一个装饰类继承模板类,在装饰类中只需要增强其中某一个方法既可。
             -ConnectionWrappter 原封不动实现 Connction接口
             -MyConnctionWrappter 继承 Connection方法,重写其中的close方法,改为归还.
          [5].改写自定义连接池工具类:
                      public Connection getConnection() throws SQLException {
                Connection conn = connList.remove(0);
                // 增强连接
                MyConnctionWrapper connWrapper = new MyConnctionWrapper(conn, connList);

                return connWrapper;
        }
          [6].去掉归还方法
     了解一下装饰者设计模式
三、c3p0——数据库连接池   
   c3p0是来自Apache提供的数据库连接池的工具类。
   从上面自定义连接池可以看出,自己写一个完美的连接池还是比较费劲的。使用有人写好的工具类就比较简便了。
  1.c3p0使用步骤:   
    (1)步骤1:建立c3p0-config.xml,在里面的默认配置标签<defalut-config>中,设置属性driverClass驱动器、jdbcUrl数据库地址、user数据库用户名、password密码。注意,属性名是固定的写法是固定的,不能改变。当创建数据库连接池对象ComboPooledDataSource datasource = new ComboPooledDataSource()时,会在src路径下查找c3p0-config.xml,自动读取里面的属性配置信息,完成要对连接的数据库基本信息的配置。         
  (2)步骤2:从连接池中获取连接对象。Connection conn = datasource.getConnection();   
   (3)步骤3:获取语句,执行语句,处理结果       (4)步骤4:归还连接。当调用conn.close()时,c3p0里面重写了close()方法,重写的功能是将连接对象放回到数据池容器中。         2.改写工具类:           
  从上面使用c3p0可以发现,每次使用一次就得创建一个连接池,是一种比创建连接还浪费内存的情况。这时候应该将工具类进行改写,把创建连接池做成一个全局静态常量:  
private static final ComboPooledDataSource datasource = new ComboPooledDataSource();  
  这样实例化的对象,就能全局使用。   
   3.总结c3p0作用:      
   1)创建连接池     
2)从连接池中获得连接对象  
   3)连接对象关闭后,自动归还到连接池。
四、DBUtils:   
    来自Apache提供的一个对JDBC进行简单封装的开源工具类库,使它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。   
原理:JDBC手写代码步骤繁多,并且很多代码是类似的,如获取代码中的链接,预编译SQL,释放资源等。因此将类似的代码进行抽取,制作成工具类。
五、今天和昨天总结:   
    因为JDBC原生代码操作的麻烦,我们制作了一个工具类JDBCUtils,封装了JDBC的代码中注册驱动,获取连接,释放资源的方法。很快我们在数据库连接中,发现使用连接对象创建销毁不符合实际开发情况,又学了连接池的概念,学习了两个开源连接池库druid(德鲁伊),c3p0。把原来获取连接变成获取连接池,修改了工具类,变成C3P0Utils。最后学习了DBUtils。完全简化代码,原来的十来行变成两行代码。   
   这就是面向对象封装的特性。
    装饰者模式属于编程设计模式中27个经典设计模式之一。算是第一次接触到,所以用了大幅总结去学自定义设计类。

回复 使用道具 举报 2 0
白有旺
JDBC  今天学了 自定义工具类连接数据库 比较复杂 了解就好
重点掌握 C3P0 DBUtils
回复 使用道具 举报
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方法保存和取值



回复 使用道具 举报
林恒山
添加事务的代码:调用Connection里面的getAutoCommit()开启事务;commit()提交事务;rollback()回滚事务.
因为连接资源宝贵,不断的创建和销毁效率并不高,因此有了连接池,连接池是一个存放连接的容器,需要使用的时候可以从连接池拿取连接,不需要的时候存放到连接池里面.放在连接池的连接并不会在用完之后就直接销毁掉.
2种连接池:
1.阿里的druid,直接创建druid,手动设置连接数据库的参数,另外一种则是将参数写在properties配置文件里面.
2.阿帕奇的C3P0,第一种也是创建C3P0对象,手动设置参数,第二种则是把参数写在名字为c3p0-config.xml中.
DUBtils完成增删改的操作
创建QueryRunner对象,调用QueryRunner对象的update进行增删改,调用QueryRunner对象的query进行查.
回复 使用道具 举报
王清松
连接池:存放连接对象的内存区域,让资源稀少的连接对象可以被重复使用,减少了连接创建和销毁的次数,提高程序的效率

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 有两个作用:创建连接和管理事务.
事务是一组操作,这组操作的各个组成部分 要么全成功,要么全失败.
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
本帖最后由 凉面要趁热吃 于 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 语句的对象

回复 使用道具 举报
                                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方法)
回复 使用道具 举报
吴俊斌
一.事务管理的三个方法: 一个事务开启,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查询
回复 使用道具 举报
凌辉:
今天主要要掌握C3P0的用法和DBUtils的使用
为了不浪费资源我们要先创建连接池的工具类,
在C3P0调用连接池的连接,
在DBUtils核心类调用连接池,
要多使用几次,记熟练
回复 使用道具 举报
本帖最后由 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"不能改导进去是什么就是什么),然后就可以开始使用了;

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

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

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

二 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的工具类,由阿帕奇组织提供的,旨在简化代码,提高编程的效率;


回复 使用道具 举报
郑志祥   day11JDBC(高级)
事物的三个方法
1.开启事物 conn.setAutoCommit(false) 括号里面的false是令开启事物不自动提交
2.提交事物conn.commit
3.回滚事物conn.rollback

连接池的概述;
连接池是一个装连接的容器,连接对象的创建与销毁是需要时间的,连接池就犹如一个中转站,已经在内存创建好了,使用时从内存中借出来,使用结束后还回内存(连接池)。

创建连接池
1.创建一个普通类实现接口Datesoure
(接口里面的方法需要全部重写)
2.创建connList集合
3.通过工具类.getConnection来创建连接
4.for循环创建多个连接,再将这些连接add添加到集合
5.用户通过 getConnection,使用连接
5.用户通过addback还回连接
注意;不要释放资源,(释放资源相当于销毁)


增强类的方法的三种方式
1.采用继承的方法(重写里面的方法) 条件;这个类可以进行构造
(由于找不到connection的父类,所以无法使用继承进行)
2.采用装饰者模方式(包装)

条件;·增强类和被增强类同时实现一个接口
      ·在被增强类获得增强类的引用
       (1.传入参数  集合list   接口nonn
          2.重写close里面的方法,将销毁更改为归还)
3.动态代理的方式














druid是阿里旗下的连接池产品,使用非常简单,可以与后期的Spring框架进行整合。

1.导包()c3p0-0.9.1.2.jar
2.创建连接池 combopooledDataSource
3.
谷歌浏览器可以右键翻译成中文
因为JDBC 手写比较复杂,
OBUtil是对JDBC进行封装,而且没有影响性能

DBUtils(是阿帕奇给我提供的工具类,可以大大帮我简化代码)
使用就2步骤
1.创建核心类QueryRunner对象(传入连接池)
2.利用对象调用   增删改update 查query 还可以进行批处理
(sql语句{底层用的是preparedStatement})

C3P0的要点
1.导包C3P0-0.9.jar
2.在src相对路径下的c3p0-config.xml配置文件的名字(固定不可修改)
2.c3p0-config.xml里面的内容key那边的内容(固定不可更改)
回复 使用道具 举报
叶凌青
C3P0
是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
第一步:引入DBCP连接池的jar包.
第二步:编写DBCP代码:
    * 手动设置参数:
    * 配置文件设置参数:
public class JDBCUtils2 {
        private static final ComboPooledDataSource DATA_SOURCE =new ComboPooledDataSource();
        /**
         * 获得连接的方法
         */
        public static Connection getConnection(){
                Connection conn = null;
                try {
                        conn = DATA_SOURCE.getConnection();
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return conn;
        }
...
}DBUtils(阿帕奇)
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
Dbutils三个核心功能介绍
1、QueryRunner中提供对sql语句操作的API.
2、ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
3、DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作
回复 使用道具 举报
林荣彬
       今天学习了事务管理的三步骤,重点学习连接池C3P0和DBUtils
1.事务
connection:连接对象
1.获得语句对象
2.管理事务

1.connection.setAutoCommit(false)开启事务://设置事务不自动提交
2. connection.commit 提交事务:没有问题的时候---数据生效,----事务结束
3.connection.rollback 回滚事务:有问题的时候----数据回到开启事务时的状态,----事务结束

2.连接池(装连接对象的容器)(提升运行性能)
接口:DataSource

Druid连接池:配置方式可以使用属性文件配置的,文件名称没有规定但是属性文件中的key要一定的

C3P0连接池:配置文件只能放在src下面.文件的名字只能是c3p0-config.xml
使用步骤:
第一:导包
第二:配置文件
第三:使用

3.DBUTIS工具类
DBUtils:对JDBC进行简单的封装的开源工具类库简化了JDBC操作,可以少写代码.

QueryRunner对象:核心运行类,
QueryRunner
构造:QueryRunner(DataSource ds);
方法:int update(String sql,Object… args);
T query(String sql,ResultSetHandler rsh,Object… args);
回复 使用道具 举报
张述明
今天学习的主要内容
JDBC的事务环境准备:SetAutoCommit(boolean) 设置true 为自动提交,反之
Commit() 提交
Rollback() 回滚

获得连接时候,开启事务.
连接管理事务必须一个事务有同一个连接对象完成操作.
连接池:
是储存连接的容器
自定义连接池出现的问题分析
解决思路
增强一个类方法
两种方式
1.        采用继承的方法  条件:必须能控制这个类的构造
2.        采用装饰者模式
条件: 1.增强的类和被增强的类实现相同接口
2.在增强的类中获得被增强的类的引用.

开源连接池主要掌握C3P0连接池
CombopooledDataSource dataSurce=new CombopooledDataSource();
导包
配置文件
直接使用
代码实现

Dbutils    QueryRunner对象  核心运行类

增删改 用update()
查询   用 query()





回复 使用道具 举报
任佳锋
今天学习了JDBC高级

JDBC事务的三个操作步骤:
开启事务--setAutoCommit
提交事务--Commit
回滚事务--rollback
这三个方法用conn调用  回滚事务则放在catch中

C3p0连接池(存放连接的容器,用于存放连接,使用时取出,不用归还):
c3po是一个开源的连接池使用前要先导包,
然后创建c3po的ComboPooledDataSource对象,直接调用getConnection获取连接对象


DBUtils工具类(增删改):
降低代码的复用性,从而提高效率
创建核心类---QueryRunner,并将参数传入连接池,
利用核心类进行增删改等操作---queryRunner.update()
回复 使用道具 举报
黄志彬

JDBC管理事务的方法:setAutoCommit设置事务,commit提交事务,rollback回滚事务(捕获到异常catch里面,保证事务的一致性)。。。都是连接对象调用的,连接对象必须是同一个

连接池是用来装连接的,负责连接的创建和销毁。提升性能。
连接池是java类创建的对象
conn不是DriverManager获得的conn(conn.close 销毁),而是增强后的连接对象,增强了close() 归还

C3P0 是用来管理连接对象的
工具类直接从连接池拿的连接对象,连接池只需要创建一次。
导包:mysql的驱动包,C3P0的jar包.
配置文件有3个要求,路径要在src里面,文件名固定,name属性不能乱写。要与C3P0规定的一致。
导包----》配置文件---》new 得到的连接池就是带有数据的连接池对象---》归还


DBUtils:简化代码。
创建核心类:QueryRunner
添加,修改,删除就只有update里面的参数不一样;第一个参数是SQL语句,后面的就要看SQL语句中有几个问号就有几个参数。
new核心类对象的时候,传进去的是连接池.因为要归还所以要传连接池。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马