一、初步学习事务
事务在代码中的作用是当执行更新操作后,如果代码后面的代码存在异常,那么被更新的数据会返回原来的状态,确保数据不会因为代码异常而更新丢失。
掌握事务的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个经典设计模式之一。算是第一次接触到,所以用了大幅总结去学自定义设计类。
事务在代码中的作用是当执行更新操作后,如果代码后面的代码存在异常,那么被更新的数据会返回原来的状态,确保数据不会因为代码异常而更新丢失。
掌握事务的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个经典设计模式之一。算是第一次接触到,所以用了大幅总结去学自定义设计类。