jdbc学习二事务与数据源

事务

1. 事务在命令行中的命令如下:

start transaction:开启一次事务

rollback:回滚

commit:提交事务

2. JDBC中与事务有关的方法:

a) Connection.setAutoCommit(boolean b):将默认的事务设置false,开启自定义事务

b) Connection.rollback():数据回滚。

c) Connection.rollback(Savepoint sp):回滚到某个回滚点

d) Connection.commit():提交事务

3. 事务的特性:

a) A:原子性。说明事务是一个不可分隔的单位

b) C:一致性。事务必须使数据库从一个一致性状态变换到另外一个一致性状态

c) I:隔离性:一个事务不能被其他事务打扰。

d) D:持久性,事务一旦提交,就应该被永久保存起来。

4. 事务可能会出现的错误:如果不考虑事务的隔离级别,会出现以下“不正确”的情况:

a) 脏读:指一个事务读到另一个事务中未提交的数据

b) 不可重复读:针对一条记录的,同一条记录数据前后不一样

c) 虚读(幻读):针对一张表,前后读到的记录条数不一样。

5. MySql中控制事务隔离级别的语句:

a) 查看当前的事务隔离级别:select @@tx_isolation;

b) 设置隔离级别(四种):set transaction isolation level

1) READ UNCOMMITTED:脏读、不可重复读、虚读都有可能发生。

2) READ COMMITTED:能避免脏读,不可重复读、虚读都有可能发生。

3) REPEATABLE READ:能避免脏读、不可重复度,虚读都有可能发生。

4) SERIALIZABLE:能避免脏读、不可重复度、虚读。

数据池

1. 数据池:一个存储着很多Connection对象的容器。每次需要连接取出一个,关闭时,将取出的Connection对象放回容器中。

2. 编写标准的数据库连接池。如果编写自己的数据池,实现javax.sql.DataSource接口才是标准的数据库连接池(数据源),解决难题就是将Connection中的Close方法进行改写。对于一个已知类的某个方法进行功能上的改变有以下三种方式(对Connectionclose方法进行改写)。

a) 定义子类,扩展父类的某个功能(此处行不通):因为子类要继承Connection,而Connection是一个接口。如果要改写的话,必须要改写全部。

b) 利用包装设计模式改写原有的类的功能。

c) 利用动态代理来进行改写

3. 开源的数据源使用:

a) DBCPDataBase Connection Pool的编写步骤

1) 需要的jar:commons-dbcp.jar commons-pool.jar

2) DBCP的配置文件(dbcpconfig.properties)拷贝到构建路径中

3) 得到数据源

DataSource BasicDataSourceFactory.createDataSource(props):得到数据源

b) C3p0:是一个机器人的代号

1) 拷贝jar:c3p0.jar

2) c3p0的配置文件(c3p0-config.xml)拷贝到构建路径中

3) 得到数据源:ComboPoolDataSource cps=new ComboPoolDataSource();

Connection geyConnection()

c) 好处:可以连接多个数据库,DBCP只能连接一个

d) 使用更简单。

数据元信息获取

1. DatabaseMetaData对象常用的方法:

a) getURL():返回一个String类对象,代表数据库的URL。

b) getUserName():返回连接当前数据库管理系统的用户名。

c) getDatabaseProductName():返回数据库的产品名称。

d) getDatabaseProductVersion():返回数据库的版本号。

e) getDriverName():返回驱动驱动程序的名称。

f) getDriverVersion():返回驱动程序的版本号。

g) isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

2. ParameterMetaDataPreparedStatement的方法获得getParameterMeteData

a) getParameterCount() : 获得指定参数的个数

b) getParameterType(int param) : 获得指定参数的sql类型(驱动可能不支持)

3. ResultSetMetaData对象:通过ResultSet. getMetaData() 的方法获得

a) getColumnCount() :返回resultset对象的列数

b) getColumnName(int column) :获得指定列的名称

c) getColumnTypeName(int column):获得指定列的类型 java.sql.Type

DBUtil框架的使用

1. DbUtils类提供如关闭连接,,装载JDBC驱动程序等常规工作。方法都是静态的

a) public static void close(…) throws java.sql.SQLException:关闭

b) public static void closeQuietly(): 这一类方法不仅能在ConnectionStatementResultSetNULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception

c) public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。

d) public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。

2. QueryRunner类:该类简化了SQL查询,与esultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

a) 默认的构造方法:一般如果是默认的话。得需要在外部得到一个Connection对象,一般用在事务控制使用

b) 需要注入DataSource的构造方法:不需要在外部创建Connection对象。

c) public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement ResultSet 的创建和关闭。

d) public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException:几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection

e) public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。

f) public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。

g) public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。

3. ResultSetHandler接口:处理ResultSet,将数据交给此类处理。它的方法Object handle (java.sql.ResultSet .rs)用来处理数据。常见子类功能的实现类如下

a) ArrayHandler:把结果集中的第一行数据转成对象数组

b) ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。

c) BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中

d) BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

e) ColumnListHandler:将结果集中某一列的数据存放到List中。

f) KeyedHandler(name):将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key

g) MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值

h) MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

猜你喜欢

转载自blog.csdn.net/qq_30764991/article/details/80219075
今日推荐