zoukankan      html  css  js  c++  java
  • Jdbc访问数据库篇

    一万年太久,只争朝夕

    What JDBC

    上部

    JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持

    java.sql包中定义的常用的基本的 JDBC API:

    类 DriverManager-管理一组 JDBC 驱动程序的基本服务 接口 Connection-获得与特定数据库的连接

    接口 Statement-用于执行静态 SQL 语句并返回它所生成结果的对象

    接口 ResultSet-表示数据库结果集的数据表,通常通过执行

    查询数据库的语句生成 类 SQLException-有关数据库操作的异常

    使用JDBC 访问数据库的前提条件

    数据库的主机地址(IP地址)localhost 127.0.0.1 如果你访问的是别人的数据库,记得输入别人的IP

    端口号:oracle 1521 ,MySql 3306, SqlServer 1433 因为我连得数据库是oracle,Ojdbc14.jar包,千万别忘了

    数据的用户名/密码

    JDBC核心API

    Driver接口:驱动程序接口

    Connection connect(String url, Properties info) 用于连接数据库的方法

    可以使用驱动程序管理类获取这样的连接

    DriverManager.getConnection(String url, String user, String password)

    Connection 接口 :代表和数据库的连接

    Statement createStatement() 创建Statement接口的对象

    PreparedStatement prepareStatement(String sql) 创建PreparedStatement接口的对象

    Statement接口 用于执行静态sql语句

    int executeUpdate(String sql) 执行DDL和DML语句,如果不记得什么是DDL和DML,可以参考上一篇oracle基础

    ResultSet executeQuery(String sql) 执行DQL语句,同理

    PreparedStatement接口 : 用于执行预编译的sql语句

    int executeUpdate(String sql) 执行DDL和DML语句

    ResultSet executeQuery(String sql) 执行DQL语句

    ResultSet接口:表示数据库的结果集

    boolean next() 将光标转移到下一行的位置

    getXXX() 获取结果集中每列的值

    很少用,了解

    CallableStatement prepareCall(String sql)

    CallableStatement接口 :(了解)用于存储过程的SQL语句

     下部

    详解DriverManager类

    用DriverManager加载驱动,,获得与数据库的连接,

    驱动设备管理器进行连接

    Driver driver = new oracle.jdbc.OracleDriver();

    DriverManager.registerDriver(driver);

    //推荐使用该方法

    //驱动程序(只注册一次)

    Class.forName("oracle.jdbc.driver.OracleDriver");

    关于url 的写法

    jdbc:oracle:thin:@localhost:1521:orcl

    详解Connection

    用于与数据库的连接,数据库与客户端的打交道都是由Connection方法来完成的,常用方法:

    createStatement():创建向数据库发送sql的statement对象。

    prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

    setAutoCommit(boolean autoCommit):设置事务是否自动提交。

    commit() :提交事务。

    rollback() :回滚事务。

    详解Statement 接口

    Statement对象用于向数据库发送SQL语句, Statement对象常用方法:

    executeQuery(String sql) :用于向数据发送查询语句。

    executeUpdate(String sql):用于向数据库发送insert、update或delete语句

    详解ResultSet 接口

    ResultSet用于代表Sql语句的执行结果。开始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
      ResultSet既然获得数据库执行后的对象,提供了获取数据的get 方法
      获取指定类型的数据,例如:
        getString(int index)
        getString(String columnName)

      ResultSet还提供了对结果集进行滚动的方法:

    next():移动到下一行

    关于释放资源:

    切记一点,一定要记得关闭,还有就是先开的后关,后开的先关。

    详解部分参照API文档:

    代码展示

    目录结构:

     1 package Jdbc;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.ResultSet;
     6 import java.sql.SQLException;
     7 import java.sql.Statement;
     8 
     9 /**
    10  * statement 用于执行静态sql 但是实际开发很少用, PreparedStatement :用于执行预编译的sql语句
    11  * @author Administrator
    12  *
    13  */
    14 public class FirstJdbc {
    15     
    16     private static String user = "scott";
    17     private static String password = "tiger";
    18     private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    19     
    20     public static void main(String[] args) throws ClassNotFoundException, SQLException {
    21         
    22         // 加载驱动
    23         
    24         Class.forName("oracle.jdbc.driver.OracleDriver");
    25         
    26         //获取数据库连接
    27         
    28         Connection conn = DriverManager.getConnection(url, user, password);
    29         
    30         System.out.println(conn);
    31         // 下面是输出 conn 的结果 ;证明数据库连接成功
    32         //oracle.jdbc.driver.T4CConnection@5afec107
    33         
    34         //准备sql语句
    35         String sql =  "select * from userinfo";
    36         
    37         //获取用于向数据库发送sql语句的statement
    38         Statement stmt = conn.createStatement();
    39         //获取数据库连接对象
    40         ResultSet rs = stmt.executeQuery(sql);
    41         while(rs.next()){
    42             
    43             System.out.println("uname="+rs.getString("uname"));
    44             System.out.println("upass="+rs.getString("upass"));
    45         }
    46         //关闭连接,释放资源(遵循原则 先开喉管)
    47         rs.close();
    48         stmt.close();
    49         conn.close();
    50     }
    51 
    52     
    53 }

     1 package Jdbc;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 
    10 public class SecondJdbc {
    11 
    12     /**
    13      * PreparedStatement :用于执行预编译的sql语句,动态拼接sql    ?作为占位符, 可以有效的防止Sql注入的问题
    14      * 
    15      */
    16     private static Connection conn = null;
    17     private static String user = "scott";
    18     private static String password = "tiger";
    19     private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    20     
    21     public static void main(String[] args) throws ClassNotFoundException, SQLException { //为了使页面使页面干净,在这里处理的异常都向外抛出
    22         // TODO Auto-generated method stub
    23 
    24         // 加载驱动
    25         
    26         Class.forName("oracle.jdbc.driver.OracleDriver");
    27         
    28         //获取数据库连接
    29         
    30         Connection conn = DriverManager.getConnection(url, user, password);
    31         
    32         System.out.println(conn);
    33         // 下面是输出 conn 的结果 ;证明数据库连接成功
    34         //oracle.jdbc.driver.T4CConnection@5afec107
    35         
    36         //准备sql语句
    37         String sql =  "insert into userinfo(uname,upass)values (?,?)";
    38         
    39         //获取用于向数据库发送sql语句的preparedStatement
    40         PreparedStatement stmt = conn.prepareStatement(sql);
    41         //设置参数 注意这里的参数设置从1开始,不像数组等下标从0开始
    42         stmt.setString(1,"张作霖");
    43         stmt.setString(2, "123");
    44         //获取数据库连接对象
    45         int count = stmt.executeUpdate();
    46         //事务处理
    47         if(count>0){
    48             conn.commit();
    49         }else{
    50             //这里的rollback肯定执行不了,因为上面执行的sql(insert)用户名是可以重复的,用重名的可能性
    51             conn.rollback();
    52         }
    53         System.out.println("影响了"+count+"行");
    54         //关闭连接,释放资源(遵循原则 先开喉管)
    55     
    56         stmt.close();
    57         conn.close();
    58     }
    59 
    60 }
      1 package Jdbc;
      2 
      3 import java.sql.Connection;
      4 import java.sql.DriverManager;
      5 import java.sql.PreparedStatement;
      6 import java.sql.ResultSet;
      7 import java.sql.SQLException;
      8 
      9 import javax.naming.Context;
     10 import javax.naming.InitialContext;
     11 import javax.naming.NamingException;
     12 import javax.sql.DataSource;
     13 
     14 
     15 /**
     16  * 为了日后开发方便,不用频繁的获取驱动,获取连接,
     17  * 定义url ,数据库,用户名 等参数,所以自己封装Jdbc工具类
     18  *
     19  */
     20 public class JdbcUtils {
     21 
     22     //定义url 数据库用户名和密码
     23     private static Connection conn = null;
     24     private static PreparedStatement pst;
     25     private static String user = "scott";
     26     private static String password = "tiger";
     27     private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
     28 
     29     private JdbcUtils() {
     30     }
     31 
     32     //单例模式
     33     public static Connection getcConnection() {
     34         if (conn == null) {
     35             try {
     36                 Class.forName("oracle.jdbc.driver.OracleDriver");
     37                 conn = DriverManager.getConnection(url, user, password);
     38                 System.out.println("获取connection连接成功");
     39 
     40             } catch (ClassNotFoundException e) {
     41                 System.out.println("加载驱动失败");
     42                 e.printStackTrace();
     43             } catch (SQLException e) {
     44                 System.out.println("连接数据库失败");
     45                 e.printStackTrace();
     46             }
     47         }
     48         return conn;
     49 
     50     }
     51     //之前用作数据库连接池连接,自己封装,如果没有用请忽略
     52 /*    public static Connection getPoolConnection(){
     53         if(conn==null){
     54             try {
     55                 Context context = new InitialContext();
     56                 DataSource ds =
     57                  (DataSource) context.lookup("java:/comp/env/jdbc/oracleds");
     58                 conn = ds.getConnection();
     59                 System.out.println("连接池数据库成功!");
     60             } catch (NamingException e) {
     61                 System.out.println("连接池数据库失败!");
     62                 e.printStackTrace();
     63             } catch (SQLException e) {
     64                 System.out.println("连接池数据库失败!");
     65                 e.printStackTrace();
     66             }         
     67         }
     68 
     69         return conn;
     70     }*/
     71 
     72     //关闭连接
     73     public static void close() {
     74 
     75         try {
     76             if (conn != null) {
     77                 conn.close();
     78                 conn = null;
     79             }
     80             if (pst != null) {
     81                 pst.close();
     82                 pst = null;
     83             }
     84             System.out.println("关闭成功");
     85         } catch (SQLException e) {
     86             System.out.println("关闭失败");
     87             e.printStackTrace();
     88         }
     89 
     90     }
     91 
     92     // 执行更新操作
     93     public static int executeUpdate(String sql, Object[] obj) {
     94         int count = 0;
     95 
     96         try {
     97             pst = conn.prepareStatement(sql);
     98             if (obj != null) {
     99                 for (int i = 0; i < obj.length; i++) {
    100                     pst.setObject(i + 1, obj[i]);
    101                 }
    102             }
    103             count = pst.executeUpdate();
    104         } catch (SQLException e) {
    105             count = 0;
    106             e.printStackTrace();
    107         }
    108 
    109         return count;
    110     }
    111     //执行查询操作,带参数
    112     public static ResultSet executeQuery(String sql, Object obj[]) {
    113         ResultSet rs = null;
    114         try {
    115             pst = conn.prepareStatement(sql);
    116             if (obj != null) {
    117                 for (int i = 0; i < obj.length; i++) {
    118                     pst.setObject(i + 1, obj[i]);
    119                 }
    120             }
    121             rs = pst.executeQuery();
    122         } catch (SQLException e) {
    123             // TODO Auto-generated catch block
    124             e.printStackTrace();
    125         }
    126 
    127         return rs;
    128     }
    129     //执行查询操作.无参数
    130     public static ResultSet executeQuery(String sql) {
    131         ResultSet rs = null;
    132 
    133         try {
    134             pst = conn.prepareStatement(sql);
    135             rs = pst.executeQuery();
    136         } catch (SQLException e) {
    137             // TODO Auto-generated catch block
    138             e.printStackTrace();
    139         }
    140 
    141         return rs;
    142     }
    143     //开始事物
    144     public static void beginTransation() {
    145         try {
    146             conn.setAutoCommit(false);
    147             System.out.println("开始事物");
    148         } catch (SQLException e) {
    149             System.out.println("开始事物失败");
    150             e.printStackTrace();
    151         }
    152 
    153     }
    154     //提交事物
    155     public static void commit() {
    156         try {
    157             conn.commit();
    158             System.out.println("提交事物");
    159         } catch (SQLException e) {
    160             System.out.println("提交事物失败");
    161             e.printStackTrace();
    162         }
    163 
    164     }
    165     //回滚事物
    166     public static void rollback(){
    167         try {
    168             conn.rollback();
    169             System.out.println("回滚事务");
    170         } catch (SQLException e) {
    171             System.out.println("回滚事务失败");
    172             e.printStackTrace();
    173         }
    174     }
    175 }

    数据库表

    select * from userinfo;

    第一次代码FirstJdbc 执行的结果:

    第二次代码SecondJdbc 执行的结果:

  • 相关阅读:
    C语言编程练习51:今年暑假不AC
    C语言编程练习50:素数环
    C语言编程练习49:N皇后问题
    C语言编程练习48:士兵队列训练问题
    C语言编程练习47:看病要排队
    C语言编程练习46:度度熊学队列
    C语言编程练习44:产生冠军
    文言句式
    计算机网络
    计算机组成原理
  • 原文地址:https://www.cnblogs.com/shandouji1121/p/7842018.html
Copyright © 2011-2022 走看看