zoukankan      html  css  js  c++  java
  • JDBC

    JDBC

    (转载http://blog.csdn.net/williamchew/article/details/51951551)

    尊重版权所有

     

    • Java数据库连接,提供了一种与平台无关的用于执行SQL语句的标准javaAPI,可以方便实现多种关系型数据库的统一操作
    • JDBC驱动分类
      • JDBC-ODBC桥驱动
        • ODBC是由微软提供的编程接口,JDBC也是模仿了ODBC的设计
      • JDBC-本地驱动
        • 直接使用各个数据库生产商提供的JDBC驱动程序,因为只能应用在特定的数据库上,会丧失程序的可移植性,不过性能很高。
      • JDBC-网络驱动
        • 将JDBC转换为与DBMS无关的网络协议,之后又被某个服务器转换为一种DBMS协议,所用的具体协议取决于提供者,最为灵活
      • 本地协议纯JDBC驱动
        • 将JDBC转换为DBMS所使用的网络协议。
      • 主要操作类及接口
        • 常用的类与接口就是DriverManager、Connection、Statement、Result、PreparedStatement
       
    • MySQl数据库
      • 常用命令
        • 创建数据库:create database 数据库名称 ;
        • 删除数据库:drop database  数据库名称 ;       
        • 使用数据库:use 数据库名称 ;
        • 创建数据库表:create table 表名( 字段名称1 字段类型[default 默认值] [约束], ...) ;
        • 删除数据库表:drop table 表名 ;
        • 查看表结构: desc  表名称 ;   
        • 查看全部数据库:show databases ;
        • 查看一个数据库全部表: show tables ;
     
    • SQL语法基础(Structured Query Language,结构查询语句)强大的数据库语言
        • DML-数据操作语言:检索或修改数据
        • DDL-数据定义语言:定义数据的结构,创建、修改、删除
        • DCL-数据控制语言:定义 数据库用户的权限
      • 数据类型
        • 整型数据
        • 时间日期类
        •  
        • 字符串类型
      • 插入数据:insert into 表名称( 字段 )   values(值...);
      • 删除数据:delete from 表名称 [删除条件] ;  若无条件则清空表,条件如 “where id =1"
      • 更新数据:update 表名称 set 字段1 =值 1 ...  [where 更新条件]
      • 查询数据:select {*|colum alias} from 表名 [where ];  
        • 模糊搜索:select * from table where name like '%m%' or password like '%m%' ;搜索姓名或密码含有m 的用户
        • 加入limit 限制语句,limit 0,5 ; 限制从第1-5行的记录
     
    •  JDBC操作步骤
      • 连接数据库
        • 配置MySQL数据库的驱动程序
          • 下载 mysql-connector-java-5.1.39.zip,复制到jdk的所在处
            1. public class jdbc {
            2. public static final String DRIVER="org.gjt.mm.mysql.Driver";
            3. public static void main(String[] args){
            4. try{
            5. System.out.println(Class.forName(DRIVER)) ;
            6. }catch(ClassNotFoundException e){
            7. e.printStackTrace() ;
            8. }
            9. }
            10. }          
          • 若能输出Class名,则已配置好了
          • 为什么调用Class.forName(),却没有newInstance(); 
            • Class.forName() 加载了指定类后,若类中有静态初始化器,JVM必然会执行该类的静态代码段,而JDBC的Driver类都是会有static代码块  
     
        • DriverManager
          • getConnection(String url, String user ,String password) :通过连接地址链接数据库,同时输入用户名和密码
          • url:  jdbc:mysql://  ip地址 : 端口号/ 数据库名称             
            • jdbc协议:JDBC URL中的协议总是jdbc
            • 子协议:驱动程序名或数据库连接机制(这种机制可由一个或多个驱动程序支持)的名称,如mysql
            • 子名称:一种标识数据库的方法,必须遵循”//主机名 : 端口/子协议"  的标准URL命名    约定
          • Connection接口
     
        • 执行数据库的更新操作
          • Statement接口,通过Connection接口的createStatement()方法实例化,来操作数据库
            1. public static final String DRIVER="org.gjt.mm.mysql.Driver";
            2. public static final String URL="jdbc:mysql://localhost:3306/newsql";
            3. public static final String USERNAME="root";
            4. public static void main(String[] args)throws Exception{
            5. Connection conn=null;
            6. Statement statement=null;
            7. String sql="insert into newtable(name) values('ccw')";
            8. try{
            9. Class.forName(DRIVER); //加载驱动
            10. }catch(ClassNotFoundException e){
            11. e.printStackTrace() ;
            12. }
            13. conn=DriverManager.getConnection(URL,USERNAME,USERNAME);
            14. statement=conn.createStatement();
            15. statement.executeUpdate(sql);
            16. try{
            17. statement.close();     //先开后关闭,可以只关闭connection
            18. conn.close();
            19. }catch(Exception e){
            20. e.printStackTrace();
            21. }
            22. }
    • ResultSet接口
      • 接受所查询的记录,并显示内容,开发中要限制查询数量
      • Statement接口的executeQuery() 方法,返回一个ResultSet对象
        1. ResultSet rSet=statement.executeQuery(sql);
        2. while(rSet.next()){
        3. int id=rSet.getInt("id"); //int id=rSet.getInt(1);
        4. String name=rSet.getString("name"); //String name=rSet.getString(2);
        5. String sex=rSet.getString("sex"); //....
        6. System.out.println(id+name+sex);
        7. }
      • ResultSet的所有数据都可以通过getString()方法获得
     
    • PreparedStatement接口
      • 是Statement的子接口,属于预处理操作,与直接使用Statement不同的是,是先在数据表中准备好了一条SQL语句,但是此SQL语句的具体内容暂时不设置,而是之后在进行设置,即占住此位置等待用户设置
        1. String sql="insert into newtable(name,sex) values(?,?)";
        2. pStatement=conn.prepareStatement(sql); //实例化
        3. pStatement.setString(1, name);
        4. pStatement.setString(2, sex);
        5. pStatement.executeUpdate();
      • 注意:开发中不建议使用Statement来操作数据库,而是使用PreparedStatement,因为Statement是完整的SQL语句

    • 处理大数据对象——必须使用PreparedStatement
      • CLOB:存储海量文字
      • BLOB    存储二进制数据
      • 写入大对象数据——IO流的模式
      • 读取大对象数据
        • 处理CLOB
          • 使用Clob操作比InputStream更加方便
            1. String sql="select name,note from bigtable where id =?";
            2. pStatement=conn.prepareStatement(sql);
            3. pStatement.setInt(1, 1);
            4. ResultSet rs=pStatement.executeQuery();
            5. while(rs.next()){
            6. String name=rs.getString(1);
            7. Clob clob=rs.getClob(2);
            8. String note=clob.getSubString(1, (int)clob.length());
            9. System.out.println(name+" "+note);
            10. }
        • 处理BLOB
          • 创建表:create table userBlob(id int auto_increment primary key,name char(30), photo longblob) ;
            • 存储图片
              1. String sql="insert into userblob(name, photo) values(?,?)";
              2. pStatement=conn.prepareStatement(sql);
              3. File file=new File("d:"+File.separator+"my.jpg");
              4. InputStream input=new FileInputStream(file);
              5. pStatement.setString(1, name);
              6. pStatement.setBinaryStream(2, input);
              7. pStatement.executeUpdate();
          • 使用BLOB方法更加方便
              1. if(rSet.next()){
              2. String name=rSet.getString(1);
              3. Blob blob=rSet.getBlob(2);
              4. FileOutputStream output=new FileOutputStream(newFile("d:"+File.separator+"you.jpg"));
              5. output.write(blob.getBytes(1,(int)blob.length()));
              6. output.close();
              7. }

    • CallableStatement接口——主要调用数据库中的存储过程
      • 即为一种方法,可以调用, 传递参数  
        1. delimiter // //这里是改变执行操作语句的分隔符,也就是将SQL语句的";"结尾符号改为"//"
        2. drop procedure myproc //
        3. create procedure myproc(IN p1 int, INOUT p2 int ,OUT p3 int)
        4. begin
        5. select p1,p2,p3 ;
        6. set p1=10;
        7. set p2=20;
        8. set p3=30;
        9. end
        10. //
      • 3个类型
        • IN(默认的类型):表示只是将值传进来
        • INOUT:表示把值传递到过程中,可以保留过程对此值得修改值
        • OUT:可以不传递内容进来,过程中对此值得操作可以返回
        1. String sql="{call myproc(?,?,?)}";
        2. CallableStatement cstmt=conn.prepareCall(sql);
        3. cstmt.setInt(1,70);
        4. cstmt.setInt(2,80);
        5. cstmt.registerOutParameter(2,Types.INTEGER);     //设置返回值类型
        6. cstmt.registerOutParameter(3,Types.INTEGER);
        7. cstmt.execute();

    • JDBC2.0
      • ResultSet的更新

        • 设置ResultSet的类型:TYPER_XXX设置类型,表示是否可以滚动以及是否可以修改数据表的内容
        • 设置CONCUR_XXX设置的都是并发性,并发性主要表示结果集是否是只读还是可以进行数据库更新
      • 可滚动的结果集——现在想取结果集中任意位置的数据
          1. PreparedStatement pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL SENSITIVE,ResultSet.CONCUR_READ_ONLY);                    
        • 使用结果集插入数据
            1. PreparedStatement pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATE);
            2. ResultSet rs=pstmt.executeQuery();
            3. rs.movetoInsertRow(); //移动到可插入的行
            4. rs.updateString("name","李华");
            5. ...
            6. rs.insertRow(); //插入数据
      • 批处理
          1. for(int i=0;i<10;i++){
          2. ps.setString(1,"ccw"+i );
          3. ps.setString(2, "nan"+i);
          4. ps.addBatch();
          5. }
          6. ps.executeBatch();  

    • 事务处理
      • 原子性:最小的单元,如果一个是失败了,则一切的操作将全部失败。
      • 一致性:如果事务出现错误,则回到最原始的状态
      • 隔离性:多个事务之间无法访问,只有当事务完成后才可以看到结果
      • 持久性:当一个系统崩溃时,一个事务依然可以提交,当事务完成后,操作结果保存在磁盘中,不会被回滚
        • 数据库把每一个连接到此数据库上的用户都称为一个session,如下是步骤
          • 取消自动提交, set autocommit=0 ,所有更新指令并不会立刻发送到数据表中,只存于当前的session
          • 开启事务:      start transaction 或者 begin
          • 编写数据库更新语句(增加、删除、修改),可以记录事务的保存点,使用savepoint
          • 提交事务:  commit 
          • 事务回滚:  rollback 或者  rollback to savepoint     如果执行的sql语句有错误,则回滚

    • 使用元数据分析数据库
      • DatabaseMetaDate
        • 得到数据库的名称、版本、表的信息
        • 实例化   DatabaseMetaDate dmd=connection.getMetData(); 
      • ResultSetMetaData
        • 可获取关于ResultSet对象中列的类型和属性信息的对象
        • 实例化: ResultSetMetaData rsmd =preparedStatement.getMetaData();
    • 使用JDBC链接Oracle数据库
      • 对于每一种驱动的改动都不是很大,所以我这里也就不简单讲了,具体的呢就可以去查查吧。
  • 相关阅读:
    LeetCode Flatten Binary Tree to Linked List
    LeetCode Longest Common Prefix
    LeetCode Trapping Rain Water
    LeetCode Add Binary
    LeetCode Subsets
    LeetCode Palindrome Number
    LeetCode Count and Say
    LeetCode Valid Parentheses
    LeetCode Length of Last Word
    LeetCode Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/Cruyse/p/6926275.html
Copyright © 2011-2022 走看看