你的位置:首页 > 软件开发 > Java > Jdbc访问数据库篇

Jdbc访问数据库篇

发布时间:2017-11-16 01:00:11
一万年太久,只争朝夕What JDBC上部JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持java.sql包中定义的常用的基本的 JDBC API:类 DriverManager-管理一组 ...

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文档:

代码展示

目录结构:

Jdbc访问数据库篇

 

 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 Administrator12  *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@5afec10733   34   //准备sql语句35   String sql = "select * from userinfo";36   37   //获取用于向数据库发送sql语句的statement38   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 stub23 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@5afec10735   36   //准备sql语句37   String sql = "insert into userinfo(uname,upass)values (?,?)";38   39   //获取用于向数据库发送sql语句的preparedStatement40   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 block124    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 block138    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;

Jdbc访问数据库篇

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

Jdbc访问数据库篇

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

Jdbc访问数据库篇

 

原标题:Jdbc访问数据库篇

关键词:数据库

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。