Javaの接続工程の開発JDBCデータベース

JDBCのコアクラス

運転を管理するためのDriverManager /取得接続
データベースに接続するための接続
SQL文の実行のためのステートメントを
データベースフィールドの結果を得るために、ユーザに結果セットを除去することができる、変更、削除

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

    }

}
公開された26元の記事 ウォン称賛19 ビュー40000 +

おすすめ

転載: blog.csdn.net/a23006239/article/details/47443561