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;
 20     private static final int USER_DELETE = USER_UPDATE + 1;
 21     private static final int USER_INFO = USER_DELETE + 1;
 22     private static final int USER_TRANSFER = USER_INFO + 1;
 23     private static final int USER_QUIT = USER_TRANSFER + 1;
 24     private static final int EXIT = USER_QUIT + 1;
 25
 26     UserInfo user = null;
 27
 28     public static void main(String[] args) {
 29         Service serv = new Service();
 30         serv.start();
 31     }
 32
 33     private void start() {
 34         welcome();
 35         int code = getCode();
 36         execute(code);
 37     }
 38
 39     /**
 40      * 执行选择
 41      * Description:
 42      */
 43     private void execute(int code) {
 44         switch (code) {
 45         case USER_REG:
 46             user_reg();
 47             break;
 48         case USER_LOGIN:
 49             user_login();
 50             break;
 51         case USER_UPDATE:
 52             user_update();
 53             break;
 54         case USER_DELETE:
 55             user_delete();
 56             break;
 57         case USER_INFO:
 58             user_info();
 59             break;
 60         case USER_TRANSFER:
 61             user_transfer();
 62             break;
 63         case USER_QUIT:
 64             user_quit();
 65             break;
 66         case EXIT:
 67             exit();
 68             break;
 69         default:
 70             System.out.println("输入错误,请重新输入");
 71             start();
 72             break;
 73         }
 74     }
 75
 76     /**
 77      * Description:
 78      */
 79     private void exit() {
 80         // TODO Auto-generated method stub
 81         if(null != this.user) {
 82             System.out.println("当前用户还没有退出,所以执行自动退出当前用户");
 83             user_quit();
 84         }else {
 85             System.out.println("你选择了退出系统");
 86             System.out.println("系统退出成功");
 87         }
 88
 89     }
 90
 91     /**
 92      * 退出当前用户
 93      * Description:
 94      */
 95     private void user_quit() {
 96         // TODO Auto-generated method stub
 97         if(null != this.user) {
 98             System.out.println("你选择了退出当前用户功能");
 99             this.user = null;
100             if(null == this.user) {
101                 System.out.println("成功退出当前用户");
102             }else {
103                 System.out.println("退出当前用户失败");
104             }
105         }else {
106             System.out.println("你还没有登录成功,还不能使用该功能");
107             System.out.println("请登录!");
108             user_login();
109         }
110         start();
111     }
112
113     /**
114      * 转账功能
115      * Description:
116      */
117     private void user_transfer() {
118         // TODO Auto-generated method stub
119         if(null != this.user) {
120             System.out.println("你选择了转账功能!");
121             Scanner scanner = new Scanner(System.in);
122             System.out.println("请输入转入账户的用户名:");
123             String name = scanner.nextLine();
124             System.out.println("请输入转账金额:");
125             int money = Integer.parseInt(scanner.nextLine());
126
127             Connection conn = null;
128             try {
129                 Class.forName("com.mysql.jdbc.Driver");
130                 conn = DriverManager.getConnection(
131                         "jdbc:mysql://localhost:3306/test",
132                         "root",
133                         "182838");
134                 Statement state = conn.createStatement();
135
136                 //转出
137                 String out_sql = "UPDATE userinfo_fury "
138                         + "SET account = account - ‘"+money+"‘ "
139                         + "WHERE username = ‘"+this.user.getUsername()+"‘ ";
140                 int judge01 = state.executeUpdate(out_sql);
141                 if(judge01 > 0) {
142                     System.out.println("转出成功");
143                 }else {
144                     System.out.println("转出失败");
145                 }
146
147                 //转入
148                 String in_sql = "UPDATE userinfo_fury "
149                         + "SET account = account + ‘"+money+"‘ "
150                         + "WHERE username = ‘"+name+"‘ ";
151                 int judge02 = state.executeUpdate(in_sql);
152                 if(judge02 > 0) {
153                     System.out.println("转入成功");
154                 }else {
155                     System.out.println("转入失败");
156                 }
157             }catch(Exception e) {
158                 e.printStackTrace();
159             }finally {
160                 if(null != conn) {
161                     try {
162                         conn.close();
163                     }catch(SQLException e1) {
164                         e1.printStackTrace();
165                     }
166                 }
167             }
168         }else {
169             System.out.println("请先登录!");
170             user_login();
171         }
172         start();
173     }
174
175     /**
176      * 查询表中的所有数据
177      * Description:
178      */
179     private void user_info() {
180         // TODO Auto-generated method stub
181         if(null != this.user) {
182             System.out.println("你选择了查询所有用户功能!");
183             Connection conn = null;
184             try {
185                 Class.forName("com.mysql.jdbc.Driver");
186                 conn = DriverManager.getConnection(
187                         "jdbc:mysql://localhost:3306/test",
188                         "root",
189                         "182838");
190                 Statement state = conn.createStatement();
191                 String sql = "SELECT id,username,password,email,nickname,account "
192                         + "FROM userinfo_fury ";
193                 ResultSet rs = state.executeQuery(sql);
194                 List<UserInfo> list = new ArrayList<UserInfo>();
195
196                 while(rs.next()) {
197                     int id = rs.getInt("id");
198                     String username = rs.getString("username");
199                     String password = rs.getString("password");
200                     String email = rs.getString("email");
201                     String nickname = rs.getString("nickname");
202                     double account = rs.getDouble("account");
203                     UserInfo userinfo = new UserInfo(id, username, password, email, nickname, account);
204                     list.add(userinfo);
205                 }
206                 for(UserInfo lis : list) {
207                     System.out.println(lis);
208                 }
209             }catch(Exception e) {
210                 e.printStackTrace();
211             }finally {
212                 if(null != conn) {
213                     try {
214                         conn.close();
215                     }catch(SQLException e1) {
216                         e1.printStackTrace();
217                     }
218                 }
219             }
220         }else {
221             System.out.println("请先登录");
222             user_login();
223         }
224         start();
225     }
226
227     /**
228      * 删除用户
229      * Description:
230      */
231     private void user_delete() {
232         // TODO Auto-generated method stub
233         if(null != this.user) {
234             System.out.println("你选择了删除用户功能");
235             System.out.println("你不是超级用户,你无法使用删除用户功能");
236         }else {
237             System.out.println("请先登录!");
238             user_login();
239         }
240         start();
241     }
242
243     /**
244      * 修改用户信息
245      * Description:
246      */
247     private void user_update() {
248         // TODO Auto-generated method stub
249         if(null != this.user) {
250             System.out.println("你选择了修改当前用户功能!");
251             //可改进 -->> 可由用户选择需要修改的字段
252             System.out.println("你当前的昵称为:" + this.user.getNickname());
253             Scanner scanner = new Scanner(System.in);
254             System.out.println("你想将你的昵称修改为:");
255             String nickname = scanner.nextLine();
256
257             Connection conn = null;
258             try {
259                 Class.forName("com.mysql.jdbc.Driver");
260                 conn = DriverManager.getConnection(
261                         "jdbc:mysql://localhost:3306/test",
262                         "root",
263                         "182838");
264                 Statement state = conn.createStatement();
265
266                 String sql = "UPDATE userinfo_fury "
267                         + "SET nickname = ‘"+nickname+"‘ "
268                         + "WHERE username = ‘"+this.user.getUsername()+"‘ ";
269                 int judge = state.executeUpdate(sql);
270                 if(judge > 0) {
271                     this.user.setNickname(nickname);
272                     System.out.println("修改昵称成功,当前昵称为:" + this.user.getNickname());
273                 }else {
274                     System.out.println("修改昵称失败");
275                 }
276             }catch(Exception e) {
277                 e.printStackTrace();
278             }finally {
279                 if(null != conn) {
280                     try {
281                         conn.close();
282                     }catch(SQLException e1) {
283                         e1.printStackTrace();
284                     }
285                 }
286             }
287         }else {
288             System.out.println("请登录成功后在进行此操作!");
289             user_login();
290         }
291         start();
292     }
293
294     /**
295      * 用户登录
296      * Description:
297      */
298     private void user_login() {
299         // TODO Auto-generated method stub
300         System.out.println("你选择了用户登录功能!");
301         Scanner scanner = new Scanner(System.in);
302         System.out.println("请输入用户名:");
303         String username = scanner.nextLine();
304         System.out.println("请输入密码:");
305         String password = scanner.nextLine();
306
307         Connection conn = null;
308         try {
309             Class.forName("com.mysql.jdbc.Driver");
310             conn = DriverManager.getConnection(
311                     "jdbc:mysql://localhost:3306/test",
312                     "root",
313                     "182838");
314             Statement state = conn.createStatement();
315
316             String sql = "SELECT id, username, password,email, nickname,account "
317                     + "FROM userinfo_fury "
318                     + "WHERE username = ‘"+username+"‘ "
319                     + "AND password = ‘"+password+"‘ ";
320             System.out.println(sql);
321             ResultSet rs = state.executeQuery(sql);
322             if(rs.next()) {
323                 int id = rs.getInt("id");
324                 String name = rs.getString("username");
325                 String word = rs.getString("password");
326                 String email = rs.getString("email");
327                 String nickname = rs.getString("nickname");
328                 double account = rs.getDouble("account");
329                 UserInfo userinfo = new UserInfo(id, name, word, email, nickname, account);
330                 this.user = userinfo;
331                 System.out.println("登录成功,你的昵称为:" + this.user.getNickname());
332             }else {
333                 System.out.println("登录失败:" + this.user);
334             }
335             /*
336              * 注意:
337              *         当用户输入的密码个的格式是:    任意字符‘ or ‘数值开头      时无论用户名和密码正确与否,都会登录成功
338              *         因为  如果这样输入就改变了 SQL 语句的原意(在SQL语句中AND的优先级要高于OR)
339              *         实例 : asdfaer1234‘ or ‘1
340              */
341         }catch(Exception e) {
342             e.printStackTrace();
343         }finally {
344             if(null != conn) {
345                 try {
346                     conn.close();
347                 }catch(SQLException e1) {
348                     e1.printStackTrace();
349                 }
350             }
351         }
352         start();
353     }
354
355     /**
356      * 用户注册
357      * Description:
358      */
359     private void user_reg() {
360         System.out.println("你选择了用户注册功能!");
361         Scanner scanner = new Scanner(System.in);
362         System.out.println("请输入用户名:");
363         String username = scanner.nextLine();
364         System.out.println("请输入密码:");
365         String password = scanner.nextLine();
366         System.out.println("请输入邮箱:");
367         String email = scanner.nextLine();
368         System.out.println("请输入昵称:");
369         String nickname = scanner.nextLine();
370         Connection conn = null;
371         try {
372             Class.forName("com.mysql.jdbc.Driver");
373             conn = DriverManager.getConnection(
374                     "jdbc:mysql://localhost:3306/test",
375                     "root",
376                     "182838");
377             Statement state = conn.createStatement();
378             String sql = "INSERT INTO userinfo_fury "
379                     + "(username,password,email,nickname) "
380                     + "VALUES "
381                     + "(‘"+username+"‘,‘"+password+"‘,‘"+email+"‘,‘"+nickname+"‘)";
382             int judge = state.executeUpdate(sql);
383             if(judge > 0) {
384                 System.out.println("注册成功");
385             }else {
386                 System.out.println("注册失败");
387             }
388         }catch(Exception e) {
389             e.printStackTrace();
390         }finally {
391             if(null != conn) {
392                 try {
393                     conn.close();
394                 }catch(SQLException e1) {
395                     e1.printStackTrace();
396                 }
397             }
398         }
399         start();
400     }
401
402     /**
403      * 功能选择
404      * Description:
405      */
406     private int  getCode() {
407         System.out.println("请选择功能:");
408         Scanner scanner = new Scanner(System.in);
409         int code = Integer.parseInt(scanner.nextLine());
410         return code;
411     }
412
413     /**
414      * 界面信息
415      * Description:
416      */
417     private void welcome() {
418         System.out.println("欢迎使用用户登录系统!");
419         System.out.println("请输入需要操作的功能序号");
420         System.out.println("======================");
421         System.out.println("================");
422         System.out.println("1 : 用户注册");
423         System.out.println("2 : 用户登录");
424         System.out.println("3 : 修改用户信息");
425         System.out.println("4 : 删除用户");
426         System.out.println("5 : 查看所有用户信息");
427         System.out.println("6 : 转账业务");
428         System.out.println("7 : 用户退出");
429         System.out.println("8 : 退出系统");
430         System.out.println("================");
431         System.out.println("======================");
432     }
433 }

