java开发中JDBC连接数据库的步骤

来源:互联网 发布:python try函数 编辑:程序博客网 时间:2024/06/16 00:28
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);         }    }}
0 0
原创粉丝点击