java connecting step development JDBC database

JDBC core classes

DriverManager for managing the driving / obtain a connection
Connection for connecting a database
Statement for executing SQL statements
ResultSet user to obtain the results of the database fields may be removed, modify, and delete

Full development of java JDBC connection database includes seven steps

    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() 回滚(当前事务的操作全部取消)

Case:


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

    }

}
Published 26 original articles · won praise 19 · views 40000 +

Guess you like

Origin blog.csdn.net/a23006239/article/details/47443561