时间: 2024-07-30 04:07:12

JDBC01 利用JDBC连接数据库【不使用数据库连接池】的相关文章

【转】JDBC学习笔记(8)——数据库连接池(dbcp&amp;C3P0)

转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 二.这种模式开发,存在的问题: 1)普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载进内存中,再验证用户名和密码(得花费0.05s~1s的时间).需要数据库连接

JDBC基础学习(六)&mdash;数据库连接池

一.数据库连接池介绍 1.数据库连接池的缘由      对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库应用,情况就完全不同了.频繁的建立.关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈.      连接复用.通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连接可以得到高效.安全的复用,避免了数据库连接频繁建立.关闭

关于利用动态代理手写数据库连接池的异常 java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection

代码如下: final Connection conn=pool.remove(0); //利用动态代理改造close方法 Connection proxy= (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object pro

数据库连接池简单介绍和 C3P0的JDBC配置

前面一节我们介绍了怎样利用jdbc连接数据库,已经实现了数据库的连接,可是在实际的项目开发中,能够发现基本上都使用了数据库连接池技术.为什么要使用数据库连接池呢?根源在于对数据库连接的低效管理 答: 普通的JDBC数据库连接,用户请求一次查询的时候就会向数据库发起一次连接.运行完后就断开连接,这种方式会消耗大量的资源和时间.数据库的连接资源并没有得到非常好的重复利用. 若是同一时候有几百人甚至几千人在线.频繁地进行数据库连接操作,这将会占用非常多的系统资源,严重的甚至会造成server的奔溃.这

