一。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. }

  学生表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.用户注册:要求用户名不能重复
  3. 2.用户登录
  4. 二。联系人组群管理
  5. 1.用户新建联系人组群:每个用户注册时都会默认新建一个名字叫“我的联系人”这么一个组群,该组群不能修改,
  6. 每个用户可以新建n个联系人组群。
  7. 2.用户修改联系组群:修改组群名字
  8. 3.用户删除组群:删除组群后,将该组的所有联系人移到默认组群“我的联系人”
  9. 三。联系人管理
  10. 1.用户新建联系人:需要指定联系人到哪个组群。联系人信息(姓名,年龄,性别,移动电话,固定电话,生日,邮箱)
  11. 2.用户修改联系人:可以修改联系人所有信息,包括组群
  12. 3.用户删除联系人:
  13. 4.查询联系人:
  14. a.按姓名模糊查询
  15. b.按组群查询
  16. c.按电话号码模糊查询

部分实现示例:

  表结构

  1. user_info
  2. user_id number 主键
  3. user_name varchar2 用户名
  4. user_password varchar2 密码
  5.  
  6. group_info
  7. group_type char 组群类型:1.表示是默认组群,不能修改和删除 2.普通组群。可以删除修改
  8. group_id number 主键
  9. group_name varchar2 名字
  10. user_id number 用户外键
  11.  
  12. contact
  13. contact_id number 主键
  14. group_id number 组群外键
  15. user_id number 用户外键
  16. phone varchar2 电话
  17. contact_name varchar2 联系人名
  18. birthday date 生日

业务层:

  1. 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. }

2、原生jdbc的dao模式的更多相关文章

  1. Java Dao模式通过JDBC连接数据库的操作

    Java程序访问数据库: 1.获取数据库厂商提供的驱动(jdbc接口的实现类) 如ojdbc14.jar——Oracle数据库驱动jar包 mysql-connector-java-5.1.8-bin ...

  2. jdbc之二:DAO模式

    详细代码请参见 https://code.csdn.net/jediael_lu/daopattern 1.创建Dao接口. package com.ljh.jasonnews.server.dao; ...

  3. Javaweb学习笔记——(十七)——————JDBC的原理、四大核心类、四大参数、预编译、Dao模式、批处理、大数据、时间类型的转换

    JDBC入门 *导入jar包:驱动 *加载驱动类:Class.forName("类名"); *给出url.username.password,其中url背下来 *使用DriverM ...

  4. jdbc之二:DAO模式 分类: B1_JAVA 2014-04-29 15:13 1536人阅读 评论(0) 收藏

    详细代码请参见 https://github.com/lujinhong/dao 一.前期准备 1.创建数据库 create database filter_conf; 2.创建表并插入数据 crea ...

  5. JDBC、DAO

    JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力 JDBC的工作原理 JDBC 驱动器由数据库厂商提供 1.在个人开发与测试中,可以使用JDBC-ODBC桥连方式 2.在生产型开发 ...

  6. 数据持久化以及DAO模式的简单使用

    持久化:(是将程序中的数据在瞬时状态和持久状态间转换机制)        即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然 ...

  7. java数据库编程之DAO模式

    第八章:DAO模式 8.1:JDBC封装 为了提高代码的维护性和扩展性,我们使用JDBC进行封装数据, 先定义统一的API,将操作数据的代码抽象到接口中,业务逻辑代码只需要调用这些接口的实现类的对象, ...

  8. 第七章 DAO模式

    第七章 DAO模式 一.JDBC的封装 1.JDBC的封装: DAO位于业务逻辑和持久化数据之间,实现对持久化数据的访问.将数据库都封装起来,对外提供相应的接口 2.DAO模式的作用: 1.隔离业务逻 ...

  9. DAO模式

    什么是DAO模式: DAO(Data Access Object Pattern)用于将低层的数据操作API与上层的业务逻辑层分离,其主要涉及以下几个部分: 1.Data Access Object ...

随机推荐

  1. 异常:Data = 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

    做项目的时候,将DataTable序列化成Json,通过ashx向前台返回数据的时候,前台总是获取不到数据,但是程序运行却没问题, 没抛出异常.一时找不到办法,减小输出的数据量,这时前台可以接收到页面 ...

  2. thinkphp——通过在线编辑器添加的内容在模板里正确显示(只显示内容,而不是html代码)

    thinkphp编辑器回显问题如下: 解决办法如下: 对于编辑器发布的内容,前台模板显示为html的解决办法是: 在模板输出字段加入html_entity_decode()函数 也就是:PHP输出时的 ...

  3. K8S flannel

    kubernetes网络通信方式有: 容器间的通信 : pod内的容器通信 通过(lo)设备 Pod之间的通信 :pod IP <-----> pod IP ,K8S 要求所有的 pod ...

  4. HDU3440 House Man

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  5. 不能用notepad++编辑器编写python

    不能用notepad++编辑器编写python,因为notepad对空格支持不是很良好,会出现莫名其妙的错误!建议用vim或emacs. 有人这样解释:不要混合使用制表符和空格来缩进,因为这在跨越不同 ...

  6. Brute-forced Euclid Distance Transform

    Sepearable 2D EDT, going to extend to 3D in order to calculate the Signed Distance Function(Field) C ...

  7. WPF:完美自定义MeaagseBox 2.0

    很久前做个一个MessageBox,原文链接:http://www.cnblogs.com/DoNetCoder/p/3843658.html. 不过对比MessageBox还有一些瑕疵.这些天有时间 ...

  8. WPF:完美自定义MeaagseBox 动画 反弹 背景模糊 扁平化

    不知道为什么,WPF的MeaageBox的风格还停留在Win 2000的风格... 很久前就想自己封装一个MessageBox出来,但是都只是简单的封装,不怎么具有通用性.这次终于搞完了. 使用方法和 ...

  9. hdu-2018题(母牛问题)

    HDU-2018题/*有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.请编程实现在第n年的时候,共有多少头母牛?Input输入数据由多个测试实例组成,每个测试实 ...

  10. 虚拟机中安装Virtualbox,嵌套的虚拟机不能运行64位系统

    https://www.quora.com/Can-I-install-Virtualbox-in-a-virtual-machine Here is a previous question on Q ...