JDBC

JDBC

一、JDBC的概念:

1、什么是JDBC
  JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

二、常用接口

1、Driver接口: 加载数据库驱动。

Class.forName("com.mysql.jdbc.Driver");

2、Connection接口 Connection与特定数据库的连接,连接上下执行sql语句并返回结果。

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "user", "password");

常用方法:
createStatement(): 创建向数据库发送sql的statement对象;
prepareStatement(sql) : 创建向数据库发送预编译sql的PrepareSatement对象;
setAutoCommit(boolean autoCommit): 设置事务是否自动提交;
commit() : 在链接上提交事务;
rollback() : 在此链接上回滚事务。

3、Statement接口 用于执行静态SQL语句并返回它所生成结果的对象。
Statement: 由createStatement创建,用于发送简单的SQL语句(不带参数)。
PreparedStatement : 继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入 ,所以我们一般都使用PreparedStatement。

常用方法:
execute(String sql): 运行语句,返回是否有结果集
executeQuery(String sql): 运行select语句,返回ResultSet结果集。
executeUpdate(String sql): 运行更新(insert/update/delete)操作,返回更新的行数。
addBatch(String sql): 把多条sql语句放到一个批处理中。
executeBatch(): 向数据库发送一批sql语句执行。

4、ResultSet接口
常用的方法:
getString(int index)、getString(String columnName): 获得在数据库里是varchar、char等类型的数据对象;
getFloat(int index)、getFloat(String columnName): 获得在数据库里是Float类型的数据对象;
getDate(int index)、getDate(String columnName): 获得在数据库里是Date类型的数据;
getBoolean(int index)、getBoolean(String columnName): 获得在数据库里是Boolean类型的数据;
getObject(int index)、getObject(String columnName): 获取在数据库里任意类型的数据。

三、使用JDBC的步骤

① 加载数据库驱动
② 建立数据库连接Connection
③ 创建执行SQL的语句Statement
④ 处理执行结果ResultSet
⑤ 释放资源

// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得数据库连接
Connection conn = DriverManager.getConnection("url","root","password");
//sql代码
String sql = "select * from 表名";
//根据连接获得statement对象
Statement state = connection.createStatement();
//执行sql语句,并且返回结果集
ResultSet rs = state.executeQuery(sql);
//处理结果集(rs.next()--检测结果集中是否还有数据)
while(rs.next()){
	int id = rs.getInt("id");
	String name = rs.getString("name");
	int age = rs.getInt("age"); 
	System.out.println(id+"\t"+name+"\t"+age);
}
//释放资源
rs.close();
state.close();
conn.close();

四、使用事务

/**
* 从指定账号向另一个账号转出指定金额
* @param a     		账号a
* @param b     		账号b
* @param money     转出金额
*/
public static void change1(int a, int b, BigDecimal money) {
	String sql1 = "update account set money=money-? where id=?";
	String sql2 = "update account set money=money+? where id=?";
	//减少
	DBUtils.exeUpdate(sql1,money,a);
	//增加
	DBUtils.exeUpdate(sql2,money,b);
}

public static void change2() {
	String sql1 = "update account set money=money-1000 where id=2";
    String sql2 = "update account set money=money+1000 where id=3";
    Connection conn = DBUtils.getConn();
    PreparedStatement ps = null;
    try {
    	//关闭事务的自动提交
	    conn.setAutoCommit(false);
        ps = conn.prepareStatement(sql1);
        int i1= ps.executeUpdate();
        //定义一个事务异常
        System.out.println(10/0);
        
        ps = conn.prepareStatement(sql2);
        int i2 = ps.executeUpdate();
        if(i1 > 0 && i2 > 0) {
        //提交事务
        conn.commit();
		}
	} catch (Exception e1) {
        //执行异常(算数异常)
        e1.printStackTrace();
        try {
           //事务回滚
           conn.rollback();
        } catch (SQLException e2) {
           e2.printStackTrace();
        }
	}finally {
       	DBUtils.closeS(null,ps,conn);
	}
}

public static void change3() {
	String sql1 = "update account set money=money-1000 where id=2";
    String sql2 = "update account set money=money+1000 where id=3";
    Connection conn = DBUtils.getConn();
    try {
       //关闭事务自动提交
       conn.setAutoCommit(false);
       DBUtils.exeUpdate(conn,sql1);
       //算数异常代码
       System.out.println(10/0);
       DBUtils.exeUpdate(conn,sql2);
       //提交事务
       conn.commit();
	} catch (Exception e1) {
       //执行异常(算数异常)
       e1.printStackTrace();
       try {
          //事务回滚
          conn.rollback();
       } catch (SQLException e2) {
          e2.printStackTrace();
       }
	}finally {
       DBUtils.closeS(null,null,conn);
	}
}

//测试
public static void main(String[] args) {
	change1(2,3,new BigDecimal(1000.00));
	change2();
	change3();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值