java之jdbc初探
2013-12-07 00:17
387 查看
Class——20
事物(ACID)
原子性:组成事物的处理语句形成了一个逻辑单元,不能只执行其中的一部分。
一致性:在数据处理执行前后,数据库是一致的(数据库数据完整性约束)。
隔离性:一个事物处理对另一个事物处理的影响。
持续性:事务处理的结果能够被永久保存下来。
简单的三步骤:
connection.setAutoCommit(false);
connection.commit();//提交事物
connection.rollback();//回滚事物
Tip;如果不能回滚,那有可能是数据库引擎问题。一般innoDB对大部分数据库特性都是支持的。
Class——21
回滚不一定非要完全把整个事物回滚,比如你从北京去上海,你已经飞到上海了,又紧急通知要飞往海南,那就没必要回到北京再去海南,而直接从上海去海南,这里就引出了一个概念:保存点。
你想让程序回滚的哪里,就在哪里设置保存点。
Savepoint sp = null;
connection.setAutoCommit(false);
………
………..
sp= connection.setSavepoint();
当出现异常需要回滚的时候,则要把保存点的引用传递给回滚函数
connection.rollback(sp);
connection.commit();
切记,这里一定要提交,因为保存点之前也有操作。所以不提交则保存点之前的操作就没有执行。
Class——22
Q:如何解决多个数据库参与的事物处理?
JAVAEE为处理多个数据库参与的事物处理指定了一套规范(专门处理这种情况的API),是用JTA容器实现事物。Tomcat不支持该特性,高级的服务器才有这种支持,比如weblogic..
该JTA容器就像一个指挥官,协调各个类型的服务器共同完成程序的运行。
分成两个阶段提交:
javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName”);
tx.begin();
//connection1 ,connection2(可能来自不同的数据库)……..
tx.commit();
tx.rollback();
这个东西比较复杂,所以张勇老师在视频里边只是简单的介绍了一下。
Class——23
隔离界别
脏读(dirty reads)
一个事务读取了另一个未提交的并行事务写的数据。
不可重复读(non-repeatablereads)
一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。
幻读(phantom read)
一个事务重新执行一个查询,返回一套符合查询条件的行,发现这些行因为其他最近提交的事务而发生了改变。
隔离级别越高,系统的并发性越差。
Mysql
查看隔离级别语句:select @@tx_isolation;
Mysql修改隔离级别语句:
settransaction isolation level read uncommitted;、
read committed;
repeatable read;
serializable;
提交:直接输入 commit;
回滚:直接输入 rollback;
Class——24
Jdbc 取主键
String sql=”insert into user(name ,birthday,money)values(‘name1’,’1989-05-05’,400)”;
Ps=conn.preparedStatement(sql,Statement.RETURN_GENERATED_KEYS);
Ps.executeUpdate();
Rs= Ps.getGeneratedKeys();
有时候你插入信息的时候,需要把信息的主键加到信息里头,因为如果你不加,那么新信息的主键有可能是空,这当信息重复或者相似度很高的情况下是非常有必要的。
Class——25
批处理:可以大幅度提升增删改的速速。
String sql = “insert into user(uname,birthday,money)values(?,?,?)”;
Ps = conn.preparedStatement(sql,Statement.RETURN_GENERATED_KEYS);
For(int i = 0; i<100;i++){
Ps.setString(1,”name”+i);
Ps.setDate(2,newDate(System.currentTimeMillis()));
Ps.setFloat(3,100f+i);
Ps.addBatch();
}
Int[] eb = ps.executeBatch();
Class——26
package com.tony.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ScrollTest {
public static voidmain(String[] args) throws ClassNotFoundException, SQLException {
scrollMethod();
}
static void scrollMethod()throws ClassNotFoundException, SQLException {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn =SinglejdbcTools.getInstance().getConnection(); //
调用singlejdbcTools;
st =conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//方法的第一个参数是说结果集是可滚动的,对数据库的变化时不可感知的,还有另一种方法
,ResultSet.TYPE_SCROLL_SENSITIVE对数据库的变化是可感知的。但是不同的数据库不一定完全对jdbc的定义规则符合。所以这个方法对于不同的数据库不同的版本不一定起作用,只有在实践中去验证。
//st =conn.createStatement();
rs =st.executeQuery("select id,name,sex,age from person");
rs.absolute(20);//结果集定义到第二十行开始操作。
int i = 0;
while(rs.next()&&i<10) {
i++;
System.out.println(rs.getObject(1)+"\t"+ rs.getObject(2) +"\t"+ rs.getObject(3)
+rs.getObject(4));
}
System.out.println("------------------------------");
rs.absolute(6);//注意:这里的定义到弟六行,仅仅是相对于结果集,与之前的对结果集的操作没有关系。比方说,上面显示的是从第二十行开始显示十行数据,但是这里的6,不是相对于这十行,而是相对于结果集。
int m = 0;
while(rs.previous()&&m<5){
m++ ;
System.out.println(rs.getObject(1)+"\t"+ rs.getObject(2) +"\t"+ rs.getObject(3)
+rs.getObject(4));
}
} finally {
jdbcTools.free(conn,st, rs);
}
}
}
Class——27
Part1:可更新的结果集
st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPTABLE);//第二个参数可以对结果进行更新操作
比如:rs.update……..这个方法,一般更新的数据,一定是某一行的一个数据,所以
更新完之后,要调用 rs.updateRow();
这个方法不太常用,一般不在查询语句里边对数据进行更新,这不符合java的封装特性。
Class——28
数据库的元数据信息。
所谓数据库元数据,既数据库的名字,数据库的版本,数据库驱动的版本等基本信息。
staticvoid DatabaseMetaDataMethod()throws
SQLException{
Connection conn =
null;
PreparedStatement ps =
null ;
ResultSet rs =
null;
try{
conn = jdbcTools.getConnection();
DatabaseMetaDatadbmd = (DatabaseMetaData) conn.getMetaData();
System.out.println(dbmd.getDatabaseProductName());
System.out.println(dbmd.getDatabaseMajorVersion());
System.out.println(dbmd.getDatabaseMinorVersion());
System.out.println(dbmd.getDatabaseProductVersion());
System.out.println(dbmd.supportsTransactions());
for(int i =1 ; i < 5 ; i++){
System.out.println("isolationlevel "+i+"
is :"+dbmd.supportsTransactionIsolationLevel(i)+"
supported");
}
}
finally{
jdbcTools.free(conn, ps, rs);
}
}
还有好多方法,没事可以自己试一试。
一般可以通过调取数据库元信息而直到是哪个数据库,不同的数据库的元信息不同
Class——29
参数的元数据信息
package cn.itcast.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ParameterMetaTest {
publicstatic void main(String[] args) throws SQLException {
Object[]params = new Object[] { "lisi", 100f };
read("select* from user where name=? and money >?", params);
}
staticvoid read(String sql, Object[] params) throws SQLException {
Connectionconn = null;
PreparedStatementps = null;
ResultSetrs = null;
try{
conn= JdbcUtils.getConnection();
ps= conn.prepareStatement(sql);
// ParameterMetaDatapmd = ps.getParameterMetaData();
// intcount = pmd.getParameterCount();
for(int i = 1; i <= params.length; i++) {
//System.out.print(pmd.getParameterClassName(i) + "\t");
//System.out.print(pmd.getParameterType(i) + "\t");
//System.out.println(pmd.getParameterTypeName(i));
ps.setObject(i,params[i - 1]);
}
rs= ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt("id")+ "\t"
+rs.getString("name") + "\t" +rs.getDate("birthday")
+"\t" + rs.getFloat("money"));
}
}finally {
JdbcUtils.free(rs,ps, conn);
}
}
}
事物(ACID)
原子性:组成事物的处理语句形成了一个逻辑单元,不能只执行其中的一部分。
一致性:在数据处理执行前后,数据库是一致的(数据库数据完整性约束)。
隔离性:一个事物处理对另一个事物处理的影响。
持续性:事务处理的结果能够被永久保存下来。
简单的三步骤:
connection.setAutoCommit(false);
connection.commit();//提交事物
connection.rollback();//回滚事物
Tip;如果不能回滚,那有可能是数据库引擎问题。一般innoDB对大部分数据库特性都是支持的。
Class——21
回滚不一定非要完全把整个事物回滚,比如你从北京去上海,你已经飞到上海了,又紧急通知要飞往海南,那就没必要回到北京再去海南,而直接从上海去海南,这里就引出了一个概念:保存点。
你想让程序回滚的哪里,就在哪里设置保存点。
Savepoint sp = null;
connection.setAutoCommit(false);
………
………..
sp= connection.setSavepoint();
当出现异常需要回滚的时候,则要把保存点的引用传递给回滚函数
connection.rollback(sp);
connection.commit();
切记,这里一定要提交,因为保存点之前也有操作。所以不提交则保存点之前的操作就没有执行。
Class——22
Q:如何解决多个数据库参与的事物处理?
JAVAEE为处理多个数据库参与的事物处理指定了一套规范(专门处理这种情况的API),是用JTA容器实现事物。Tomcat不支持该特性,高级的服务器才有这种支持,比如weblogic..
该JTA容器就像一个指挥官,协调各个类型的服务器共同完成程序的运行。
分成两个阶段提交:
javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName”);
tx.begin();
//connection1 ,connection2(可能来自不同的数据库)……..
tx.commit();
tx.rollback();
这个东西比较复杂,所以张勇老师在视频里边只是简单的介绍了一下。
Class——23
隔离界别
脏读(dirty reads)
一个事务读取了另一个未提交的并行事务写的数据。
不可重复读(non-repeatablereads)
一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。
幻读(phantom read)
一个事务重新执行一个查询,返回一套符合查询条件的行,发现这些行因为其他最近提交的事务而发生了改变。
隔离级别越高,系统的并发性越差。
Mysql
查看隔离级别语句:select @@tx_isolation;
Mysql修改隔离级别语句:
settransaction isolation level read uncommitted;、
read committed;
repeatable read;
serializable;
提交:直接输入 commit;
回滚:直接输入 rollback;
Class——24
Jdbc 取主键
String sql=”insert into user(name ,birthday,money)values(‘name1’,’1989-05-05’,400)”;
Ps=conn.preparedStatement(sql,Statement.RETURN_GENERATED_KEYS);
Ps.executeUpdate();
Rs= Ps.getGeneratedKeys();
有时候你插入信息的时候,需要把信息的主键加到信息里头,因为如果你不加,那么新信息的主键有可能是空,这当信息重复或者相似度很高的情况下是非常有必要的。
Class——25
批处理:可以大幅度提升增删改的速速。
String sql = “insert into user(uname,birthday,money)values(?,?,?)”;
Ps = conn.preparedStatement(sql,Statement.RETURN_GENERATED_KEYS);
For(int i = 0; i<100;i++){
Ps.setString(1,”name”+i);
Ps.setDate(2,newDate(System.currentTimeMillis()));
Ps.setFloat(3,100f+i);
Ps.addBatch();
}
Int[] eb = ps.executeBatch();
Class——26
package com.tony.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ScrollTest {
public static voidmain(String[] args) throws ClassNotFoundException, SQLException {
scrollMethod();
}
static void scrollMethod()throws ClassNotFoundException, SQLException {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn =SinglejdbcTools.getInstance().getConnection(); //
调用singlejdbcTools;
st =conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//方法的第一个参数是说结果集是可滚动的,对数据库的变化时不可感知的,还有另一种方法
,ResultSet.TYPE_SCROLL_SENSITIVE对数据库的变化是可感知的。但是不同的数据库不一定完全对jdbc的定义规则符合。所以这个方法对于不同的数据库不同的版本不一定起作用,只有在实践中去验证。
//st =conn.createStatement();
rs =st.executeQuery("select id,name,sex,age from person");
rs.absolute(20);//结果集定义到第二十行开始操作。
int i = 0;
while(rs.next()&&i<10) {
i++;
System.out.println(rs.getObject(1)+"\t"+ rs.getObject(2) +"\t"+ rs.getObject(3)
+rs.getObject(4));
}
System.out.println("------------------------------");
rs.absolute(6);//注意:这里的定义到弟六行,仅仅是相对于结果集,与之前的对结果集的操作没有关系。比方说,上面显示的是从第二十行开始显示十行数据,但是这里的6,不是相对于这十行,而是相对于结果集。
int m = 0;
while(rs.previous()&&m<5){
m++ ;
System.out.println(rs.getObject(1)+"\t"+ rs.getObject(2) +"\t"+ rs.getObject(3)
+rs.getObject(4));
}
} finally {
jdbcTools.free(conn,st, rs);
}
}
}
Class——27
Part1:可更新的结果集
st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPTABLE);//第二个参数可以对结果进行更新操作
比如:rs.update……..这个方法,一般更新的数据,一定是某一行的一个数据,所以
更新完之后,要调用 rs.updateRow();
这个方法不太常用,一般不在查询语句里边对数据进行更新,这不符合java的封装特性。
Class——28
数据库的元数据信息。
所谓数据库元数据,既数据库的名字,数据库的版本,数据库驱动的版本等基本信息。
staticvoid DatabaseMetaDataMethod()throws
SQLException{
Connection conn =
null;
PreparedStatement ps =
null ;
ResultSet rs =
null;
try{
conn = jdbcTools.getConnection();
DatabaseMetaDatadbmd = (DatabaseMetaData) conn.getMetaData();
System.out.println(dbmd.getDatabaseProductName());
System.out.println(dbmd.getDatabaseMajorVersion());
System.out.println(dbmd.getDatabaseMinorVersion());
System.out.println(dbmd.getDatabaseProductVersion());
System.out.println(dbmd.supportsTransactions());
for(int i =1 ; i < 5 ; i++){
System.out.println("isolationlevel "+i+"
is :"+dbmd.supportsTransactionIsolationLevel(i)+"
supported");
}
}
finally{
jdbcTools.free(conn, ps, rs);
}
}
还有好多方法,没事可以自己试一试。
一般可以通过调取数据库元信息而直到是哪个数据库,不同的数据库的元信息不同
Class——29
参数的元数据信息
package cn.itcast.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ParameterMetaTest {
publicstatic void main(String[] args) throws SQLException {
Object[]params = new Object[] { "lisi", 100f };
read("select* from user where name=? and money >?", params);
}
staticvoid read(String sql, Object[] params) throws SQLException {
Connectionconn = null;
PreparedStatementps = null;
ResultSetrs = null;
try{
conn= JdbcUtils.getConnection();
ps= conn.prepareStatement(sql);
// ParameterMetaDatapmd = ps.getParameterMetaData();
// intcount = pmd.getParameterCount();
for(int i = 1; i <= params.length; i++) {
//System.out.print(pmd.getParameterClassName(i) + "\t");
//System.out.print(pmd.getParameterType(i) + "\t");
//System.out.println(pmd.getParameterTypeName(i));
ps.setObject(i,params[i - 1]);
}
rs= ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt("id")+ "\t"
+rs.getString("name") + "\t" +rs.getDate("birthday")
+"\t" + rs.getFloat("money"));
}
}finally {
JdbcUtils.free(rs,ps, conn);
}
}
}
相关文章推荐
- EBS中使用JAVA方式发送HTML格式邮件
- EBS中使用JAVA方式发送HTML格式邮件
- EBS中使用JAVA方式发送HTML格式邮件
- eclipse中jar包中源码Source not found的解决办法
- java_IO读写模版
- myeclipse项目编码方式设置(彻底解决乱码问题)
- java c/cpp互相调用实例----------c/cpp调用java
- java c/cpp互相调用实例
- java list基本用法
- java在指定路径下创建文件,并写入文件内容
- java线程两种实现方式的区别,你所不知道的小细节
- 利用MyEclipse配置S2SH三大框架篇-Hibernate配置
- java 从控制台读取数据,文件的读取与写入
- Eclipse无法启动AVD qemu: could not open disk image(Ubuntu12.04)
- JAVA抓取网页的简单实现
- Java中内存中的Heap、Stack与程序运行的关系
- 利用MyEclipse配置S2SH三大框架篇-数据源配置
- java web 学习 --第六天(Java三级考试)
- 使用Struts2的文件上传机制,对上传文件大小进行限制
- [forwarding] Struts2中action接收中文参数为乱码解决方法