2、原生jdbc的dao模式
一。dao模式 (data access object)
1.作用:持久层,专门操作数据的层次结构,不掺杂任何的业务和其他内容
2.dao组成部分:
a.数据库工厂类
b.数据实体类 javabean pojo:数据的载体
c.对外提供的访问接口
d.接口的实现类
3.好处:
a.代码的重用性
b.代码的维护性
c.层次更加清晰
二。分层开发原则
1.每个层次都是独立的做同一种性质的事情。
目前的分层:a.交互层 b.业务层 c.数据库访问层(DAO)
2.上层依赖下层
依赖就是调用,绝不跨层访问,也不能反过来依赖
3.层与层之间的访问是通过接口
4.层保持内聚性,层与层之间保持松耦合
实例:
数据库连接资源文件:jdbc.properties
1 jdbc.driver=oracle.jdbc.driver.OracleDriver 2 jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl 3 jdbc.username=C##java06 4 jdbc.password=java123
工厂类: JDBCFactory.java
1 package com.demo1212; 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 }
Bean对象学生实体:Student.java
1 package com.demo1212; 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 13 public Student(){ 14 15 } 16 17 public Student(int student_id, String student_name, String student_sex, int student_age, int class_id, 18 Date birthday) { 19 this.student_id = student_id; 20 this.student_name = student_name; 21 this.student_sex = student_sex; 22 this.student_age = student_age; 23 this.class_id = class_id; 24 this.birthday = birthday; 25 } 26 public int getStudent_id() { 27 return student_id; 28 } 29 public void setStudent_id(int student_id) { 30 this.student_id = student_id; 31 } 32 public String getStudent_name() { 33 return student_name; 34 } 35 public void setStudent_name(String student_name) { 36 this.student_name = student_name; 37 } 38 public String getStudent_sex() { 39 return student_sex; 40 } 41 public void setStudent_sex(String student_sex) { 42 this.student_sex = student_sex; 43 } 44 public int getStudent_age() { 45 return student_age; 46 } 47 public void setStudent_age(int student_age) { 48 this.student_age = student_age; 49 } 50 public int getClass_id() { 51 return class_id; 52 } 53 public void setClass_id(int class_id) { 54 this.class_id = class_id; 55 } 56 public Date getBirthday() { 57 return birthday; 58 } 59 public void setBirthday(Date birthday) { 60 this.birthday = birthday; 61 } 62 63 64 }
学生表dao层访问接口:IStudentDao.java
1 package com.demo1212; 2 3 import java.util.List; 4 5 public interface IStudentDAO { 6 public void addStu(Student stu); 7 8 public void deleteStu(Student stu); 9 10 public void updateStu(Student stu); 11 12 public List<Student> queryStu(String sql); 13 }
学生表dao层访问接口实现类:StudentDao.java
1 package com.demo1212; 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.ArrayList; 8 import java.util.List; 9 10 public class StudentDAO implements IStudentDAO{ 11 Connection conn; 12 PreparedStatement ps; 13 ResultSet rs;
14 @Override 15 public void addStu(Student stu) { 16 try { 17 conn = JDBCFactory.getConn(); 18 String sql = "insert into student_info values(sq_student.nextval,?,?,?,?,?)"; 19 ps = conn.prepareStatement(sql); 20 ps.setString(1, stu.getStudent_name()); 21 ps.setString(2, stu.getStudent_sex()); 22 ps.setInt(3, stu.getStudent_age()); 23 ps.setInt(4, stu.getClass_id()); 24 ps.setTimestamp(5, new Timestamp(stu.getBirthday().getTime())); 25 ps.executeUpdate(); 26 } catch (Exception e) { 27 e.printStackTrace(); 28 }finally{ 29 JDBCFactory.closeAll(conn, ps, rs); 30 } 31 } 32 33 @Override 34 public void deleteStu(Student stu) { 35 if(stu.getStudent_id()!=0){ 36 try { 37 conn = JDBCFactory.getConn(); 38 String sql = "delete from student_info where student_id=?"; 39 ps = conn.prepareStatement(sql); 40 ps.setInt(1, stu.getStudent_id()); 41 ps.executeUpdate(); 42 } catch (Exception e) { 43 e.printStackTrace(); 44 } finally{ 45 JDBCFactory.closeAll(conn, ps, rs); 46 } 47 } 48 } 49 50 @Override 51 public void updateStu(Student stu) { 52 if(stu.getStudent_id()!=0){ 53 try { 54 conn = JDBCFactory.getConn(); 55 String sql = "update student_info set student_name=?,student_sex=?,student_age=?,class_id=?,birthday=? where student_id=?"; 56 ps = conn.prepareStatement(sql); 57 ps.setString(1, stu.getStudent_name()); 58 ps.setString(2, stu.getStudent_sex()); 59 ps.setInt(3, stu.getStudent_age()); 60 ps.setInt(4, stu.getClass_id()); 61 ps.setTimestamp(5, new Timestamp(stu.getBirthday().getTime())); 62 ps.setInt(6, stu.getStudent_id()); 63 ps.executeUpdate(); 64 } catch (Exception e) { 65 e.printStackTrace(); 66 } finally{ 67 JDBCFactory.closeAll(conn, ps, rs); 68 } 69 } 70 } 71 72 @Override 73 public List<Student> queryStu(String sql) { 74 List<Student> list = new ArrayList<>(); 75 try { 76 conn = JDBCFactory.getConn(); 77 ps = conn.prepareStatement(sql); 78 rs = ps.executeQuery(); 79 80 while(rs.next()){ 81 Student stu = new Student(); 82 stu.setStudent_id(rs.getInt(1)); 83 stu.setStudent_name(rs.getString(2)); 84 stu.setStudent_sex(rs.getString(3)); 85 stu.setStudent_age(rs.getInt(4)); 86 stu.setClass_id(rs.getInt(5)); 87 stu.setBirthday(rs.getTimestamp(6)); 88 list.add(stu); 89 } 90 } catch (Exception e) { 91 e.printStackTrace(); 92 } finally{ 93 JDBCFactory.closeAll(conn, ps, rs); 94 } 95 return list; 96 } 97 98 }
用多态的形式调用dao层的实现方法:Test.java
1 package com.demo1212; 2 3 import java.util.Date; 4 5 public class Test { 6 public static void main(String[] args) { 7 Student stu = new Student(0, "测试新增", "1", 18, 2, new Date()); 8 IStudentDAO stuDAO = new StudentDAO(); 9 stuDAO.addStu(stu); 10 } 11 }
作业:通讯录需求
一。用户管理
1.用户注册:要求用户名不能重复
2.用户登录
二。联系人组群管理
1.用户新建联系人组群:每个用户注册时都会默认新建一个名字叫“我的联系人”这么一个组群,该组群不能修改,
每个用户可以新建n个联系人组群。
2.用户修改联系组群:修改组群名字
3.用户删除组群:删除组群后,将该组的所有联系人移到默认组群“我的联系人”
三。联系人管理
1.用户新建联系人:需要指定联系人到哪个组群。联系人信息(姓名,年龄,性别,移动电话,固定电话,生日,邮箱)
2.用户修改联系人:可以修改联系人所有信息,包括组群
3.用户删除联系人:
4.查询联系人:
a.按姓名模糊查询
b.按组群查询
c.按电话号码模糊查询
部分实现示例:
表结构
1 user_info 2 user_id number 主键 3 user_name varchar2 用户名 4 user_password varchar2 密码 5 6 7 group_info 8 group_type char 组群类型:1.表示是默认组群,不能修改和删除 2.普通组群。可以删除修改 9 group_id number 主键 10 group_name varchar2 名字 11 user_id number 用户外键 12 13 14 contact 15 contact_id number 主键 16 group_id number 组群外键 17 user_id number 用户外键 18 phone varchar2 电话 19 contact_name varchar2 联系人名 20 birthday date 生日
业务层:
ContactService.java
1 package com.demo1211; 2 3 public class ContactService { 4 5 }
GroupInfoService.java
1 package com.demo1211; 2 3 public class GroupInfoService { 4 /** 5 * 给新用户分配默认组群 6 */ 7 public void addDefaultGroup(int userId){ 8 9 } 10 }
UserInfoService.java
1 package com.demo1211; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 7 public class UserInfoService { 8 Connection conn; 9 PreparedStatement ps; 10 ResultSet rs; 11 12 /** 13 * 14 * @param username 15 * @return true表示重复 flase表示不重复 16 */ 17 public boolean isNameRepeat(String username){ 18 try { 19 conn = JDBCFactory.getConn(); 20 String sql = "select * from user_info where user_name=?"; 21 ps = conn.prepareStatement(sql); 22 ps.setString(1, username); 23 rs = ps.executeQuery(); 24 if(rs.next()){ 25 return true; 26 } 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } finally{ 30 JDBCFactory.closeAll(conn, ps, rs); 31 } 32 return false; 33 } 34 /** 35 * 36 * @param username 37 * @param password 38 * @return 0表示失败 1表示成功 39 */ 40 public int addUser(String username,String password){ 41 try { 42 conn = JDBCFactory.getConn(); 43 String sql = "insert into user_info(sq_user.nextval,?,?)"; 44 ps = conn.prepareStatement(sql); 45 ps.setString(1, username); 46 ps.setString(2, password); 47 return ps.executeUpdate(); 48 } catch (Exception e) { 49 e.printStackTrace(); 50 } finally{ 51 JDBCFactory.closeAll(conn, ps, rs); 52 } 53 return 0; 54 } 55 }
主菜单 :Menu.java
1 package com.demo1211; 2 3 import java.util.Scanner; 4 5 public class Menu { 6 Scanner sc = new Scanner(System.in); 7 UserInfoService userSer = new UserInfoService(); 8 GroupInfoService groupSer = new GroupInfoService(); 9 ContactService conSer = new ContactService(); 10 int userId;//记录当前登录人的id 11 12 // 一级菜单 13 public void FristMenu() { 14 System.out.println("1.用户登录"); 15 System.out.println("2.用户注册"); 16 System.out.println("请选择功能:"); 17 String a = sc.next(); 18 switch (a) { 19 case "1": 20 login(); 21 break; 22 case "2": 23 register(); 24 break; 25 } 26 } 27 28 // 二级菜单 29 public void secondMenu() { 30 System.out.println("1.组群管理"); 31 System.out.println("2.联系人管理"); 32 System.out.println("3.联系人查看"); 33 System.out.println("4.退出登录"); 34 System.out.println("请选择功能:"); 35 36 String a = sc.next(); 37 switch (a) { 38 case "1": 39 ThirdMenuGroup(); 40 break; 41 case "2": 42 ThirdMenuContact(); 43 break; 44 case "3": 45 ThirdMenuQueryContact(); 46 break; 47 case "4": 48 FristMenu(); 49 break; 50 } 51 } 52 53 // 三级菜单--组群管理 54 public void ThirdMenuGroup() { 55 System.out.println("组群管理:"); 56 System.out.println("1.新建组群"); 57 System.out.println("2.修改组群"); 58 System.out.println("3.删除组群"); 59 } 60 61 // 三级菜单--联系人管理 62 public void ThirdMenuContact() { 63 64 } 65 66 // 三级菜单--查看联系人 67 public void ThirdMenuQueryContact() { 68 69 } 70 71 // 登录 72 public void login() { 73 74 } 75 76 // 注册 77 public void register() { 78 System.out.println("欢迎注册新用户"); 79 String username = ""; 80 while (true) {// 判断用户名是否重复 81 System.out.println("请输入用户名:"); 82 username = sc.next(); 83 if (userSer.isNameRepeat(username)) { 84 System.out.println("该用户名已经被注册,请重新输入"); 85 } else { 86 break; 87 } 88 } 89 System.out.println("请输入密码:"); 90 String password = sc.next(); 91 // 完成注册 92 int result = userSer.addUser(username, password); 93 if (result == 1) { 94 System.out.println("注册成功!"); 95 //给默认用户分配一个默认组群 96 groupSer.addDefaultGroup(0); 97 //跳珠到二级菜单 98 secondMenu(); 99 } else { 100 System.out.println("注册失败,请重新注册!"); 101 register(); 102 } 103 } 104 }