JDBC基本和数据库事务

来源:互联网 发布:剑灵范冰冰捏脸数据 编辑:程序博客网 时间:2024/05/10 16:34

JDBC

是一种用于执行SQL语句的Java API,它可以为多种关系数据库提供统一访问。

功能:与数据库建立连接、发送SQL语句并处理结果。

显示数据库:show databases;

使用数据库:user 库名; (如:user mysql;)

显示数据库表:show tables;

显示表结构:describe 表名; (如:describe time_zone;)

建数据库:create database 库名; (如:create database school;)

在数据库中创建表:create table 表名(字段定义);

如; user school;  //不能少

(id int(3) not null primary key,

 name char(10),

     address varchar(50),

     year date );

 

添加记录:insert into 表名 values(各字段名);

如:insert into teacher values(001,’abc’,’hbes’,’1975-03-03’);

查询记录:select 字段 from 表名 where 条件;

如:select * from teacher;

select name from teacher where id = 001;

删除记录:delete from 表名 where 条件;

如:delete from teacher where id = 002;

delete from teacher;

更新记录:update 表名 set 字段名=值 where 条件;

如:update teacher set address = ‘wust’ where id = ‘001’;

删除表:drop table 表名;

删除数据库:drop database 库名;

 

MySQL中文处理:

先运行:Set Names GBK;

create table teacher

(  id int(3) not null primary key,

   name char(10),

   address varchar(50),

   year date  )

default character set gbk;

就可添加和显示汉字数据

 

接口说明:

java.sql.DriverManager:处理驱动程序的调入和管理。

java.sql.Connection:其对象代表对特定数据库的一个连接。

java.sql.Statement:一个特定的容器,用以执行SQL语句。

java.sql.ResultSet:其对象代表执行一个Select语句后的结果集合。

 

Java访问数据库的基本步骤:

1、装载数据库的JDBC驱动程序:

Class.forName(“org.gjt.mm.mysql.Driver”).newInstance();

2、建立与数据库额连接:Connection conn = DriverManager.getConnectiton(url,用户名,密码);

MySQL连接串:”jdbc:mysql://主机:端口号/数据库名”

例如:String url = “jdbc:mysql://localhost:3306/school”;

3、建立Statement对象,准备执行SQL语句:

Statement stmt = conn.createStatement();

4、执行SQL语句:

常见3种执行SQL语句的方法:

1)executeQuery()--用于Select语句,返回结果集(ResultSet).

   String sql = “select * from 表名”;

           ResultSet rs = stmt.executeQuery(sql);

2) executeUpdate()--用于创建和更新表(如Update/Insert/Delete/Create),返回受影响行数(int)。

String sql = “Delete from 表名 where ...”;

int rsCount = stmt.executeUpdate(sql);

3) execute()--用于执行任何SQL语句,返回布尔值(执行是否成功)。

5、处理ResultSet结果集(主要是查询结果集)

while(rs.next()){

String s1 = rs.getString(“name”);//根据列名取值

...

或String s2 = rs.getString(2);//根据列号取值(从1开始)

或int id = rs.getInt(1);

}

6、依次关闭ResultSet、Statement和Connection对象:

rs.close(); stmt.close(); conn.close();

import java.io.*;    import java.sql.*;

public class test {

  public static void main(String[] args) throws Exception {

    String url ="jdbc:mysql://localhost:3306/school"; //数据库连接字符串

    Class.forName("org.gjt.mm.mysql.Driver").newInstance();  //加载驱动程序

    Connection conn= DriverManager.getConnection(url,"root","dba");  //建立连接

    Statement stmt=conn.createStatement();   //创建SQL容器

    String sql="select * from teacher";   //表为teacher

    ResultSet rs=stmt.executeQuery(sql);   //获得结果集

    while( rs.next() ) {   //处理结果集

        System.out.print(rs.getString("id")+"  ");

        System.out.print(rs.getString("name")+"  ");

        System.out.print(rs.getString("address")+"  ");

        System.out.print(rs.getString("year")+"\n");

    }    

    rs.close();     stmt.close();    conn.close();    //关闭次序

  }

}

 

注意MySQL驱动问题;

在当前项目中添加该驱动:

右击当前项目;

选择Build path → add External Archieves→引入mysql-connector-java-5.1.10-bin.jar。

 

 

条件查询:

String name = (new Scanner(System.in)).nextLine();

String sql = “select * from teacher where name =“+name+””;

ResultSet rs = stmt.executeQuery(sql);

//处理查询结果集

 

基本语句:

String sql="update teacher set name='amy' where id='002'";   

int rowCount=stmt.executeUpdate(sql);

 

String sql="insert into teacher values(002,'hgdamy','wust','1974-02-03')";  

int rowCount=stmt.executeUpdate(sql);

 

String sql="delete from teacher  where id='002'";   

int rowCount=stmt.executeUpdate(sql);   

 

之后再查询

sql="select * from teacher ";   

ResultSet rs=stmt.executeQuery(sql); 



数据库事务:

在数据库中,事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。

为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。 
  事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃所作的所有修改而回到开始事务时的状态。

 

事务的ACID属性:

1、原子性(Atomicity):是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2、一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

3、隔离性(Isolation):是指一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务是隔离的,并发执行的各个事务之间不能互相干扰。

4、持久性(Durability):是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其它操作和数据库故障不应该对其有任何影响。

 

   事务:指构成单个逻辑工作单元的操作集合
  事务处理:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),要么整个事务回滚(rollback)到最初状态
  当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚

 

当JDBC程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,并且保证这些语句是在同一时间共同执行时,我们就应该为这多条语句定义一个事务。

设置事务的提交方式为非自动提交:

conn.setAutoCommit(false);

接下来,.将需要添加事务的代码放入trycatch块中然后,在try块内添加事务的提交操作,表示操作无异常,提交事务:

conn.commit();

catch块内添加回滚事务,表示操作出现异常,撤销事务:

conn.rollback();

最后,设置事务提交方式为自动提交:

conn.setAutoCommit(true);

 

数据库的隔离级别:

对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题. 
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱。

 

数据库提供的4种事务隔离级别:


Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED 
Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ


0 0
原创粉丝点击