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>
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;
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 }
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 }
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 }
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 }
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 连接到 SQL Server 2008 数据库?