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 执行的结果:

 

posted @ 2017-11-16 00:18  文刀山豆几  阅读(456)  评论(1编辑  收藏  举报