JDBC01 利用JDBC连接数据库不使用数据库连接池

Posted 寻渝记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC01 利用JDBC连接数据库不使用数据库连接池相关的知识,希望对你有一定的参考价值。

 目录:

  1 什么是JDBC

  2 JDBC主要接口

  3 JDBC编程步骤【学渣版本】

  5 JDBC编程步骤【学神版本】

  6 JDBC编程步骤【学霸版本】

 

1 什么是JDBC

  JDBC是JAVA提供的一套标准连接数据库的接口,规定了连接数据库的步骤和功能;不同的数据库提供商提供了一套JDBC实现类,他们称为数据库驱动。

 

2 JDBC的主要接口

   Connection  与数据库连接有关

   DriverManager   与创建数据库连接对象有关

   Statement  与执行SQL语句有关

   ResultSet  与返回的结果及有关

   注意:通过JDBC操作数据库是自动提交的,当然也可是设置成手动提交

 

3 利用JDBC操作数据库的步骤【学渣版本】

  3.1 导入数据库驱动

    Class.forName(“数据库驱动包”);

    注意:Class.forName的底层实际上是利用的java反射机制

    例如:Class.forName("com.mysql.jdbc.Driver"); //mysql驱动包的固定写法

  3.2 创建连接

    Connection conn = DriverManager.getConnection(“jdbc:mysql:// + IP + : + 端口 +  / + 数据库名称”,“数据库用户名”,“密码”);

    注意:DriverManager是一个驱动管理类,通过调用该类的静态方法DriverManager来创建连接对象

    例如:  Connection conn = DriverManager.getConnection(
           "jdbc:mysql://localhost:3306/test", // jdbc:mysql:// + IP + : + 端口 + / + 数据库名称  
               "root", // 用户名
           "182838"); // 用户密码

  3.3 创建语句对象

    Statement state = conn.createStatement();

    注意:利用连接对象来创建语句对象

  

  3.4 执行SQL语句

    ResultSet executeQuery(String sql)

      用来执行查询语句(DQL)的方法,返回的是一个查询结果集

    Integer executUpdate(String sql)

      用来执行DML语句的方法,返回值为执行了该DML后影响了数据库中多少条数据

    boolean execute(String sql)     

        可以执行所有类型的SQL语句,但是DQL,DML都有专门的方法,所以该方法通常
      用来执行DDL语句.当返回值为true时表示该SQL语句执行后有结果集,没有结果集
      的都是返回的false.(并不是根据语句的对错来返回true或者false)

    注意:利用语句对象来执行SQL语句,DQL指查询,DML指修改、删除、插入,DDL指新建

       注意:如果是查询语句会得到一个结果集,结果集类型是ResultSet,可对结果集进行遍历

      

  3.5 遍历结果集

    

  3.6 关闭语句对象、关闭连接对象

    执行对象.close();

    连接对象.close();

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 2   <modelVersion>4.0.0</modelVersion>
 3   <groupId>cn.xiangxu</groupId>
 4   <artifactId>testJDBC</artifactId>
 5   <version>0.0.1-SNAPSHOT</version>
 6   <dependencies>
 7       <dependency>
 8           <groupId>mysql</groupId>
 9           <artifactId>mysql-connector-java</artifactId>
10           <version>5.1.37</version>
11       </dependency>
12       <dependency>
13           <groupId>junit</groupId>
14           <artifactId>junit</artifactId>
15           <version>4.12</version>
16       </dependency>
17   </dependencies>
18 </project>
maven依赖包
 1 CREATE TABLE user (
 2     id INT (10)  PRIMARY KEY,
 3     name VARCHAR (10),
 4     pwd VARCHAR (10)
 5 );
 6 
 7 DESC USER;
 8 
 9 DROP TABLE user;
10 
11 SELECT * FROM user;
SQL语句
 1 package testJDBC;
 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 import org.junit.Test;
10 
11 public class TestCase {
12     @Test
13     public void test01() {
14         Connection conn = null;
15         try {
16             // 01 导入驱动模块
17             Class.forName("com.mysql.jdbc.Driver");
18             
19             // 02 初始化连接对象(以为在之前就创建了,进行初始化就行啦)
20             conn = DriverManager.getConnection(
21                     "jdbc:mysql://localhost:3306/test", "root", "182838");
22             
23             // 03 创建执行对象
24             Statement state = conn.createStatement();
25             
26             String sql = "SELECT * FROM user ";
27             
28             // 04 执行SQL语句
29             ResultSet rs = state.executeQuery(sql);  // 查询结果的类型为ResultSet
30             
31             // 05 遍历查询结果
32             while(rs.next()) {  // 遍历结果集
33                 System.out.println(rs.getString("name"));  
34             }
35             
36             // 06 关闭执行对象、连接对象
37             state.close();
38             conn.close();
39             
40         } catch (ClassNotFoundException e) {
41             // TODO Auto-generated catch block
42             e.printStackTrace();
43         } catch (SQLException e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46         } finally {
47             if(null != conn) { // 判断连接是否关闭
48                 try {
49                     conn.close();
50                 } catch (SQLException e) {
51                     // TODO Auto-generated catch block
52                     e.printStackTrace();
53                 }
54             }
55         }
56         
57     }
58 }
java代码

 

 4 存在的问题

  4.1 重复编译问题

    利用 Statement对象执行SQL语句时每执行一条SQL语句在数据库端就会进行一次变异,如果是类似的SQL语句也是这样;严重加大了数据库的负担

    改进:利用预编译的Statement

        注意:预编译statement向数据库中发送一个sql语句,数据库编译sql语句,并把编译的结果保存在数据库砖的缓存中。下次再发sql时,如果sql相同,则不会再编译,直接使用缓存中的。

  4.2 释放资源问题  

    程序执行后应该对 结果集、执行对象、连接对象进行释放,而且在finally那里还需要判断是否成功释放(注意:try里面定义的变量在finally是获取不到的)

    改进:在程序的最前面定义 连接对象、执行对象、结果集对象;在程序结束后调用各自的close方法来释放资源,在finally中判断这三个对象是否成功关闭

 

5 jdbc编程步骤【学神版本】

  加载数据库驱动

  创建并获取数据库链接

  创建jdbc statement对象

  设置sql语句

  设置sql语句中的参数(使用preparedStatement)

  通过statement执行sql并获取结果

  对sql执行结果进行解析处理

  释放资源(resultSet、preparedstatement、connection)

 1 package testJDBC;
 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 org.junit.Test;
10 
11 public class TestCase {
12     @Test
13     public void test01() {
14         Connection conn = null;
15         PreparedStatement ps = null;
16         ResultSet rs = null;
17         try {
18             Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动
19             
20             conn = DriverManager.getConnection( // 初始化连接对象
21                     "jdbc:mysql://localhost:3306/test", "root", "182838");
22             
23             
24             String sql = "SELECT * FROM user WHERE pwd = ? "; // 拼接SQL语句,位置参数用?代替
25             
26             ps = conn.prepareStatement(sql); // 初始化预编译执行对象
27             
28             ps.setString(1, "182838"); // 设置SQL语句中的位置位置参数(注意:是从1开始数不是从0开始数)
29             
30             rs = ps.executeQuery(); // 执行SQL语句
31             
32             while(rs.next()) { // 遍历结果集
33                 System.out.println("====================");
34                 System.out.println(rs.getInt("id"));
35                 System.out.println(rs.getString("name"));
36                 System.out.println(rs.getString("pwd"));
37             }
38             
39             // 释放资源
40             rs.close();
41             ps.close(); 
42             conn.close();
43             
44         } catch (Exception e) {
45             // TODO Auto-generated catch block
46             e.printStackTrace();
47         } finally {
48             if(rs != null) {
49                 try {
50                     rs.close();
51                 } catch (SQLException e) {
52                     // TODO Auto-generated catch block
53                     e.printStackTrace();
54                 }
55             }
56             if(ps != null) {
57                 try {
58                     ps.close();
59                 } catch (SQLException e) {
60                     // TODO Auto-generated catch block
61                     e.printStackTrace();
62                 }
63             }
64             if(conn != null) {
65                 try {
66                     conn.close();
67                 } catch (SQLException e) {
68                     // TODO Auto-generated catch block
69                     e.printStackTrace();
70                 }
71             }
72         }
73         
74     }
75 }
优化后的java代码

 

6 可优化的地方【学霸版本】

  没有将查询到的结果封装换成一个对象

 1 package cn.xiangxu.entity;
 2 
 3 import java.io.Serializable;
 4 
 5 public class User implements Serializable {
 6 
 7     private static final long serialVersionUID = -5109978284633713580L;
 8     
 9     private Integer id;
10     private String name;
11     private String pwd;
12     public User() {
13         super();
14         // TODO Auto-generated constructor stub
15     }
16     public User(Integer id, String name, String pwd) {
17         super();
18         this.id = id;
19         this.name = name;
20         this.pwd = pwd;
21     }
22     @Override
23     public int hashCode() {
24         final int prime = 31;
25         int result = 1;
26         result = prime * result + ((id == null) ? 0 : id.hashCode());
27         return result;
28     }
29     @Override
30     public boolean equals(Object obj) {
31         if (this == obj)
32             return true;
33         if (obj == null)
34             return false;
35         if (getClass() != obj.getClass())
36             return false;
37         User other = (User) obj;
38         if (id == null) {
39             if (other.id != null)
40                 return false;
41         } else if (!id.equals(other.id))
42             return false;
43         return true;
44     }
45     public Integer getId() {
46         return id;
47     }
48     public void setId(Integer id) {
49         this.id = id;
50     }
51     public String getName() {
52         return name;
53     }
54     public void setName(String name) {
55         this.name = name;
56     }
57     public String getPwd() {
58         return pwd;
59     }
60     public void setPwd(String pwd) {
61         this.pwd = pwd;
62     }
63     @Override
64     public String toString() {
65         return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";
66     }
67     
68     
69 
70 }
user表对应的实体类
 1 package testJDBC;
 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.util.ArrayList;
 9 import java.util.List;
10 
11 import org.junit.Test;
12 
13 import cn.xiangxu.entity.User;
14 
15 public class TestCase {
16     @Test
17     public void test01() {
18         Connection conn = null;
19         PreparedStatement ps = null;
20         ResultSet rs = null;
21         try {
22             Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动
23             
24             conn = DriverManager.getConnection( // 初始化连接对象
25                     "jdbc:mysql://localhost:3306/test", "root", "182838");
26             
27             
28             String sql = "SELECT * FROM user WHERE pwd = ? "; // 拼接SQL语句,位置参数用?代替
29             
30             ps = conn.prepareStatement(sql); // 初始化预编译执行对象
31             
32             ps.setString(1, "182838"); // 设置SQL语句中的位置位置参数(注意:是从1开始数不是从0开始数)
33             
34             rs = ps.executeQuery(); // 执行SQL语句
35             
36             List<User> users = new ArrayList<User>(); // 创建一个集合来存放记录对象
37             while(rs.next()) { // 遍历结果集
38 //                System.out.println("====================");
39 //                System.out.println(rs.getInt("id"));
40 //                System.out.println(rs.getString("name"));
41 //                System.out.println(rs.getString("pwd"));
42                 User user = new User();
43                 user.setId(rs.getInt("id"));
44                 user.setName(rs.getString("name"));
45                 user.setPwd(rs.getString("pwd"));
46                 users.add(user); // 向集合中添加元素
47             }
48             
49             System.out.println(users); // 打印输出集合
50             for(User user : users) {
51                 System.out.println(user);
52             }
53             
54             // 释放资源
55             rs.close();
56             ps.close(); 
57             conn.close();
58             
59         } catch (Exception e) {
60             // TODO Auto-generated catch block
61             e.printStackTrace();
62         } finally {
63             if(rs != null) {
64                 try {
65                     rs.close();
66                 } catch (SQLException e) {
67                     // TODO Auto-generated catch block
68                     e.printStackTrace();
69                 }
70             }
71             if(ps != null) {
72                 try {
73                     ps.close();
74                 } catch (SQLException e) {
75                     // TODO Auto-generated catch block
76                     e.printStackTrace();
77                 }
78             }
79             if(conn != null) {
80                 try {
81                     conn.close();
82                 } catch (SQLException e) {
83                     // TODO Auto-generated catch block
84                     e.printStackTrace();
85                 }
86             }
87         }
88         
89     }
90 }
对查询结果进行封装了的java代码

 

7 小案例

  用户登录、转账系统

  1 package day01;
  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 import java.util.ArrayList;
  9 import java.util.List;
 10 import java.util.Scanner;
 11 
 12 /**
 13  * 用户登录系统
 14  * Description: 
 15  */
 16 public class Service {
 17     private static final int USER_REG = 1;
 18     private static final int USER_LOGIN = USER_REG + 1;
 19     private static final int USER_UPDATE = USER_LOGIN + 1;
在 JDBC 连接上切换用户

JDBC

如何使用 JDBC 连接到 SQL Server 2008 数据库?

使用 Unix Socket 的 JDBC MySQL 连接

mysql+jdbc

Java JDBC 连接池(如何检查)?