Java jdbc相关
JDBC:java database connectivity --- SUN公司提供的一套操作数据库的标准规范。
JDBC与数据库驱动的关系:接口与实现的关系。
JDBC规范:
DriverManager(类):用于注册驱动
Connection(接口): 表示与数据库创建的连接
Statement(接口): 操作数据库sql语句的对象
ResultSet(接口): 结果集或一张虚拟表
实现JDBC操作
//1、注册驱动
//2、创建连接
//3、得到执行sql语句的Statement对象
//4、执行sql语句,并返回结果
//5、处理结果
//6、关闭资源
一 java.sql.DriverManager类:创建连接
① 注册驱动
DriverManager.registerDiver(new com.mysql.jdbc.Driver());
//不建议使用,原因: 导致驱动被注册两次 , 强烈依赖数据库的驱动jar
解决办法:
Class.forName("com.mysql.jdbc.Driver);
② 与数据库建立连接
static Connection getConnection(String url, String user, String password) 试图建立到给定数据库 URL 的连接。
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/zzzz","root","pass");
二 java.sql.Connection 接口 是一个连接
接口的实现在数据库驱动中, 所有与数据库交互都是基于连接对象的.
Statement createStatement(); //创建操作sql语句的对象
Statement stmt = conn.createStatement();
三 java.sql.Statement 接口 :操作sql语句,并返回相应结果的对象
接口的实现在数据库驱动中, 用于执行静态sql语句并返回它所生成结果的对象
ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。
int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。
boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;
四 java.sql.ResultSet 接口 : 结果集(客户端存表数据的对象)
jdbc初试
1 package com.javaDemo.jdbcDemo; 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 //使用JDBC技术实现查询数据库数据,并显示在控制台中 10 public class Demo1 { 11 12 public static void main(String[] args) throws Exception { 13 Connection conn = null; 14 Statement stmt = null; 15 ResultSet rs = null; 16 try { 17 Class.forName("com.mysql.jdbc.Driver"); 18 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/zzzz","root",""); 19 stmt = conn.createStatement(); 20 rs = stmt.executeQuery("select * from users"); 21 //处理结果 22 while(rs.next()) { 23 System.out.println(rs.getObject(1)); 24 System.out.println(rs.getObject(2)); 25 System.out.println(rs.getObject(3)); 26 System.out.println(rs.getObject(4)); 27 System.out.println(rs.getObject(5)); 28 System.out.println("----------------"); 29 } 30 } catch (Exception e) { 31 e.printStackTrace(); 32 } finally { //关闭资源 33 if (rs!=null) { 34 try { 35 rs.close(); 36 } catch (Exception e) { 37 e.printStackTrace(); 38 }
rs=null; 39 } 40 if (stmt!=null) { 41 try { 42 stmt.close(); 43 } catch (Exception e) { 44 e.printStackTrace(); 45 } 46 stmt = null; 47 } 48 if (conn!=null) { 49 try { 50 conn.close(); 51 } catch (Exception e) { 52 e.printStackTrace(); 53 } 54 conn=null; 55 } 56 } 57 } 58 59 } 60
jdbc之CRUD(增删改查)
1.User.java
1 package com.javaDemo.crud; 2 3 public class User { 4 private String user_id; 5 private String first_name; 6 private String last_name; 7 public User() { 8 super(); 9 } 10 public User(String user_id, String first_name, String last_name) { 11 this.user_id = user_id; 12 this.first_name = first_name; 13 this.last_name = last_name; 14 } 15 public String getUser_id() { 16 return user_id; 17 } 18 public void setUser_id(String user_id) { 19 this.user_id = user_id; 20 } 21 public String getFirst_name() { 22 return first_name; 23 } 24 public void setFirst_name(String first_name) { 25 this.first_name = first_name; 26 } 27 public String getLast_name() { 28 return last_name; 29 } 30 public void setLast_name(String last_name) { 31 this.last_name = last_name; 32 } 33 @Override 34 public String toString() { 35 // TODO Auto-generated method stub 36 return user_id + "---" +first_name +"--"+last_name; 37 } 38 39 }
2.dbinfo.properties
3.DBUtils.java
1 package com.javaDemo.util; 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.ResourceBundle; 9 10 public class DBUtils { 11 private static String driverClass; 12 private static String url; 13 private static String username; 14 private static String password; 15 static { 16 //此对象是用于加载properties文件数据的 17 ResourceBundle rb = ResourceBundle.getBundle("dbinfo"); 18 driverClass = rb.getString("driverClass"); 19 url = rb.getString("url"); 20 username = rb.getString("username"); 21 password = rb.getString("password"); 22 try { 23 Class.forName(driverClass); 24 } catch (ClassNotFoundException e) { 25 e.printStackTrace(); 26 } 27 } 28 //得到连接的方法 29 public static Connection getConnection() throws Exception { 30 return DriverManager.getConnection(url,username,password); 31 } 32 33 //关闭资源的方法 34 public static void closeAll(ResultSet rs,Statement stmt,Connection conn) { 35 if (rs!=null) { 36 try { 37 rs.close(); 38 } catch (SQLException e) { 39 e.printStackTrace(); 40 } 41 rs = null; 42 } 43 if (stmt!=null) { 44 try { 45 stmt.close(); 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 } 49 stmt=null; 50 } 51 if (conn!=null) { 52 try { 53 conn.close(); 54 } catch (SQLException e) { 55 e.printStackTrace(); 56 } 57 conn=null; 58 } 59 } 60 }
4.testCRUD.java
1 package com.javaDemo.crud; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.Statement; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 import org.junit.Test; 10 11 import com.itheima.util.DBUtils; 12 13 public class TestCRUD { 14 @Test 15 public void testSelect() { 16 Connection conn = null; 17 Statement stmt = null; 18 ResultSet rs = null; 19 try { 20 conn = DBUtils.getConnection(); 21 stmt = conn.createStatement(); 22 rs = stmt.executeQuery("select * from users;"); 23 List<User> list = new ArrayList<User>(); 24 while (rs.next()) { 25 User u = new User(); 26 u.setUser_id(rs.getString(1)); 27 u.setFirst_name(rs.getString(2)); 28 u.setLast_name(rs.getString(3)); 29 list.add(u); 30 } 31 for (User user : list) { 32 System.out.println(user); 33 System.out.println("-----------"); 34 } 35 } catch (Exception e) { 36 e.printStackTrace(); 37 } finally { 38 DBUtils.closeAll(rs, stmt, conn); 39 } 40 41 } 42 43 44 @Test 45 public void testInsert() { 46 Connection conn = null; 47 Statement stmt = null; 48 49 try { 50 conn = DBUtils.getConnection(); 51 stmt = conn.createStatement(); 52 int i = stmt.executeUpdate("INSERT INTO users VALUES(6,'hack','ME','abc','5555','2017',' 2016-11-25 12:54:34','12345');"); 53 if (i>0) { 54 System.out.println("success!"); 55 } 56 } catch (Exception e) { 57 e.printStackTrace(); 58 } finally { 59 DBUtils.closeAll(null, stmt, conn); 60 } 61 62 } 63 64 65 @Test 66 public void testDelete() { 67 Connection conn = null; 68 Statement stmt = null; 69 70 try { 71 conn = DBUtils.getConnection(); 72 stmt = conn.createStatement(); 73 int i = stmt.executeUpdate("DELETE FROM users WHERE user_id=6;"); 74 if (i>0) { 75 System.out.println("success!"); 76 } 77 } catch (Exception e) { 78 e.printStackTrace(); 79 } finally { 80 DBUtils.closeAll(null, stmt, conn); 81 } 82 83 } 84 }
*************
为了避免sql注入漏洞,需要使用PreparedStatement来代替Statement.
PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行