JAVA JDBC 数据库连接池

1.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接 进行sql操作 断开数据库连接 这种模式开发,存在的问题: 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s-1s的时间).需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接.这样的方式将会消耗大量的资

JDBC数据库连接池技术

在JDBC中,获得连接或释放资源是非常消耗系统资源的两个过程,为了解决此类性能问题,通常采用连接池技术,来共享连接.这样我们就不需要每次都创建连接.释放连接了,这些操作都交给了连接池. 用池的概念来管理Connection,这样可以重复使用Connection.有了连接池以后就不用自己亲自创建连接而是通过连接池来获得Connection对象.当使用完Connection之后,调用Connection的close()方法不是真的将连接关闭,而是把Connection归还给连接池.连接池就可以继续保

01_数据库连接池,数据源,ResultSetMetaData,jdbc优化

 一.数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接. 这样的方式会导致用户每次请求都要向数据库建立链接而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.宕机. 解决方案就是数据库连接池 连接池就是数据库连接对象的一个缓冲池 我们可以先创建10个数

java 利用c3p0管理数据库连接池

数据库连接池类,用于获取数据库连接.利用单例模式保证所有的连接都只通过一个连接池管理. package com.mousewheel.dbcon; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import com.mchange.v2.c3p0.ComboPooledDataSource; public clas

JDBC整合c3p0数据库连接池 解决Too many connections错误

前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too man