JDBC第四节

来源:互联网 发布:天刀网络不稳定怎么办 编辑:程序博客网 时间:2024/05/17 21:31

 

今天是JDBC的第四天学习,今天讲了些常用的东西第一个讲了挺重要的一个概念-事务ACID;也就是
原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)。
隔离性(isolcation):一个事务处理对另一个事务处理没有影响。
持续性(durability):事务处理的效果能够被永久保存下来 。
关闭自动提交, 打开事务。connection.setAutoCommit(false);
提交事务。 connection.commit();
回滚事务。connection.rollback();
设置保存点Savepoint sp = conn.setSavepoint();
回滚到保存点conn.rollback(sp);
设置隔离级别, 可以通过Connection中的常量设置conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
还有自增长的ID:
conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = ps.getGeneratedKeys();
if (rs.next())
 user.setId(rs.getInt(1));
MySQL的select last_insert_id()可以获取之前插入的记录的id, 但这只是MySQL才有的函数
只有对自增长的列发生自增长的赋值后才会导致一个key的产生,并且用getGereratedKeys()返回。
批处理是个挺有用的东西,让自己方便了程序的执行效率,
使用批量处理功能涉及下面的两个方法: 
addBatch(String) 方法   executeBatch方法 
下边是分页
它通过ResultSet的滚动可以设置获取记录的位置, 但这样是从数据库中查询出所有数据, 然后再从结果中筛选结果, 性能非常低.
MySQL提供了分页语法. 在查询语句后可使用LIMIT关键字完成分页功能,
就如最简单的百度上搜索一下会出来很多结果,但是它一页只能放很少的东西,
可更新结果集、敏感结果集
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet.TYPE_SCROLL_SENSITIVE
表示获得ResultSet之后是敏感的, 随数据库更新的. 但MySQL没有支持这项功能
ResultSet.CONCUR_UPDATABLE
表示获得ResultSet之后是可更新的, 例如:
rs.next();
rs.updateString("name", "updateName");
rs.updateRow();
可以将当前行的name属性改为updateName.
数据库元信息
由于每种数据库对JDBC的实现都有所不同, 我们在使用的时候想要了解哪些数据库支持哪些功能, 就可以查看元信息
DatabaseMetaData data = conn.getMetaData();
数据库元信息
data.getDatabaseProductName()
数据库名
data.getDatabaseProductVersion()
数据库版本号
data.getDriverName()
驱动名
data.getDriverVersion()
驱动版本号
data.supportsTransactions()
是否支持事务
data.getDefaultTransactionIsolation()
默认事务隔离级别
data.supportsTransactionIsolationLevel(0)
是否支持指定的事务隔离级别
data.supportsGetGeneratedKeys()
是否支持获取主键
data.supportsResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE)
是否支持敏感结果集
结果集元信息
我们可以根据结果集元信息来写一些灵活性很高的代码. 让代码的复用性更高.
ResultSetMetaData rsmd = ps.getMetaData();
获取结果集元信息
rsmd.getColumnCount()
获取结果集中包含几列
rsmd.getColumnName(1)
获取指定列的名字
rsmd.getColumnLabel(1)
获取指定列的别名
rsmd.getColumnClassName(1)
获取指定列的Java类型
rsmd.getColumnTypeName(1)
获取指定列的数据库类型
今天讲了最深的东西当属反射了,老师志开了个头,但是我对它有所了解,反射其实很简单,无非就是位移为零,转个来回,
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像对象导向当初被导入编程领域一样,一人一把号,各吹各的调。
JAVA反射机制提供以下功能
获取类的Class对象
获取类的Fields
获取类的Method
获取类的Constructor
新建类的实例
       Class<T>的函数newInstance
通过Constructor对象的方法newInstance
ava反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。
换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。
反射我也只知道个入门,明天听听就懂了;


 

原创粉丝点击