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 }

 

posted @ 2019-04-17 11:27  五柳先生柳三变  阅读(493)  评论(0编辑  收藏  举报