JDBC核心类
DriverManager 用于管理驱动/获得连接
Connection 用于连接数据库
Statement 用于执行SQL语句
ResultSet 用户获取执行结果,可以对数据库字段进行取出,修改,删除等操作
完整java开发中JDBC连接数据库包含7个步骤
1, 加载注册JDBC驱动
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),
这通过java.lang.Class类的静态方法forName(String className)实现。
Class.forName("com.mysql.jdbc.Driver");会抛出ClassNotFoundException异常
(当驱动没找到时),catch住提醒“MYSQL驱动加载失败”
2,提供JDBC连接的URL
连接URL定义了连接数据库时的协议、子协议、数据源标识,用户名,密码。
("jdbc:mysql://localhost/demo1?useUnicode=true&charcterEncoding=
UTF-8","root","root")
//协议://主机:端口号/资源路径?查询字符串
3,通过驱动连接数据库
要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,
该对象就代表一个数据库的连接
使用DriverManager的getConnectin(String url , String username ,
String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和
密码来获得。
第一个参数叫"连接字符串",用于设置连接到哪台服务器(localhost),哪个数据库(demo1),
以及其他配置信息(和数据库的编码一致).连接字符串的格式由不同DBMS的驱动来规定,
具体查看驱动的文档
第2,3个参数为用户名,密码
4,执行SQL包下面的预编译sql语句对象Statement
要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3
种类型:
A、执行静态SQL语句。通常通过Statement实例实现。
B、执行动态SQL语句。通常通过PreparedStatement实例实现。
C、执行数据库存储过程。通常通过CallableStatement实例实现。
PreparedStatement ps =
conn.prepareStatement("insert into T_Persons(Name,Age,Gender)values('无崖子',22,1)")
ps.executeUpdate();//执行更新
5,执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate
和execute
A、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句
,返回一个结果集(ResultSet)对象。
B、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或
DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
C、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的
语句。
具体实现的代码:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;
6, 处理结果
两种情况:
1、执行更新返回的是本次操作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
行中数据的访问。
• 使用结果集(ResultSet)对象的访问方法获取数据:
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比较高效
}
(列是从左到右编号的,并且从列1开始)
7,关闭JDBC对象
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声
明顺序相反:
A、关闭记录集
B、关闭声明
C、关闭连接对象
preparedstatement是加工SQL的接口。
把sql的参数域编译成确切的sql保存起来!
--------------------------------------------
public interface PreparedStatement extends Statement表示预编译的 SQL 语句的对象。
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
----------------------------------------------------------
事务(Transaction)有四大特征:原子性,一致性,隔离性,持久性。
原子性值得是”几个操作要么都成功,要么都失败“!
JDBC事务
首先 1,设定Connection的setAutoCommit(false), 禁止自动提交;
2,操作结束执行conn.commit()提交事务;
3,如果执行出错,则conn.rollback() 回滚(当前事务的操作全部取消)
案例:
1,对数据库批量提交插入数据,先把数据装箱,通过addBacth(),每满多少笔时候提交一次executeBatch();
2,模拟银行转账,通过连接数据库 对某账号进行 + - 金额
try
{
conn = JdbcUtils.createConnection();
conn.setAutoCommit(false);//通过事务禁止自动提交
ps1 = conn.prepareStatement("Update T_Employees Set Salary=Salary-10 where Name='Tom'");
ps1.executeUpdate();
ps2 = conn.prepareStatement("Update T_Employees Set1 Salary=Salary+10 where Name='Jerry'");
ps2.executeUpdate();
conn.commit();//全部操作一致无误后,提交
} catch (SQLException e)
{
conn.rollback();//如果操作中有误,则回滚,之前的操作都不算
}
----------------------------------------------------------
批量提交
采用批量提交:要配合事务使用,否则没效果。把executeUpdate() 改成
addBatch(),在最后再ps.executeBatch(),看看用多长时间
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*
* 案例1:通过批量提交插入,优化处理
* */
public class BatchTest2
{
public static void main(String[] args)
{
Connection conn= null;
PreparedStatement ps = null;
//计算用时 比较
long start = System.currentTimeMillis();
try
{
//创建数据库连接,注意批量提交应确保连接中,要在事务中配合使用
conn = JDBCUtils.createConnection();
//批量提交配合事务使用,设定禁止自动提交
conn.setAutoCommit(false);
//创建预处理sql语句对象,共用此对象,
ps = conn.prepareStatement("insert into t_persons2(Name,Age,Gender) values(?,?,?)");
//设置插入参数值
for(int i = 0;i<10000;i++)
{
ps.clearParameters();//记住Statement重复使用要把上次设置的
查询参数的值清空,才能继续设置下一次的值
ps.setString(1, "东方白"+i);
ps.setInt(2, 25);
ps.setBoolean(3, true);
//ps.executeUpdate();// ,每次插入都通知mysql,
ps.addBatch(); //装到"箱子里" ,用批量提交则先把数据
加入到箱子里面来 一次性批量提交箱子
//以每满1000笔提交一次箱子,根据数据量而定
if(i%1000==0)
{
ps.executeBatch();//每1000笔提交一次
}
}
//把箱子中剩下的,余下的没满1000的再提交一次
ps.executeBatch();//把"箱子里"的命令一次提交给mysql
conn.commit();//在所有的操作之后,提交事务,
long end = System.currentTimeMillis();
System.out.println("耗时"+(end-start));
}
catch (SQLException e)
{
try
{
conn.rollback();//如果发生异常则回滚,刚才的操作都不算
} catch (SQLException e1)
{
System.out.println("回滚失败");
}
e.printStackTrace();
}
finally
{
JDBCUtils.closeQuietly(conn);
}
}
}