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();
}