一。jbdc的常用API
1.Connection:數據庫的鏈接對象
2.statement:數據庫sql執行對象
3.preparedStatment:sql的預編譯處理對象,是statement子接口
4.resultset:返回查詢的結果集
二。jdbc開發步驟
1.在項目中加入驅動jar包
2.寫jdbc鏈接代碼
注意:日期對象的處理。從結果集中獲取時間是用getTimestamp(),得到的是Timestamp對象(時間戳)
Timestamp是util.Date的子類。他們之間的互相轉換是:
util.Date = Timestamp直接轉換
Timestamp = new TimeStamp(util.Date.getTime());
三。工廠模式
1.工廠類,專門用來生產某一個對象的實例
四。preparedStatment 預編譯sql命令接口
1.會對sql語句進行編譯檢查,可以用參數占位符的方式編寫sql語句
2.作用:比普通statement接口執行效率更高。可以防止sql注入的侵入
SQL實例:
1 drop table user_info; 2 drop table group_info; 3 drop table contacts_info; 4 5 select * from user_info 6 select * from group_info 7 select * from contacts_info 8 9 delete from user_info; 10 delete from group_info; 11 12 13 --創建用戶信息表 14 create table user_info( 15 user_id int identity(1,1) primary key, 16 user_name nvarchar(30) unique not null, 17 user_password nvarchar(30) not null 18 ) 19 20 --創建聯系人群組信息表 21 create table group_info( 22 group_id int identity(1,1) primary key, 23 group_name nvarchar(30), 24 group_state nchar(3) default '可修改', 25 check(group_state in ('可修改','不可改')), 26 user_id int, 27 foreign key (user_id) references user_info(user_id) 28 ) 29 30 --創建聯系人信息表 31 create table contacts_info( 32 con_id int identity(1,1) primary key, 33 con_name nvarchar(30) not null, 34 con_sex nchar(1) default '男', 35 check(con_sex in ('男','女')), 36 con_age int, 37 con_cellphone nvarchar(30), 38 con_telephone nvarchar(30), 39 con_birth datetime, 40 con_email nvarchar(30), 41 con_static nchar(3) default '未刪除', 42 check(con_static in ('未刪除','已刪除')), 43 group_id int, 44 foreign key (group_id) references group_info(group_id) 45 )
java實例1:創建jdbc工廠類
jdbc.properties
jdbc.driver=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl jdbc.username=C##java06 jdbc.password=java123
JDBCFactory.java類
1 package com.demo1207; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.sql.Connection; 6 import java.sql.DriverManager; 7 import java.sql.ResultSet; 8 import java.sql.SQLException; 9 import java.sql.Statement; 10 import java.util.Properties; 11 12 public class JDBCFactory { 13 // private static final String DRIVER = "oracle.jdbc.driver.OracleDriver"; 14 // private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl"; 15 // private static final String USERNAME = "C##java06"; 16 // private static final String PASSWORD = "java123"; 17 18 static String DRIVER; 19 static String URL; 20 static String USERNAME; 21 static String PASSWORD; 22 static{ 23 //只會在類第一次加載時被執行一次,適合做資源文件的讀取 24 //加載數據庫配置文件資源 25 Properties pro = new Properties(); 26 //把資源讀取成字節輸入流 27 InputStream is = JDBCFactory.class.getResourceAsStream("jdbc.properties"); 28 29 try { 30 //通過資源對象加載字節輸入流 31 pro.load(is); 32 //資源對象通過key來獲取對應的文件中的值,注意:靜態代碼塊只能使用靜態屬性 33 DRIVER = pro.getProperty("jdbc.driver"); 34 URL = pro.getProperty("jdbc.url"); 35 USERNAME = pro.getProperty("jdbc.username"); 36 PASSWORD = pro.getProperty("jdbc.password"); 37 } catch (IOException e) { 38 // TODO Auto-generated catch block 39 e.printStackTrace(); 40 } 41 } 42 43 /** 44 * 獲取數據庫鏈接 45 * @return 如果有異常則會返回null 46 */ 47 public static Connection getConn(){ 48 Connection conn = null; 49 try { 50 Class.forName(DRIVER); 51 conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); 52 } catch (Exception e) { 53 e.printStackTrace(); 54 } 55 return conn; 56 } 57 58 public static void closeAll(Connection conn,Statement st,ResultSet rs){ 59 if(conn!=null){ 60 try { 61 conn.close(); 62 } catch (SQLException e) { 63 e.printStackTrace(); 64 } 65 } 66 if(st!=null){ 67 try { 68 st.close(); 69 } catch (SQLException e) { 70 e.printStackTrace(); 71 } 72 } 73 if(rs!=null){ 74 try { 75 rs.close(); 76 } catch (SQLException e) { 77 // TODO Auto-generated catch block 78 e.printStackTrace(); 79 } 80 } 81 } 82 }
java實例2:調用工廠類
在java類中寫一個Student對象,用來封裝學員信息
查詢學員信息表,將結果集封裝到List<Student>
提示:學員對象的時間字段用util.Date. 每個屬性都要封裝
Student.java
1 package com.demo1207; 2 3 import java.util.Date; 4 5 public class Student { 6 private int student_id; 7 private String student_name; 8 private String student_sex; 9 private int student_age; 10 private int class_id; 11 private Date birthday; 12 public int getStudent_id() { 13 return student_id; 14 } 15 public void setStudent_id(int student_id) { 16 this.student_id = student_id; 17 } 18 public String getStudent_name() { 19 return student_name; 20 } 21 public void setStudent_name(String student_name) { 22 this.student_name = student_name; 23 } 24 public String getStudent_sex() { 25 return student_sex; 26 } 27 public void setStudent_sex(String student_sex) { 28 this.student_sex = student_sex; 29 } 30 public int getStudent_age() { 31 return student_age; 32 } 33 public void setStudent_age(int student_age) { 34 this.student_age = student_age; 35 } 36 public int getClass_id() { 37 return class_id; 38 } 39 public void setClass_id(int class_id) { 40 this.class_id = class_id; 41 } 42 public Date getBirthday() { 43 return birthday; 44 } 45 public void setBirthday(Date birthday) { 46 this.birthday = birthday; 47 } 48 49 50 }
JdbcTest.java
1 package com.demo1207; 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 11 public class JdbcTest { 12 public static void main(String[] args) { 13 Connection conn = null; 14 Statement st = null; 15 ResultSet rs = null; 16 try { 17 conn = JDBCFactory.getConn(); 18 System.out.println(conn); 19 20 //處理sql命令的對象 21 st = conn.createStatement(); 22 23 String sql = "insert into student_info values(sq_student.nextval,'葉挺',1,22,1,sysdate)"; 24 //st來執行sql語句,注意executeUpdate是執行增刪改的語句 25 st.executeUpdate(sql); 26 27 //執行查詢業務 28 String sql2 = "select * from student_info"; 29 rs = st.executeQuery(sql2); 30 List<Student> list = new ArrayList<>(); 31 while(rs.next()){ 32 Student stu = new Student(); 33 stu.setStudent_id(rs.getInt(1)); 34 stu.setStudent_name(rs.getString(2)); 35 stu.setStudent_sex(rs.getString(3)); 36 stu.setStudent_age(rs.getInt(4)); 37 stu.setClass_id(rs.getInt(5)); 38 stu.setBirthday(rs.getTimestamp(6)); 39 list.add(stu); 40 System.out.print(rs.getInt(1)+"\t"); 41 System.out.print(rs.getString("student_name")+"\t"); 42 System.out.print(rs.getString(3)+"\t"); 43 System.out.print(rs.getInt(4)+"\t"); 44 System.out.print(rs.getInt(5)+"\t"); 45 System.out.println(rs.getTimestamp(6)); 46 } 47 } catch (Exception e) { 48 e.printStackTrace(); 49 } finally { 50 JDBCFactory.closeAll(conn, st, rs); 51 } 52 } 53 }
java實例3:調用jdbc工廠類來驗證登錄
PreparedDemo.java
1 package com.demo1207; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 7 public class PreparedDemo { 8 public static void main(String[] args) { 9 Connection conn = null; 10 PreparedStatement ps = null; 11 ResultSet rs = null; 12 13 try { 14 conn = JDBCFactory.getConn(); 15 String sql = "select * from user_info where username=? and pass_word=?"; 16 ps = conn.prepareStatement(sql); 17 //將參數占位符賦值 18 ps.setString(1, "張三"); 19 ps.setString(2, "123456"); 20 21 //執行sql 和statement的執行方法一樣 22 rs = ps.executeQuery(); 23 if(rs.next()){ 24 System.out.println(rs.getString(2)+"登錄成功"); 25 }else{ 26 System.out.println("登錄失敗"); 27 } 28 } catch (Exception e) { 29 e.printStackTrace(); 30 } finally { 31 JDBCFactory.closeAll(conn, ps, rs); 32 } 33 } 34 }
java實例4:調用工廠類進行增刪改查
1 package com.demo1207; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.Timestamp; 7 import java.util.Date; 8 9 public class CRUDDemo { 10 Connection conn; 11 PreparedStatement ps; 12 ResultSet rs; 13 14 public void create(){ 15 try { 16 conn = JDBCFactory.getConn(); 17 18 String sql = "insert into student_info values(sq_student.nextval,?,?,?,?,?)"; 19 ps = conn.prepareStatement(sql); 20 21 ps.setString(1, "田甜"); 22 ps.setString(2, "2"); 23 ps.setInt(3, 22); 24 ps.setInt(4, 1); 25 ps.setTimestamp(5, new Timestamp(new Date().getTime())); 26 ps.executeUpdate(); 27 System.out.println("新增成功"); 28 } catch (Exception e) { 29 e.printStackTrace(); 30 } finally { 31 JDBCFactory.closeAll(conn, ps, rs); 32 } 33 } 34 35 public void delete(){ 36 try { 37 conn = JDBCFactory.getConn(); 38 39 String sql = "delete from student_info where student_id=?"; 40 ps = conn.prepareStatement(sql); 41 42 ps.setInt(1, 1); 43 ps.executeUpdate(); 44 System.out.println("刪除成功"); 45 } catch (Exception e) { 46 e.printStackTrace(); 47 } finally { 48 JDBCFactory.closeAll(conn, ps, rs); 49 } 50 } 51 52 public void update(){ 53 try { 54 conn = JDBCFactory.getConn(); 55 56 String sql = "update student_info set student_name=?,student_sex=?,student_age=?,class_id=?,birthday=? where student_id=?"; 57 ps = conn.prepareStatement(sql); 58 59 ps.setString(1, "哈哈"); 60 ps.setString(2, "2"); 61 ps.setInt(3, 28); 62 ps.setInt(4, 1); 63 ps.setTimestamp(5, new Timestamp(new Date().getTime())); 64 ps.setInt(6, 2); 65 ps.executeUpdate(); 66 System.out.println("修改成功"); 67 } catch (Exception e) { 68 e.printStackTrace(); 69 } finally { 70 JDBCFactory.closeAll(conn, ps, rs); 71 } 72 } 73 74 public void query(){ 75 try { 76 conn = JDBCFactory.getConn(); 77 78 String sql = "select * from student_info"; 79 ps = conn.prepareStatement(sql); 80 81 rs = ps.executeQuery(); 82 while(rs.next()){ 83 System.out.println(); 84 } 85 } catch (Exception e) { 86 e.printStackTrace(); 87 } finally { 88 JDBCFactory.closeAll(conn, ps, rs); 89 } 90 } 91 }
作業:
一。用戶管理
1.用戶注冊:要求用戶名不能重復
2.用戶登錄
二。聯系人組群管理
1.用戶新建聯系人組群:每個用戶注冊時都會默認新建一個名字叫“我的聯系人”這么一個組群,該組群不能修改,
每個用戶可以新建n個聯系人組群。
2.用戶修改聯系組群:修改組群名字
3.用戶刪除組群:刪除組群后,將該組的所有聯系人移到默認組群“我的聯系人”
三。聯系人管理
1.用戶新建聯系人:需要指定聯系人到哪個組群。聯系人信息(姓名,年齡,性別,移動電話,固定電話,生日,郵箱)
2.用戶修改聯系人:可以修改聯系人所有信息,包括組群
3.用戶刪除聯系人:
4.查詢聯系人:
a.按姓名模糊查詢
b.按組群查詢
c.按電話號碼模糊查詢