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

 jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=C##java06
jdbc.password=java123

  工厂类: JDBCFactory.java

 package com.demo1212;

 import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; public class JDBCFactory {
// private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
// private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
// private static final String USERNAME = "C##java06";
// private static final String PASSWORD = "java123"; static String DRIVER;
static String URL;
static String USERNAME;
static String PASSWORD;
static{
//只会在类第一次加载时被执行一次,适合做资源文件的读取
//加载数据库配置文件资源
Properties pro = new Properties();
//把资源读取成字节输入流
InputStream is = JDBCFactory.class.getResourceAsStream("jdbc.properties"); try {
//通过资源对象加载字节输入流
pro.load(is);
//资源对象通过key来获取对应的文件中的值,注意:静态代码块只能使用静态属性
DRIVER = pro.getProperty("jdbc.driver");
URL = pro.getProperty("jdbc.url");
USERNAME = pro.getProperty("jdbc.username");
PASSWORD = pro.getProperty("jdbc.password");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 获取数据库链接
* @return 如果有异常则会返回null
*/
public static Connection getConn(){
Connection conn = null;
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
} public static void closeAll(Connection conn,Statement st,ResultSet rs){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

  Bean对象学生实体:Student.java

 package com.demo1212;

 import java.util.Date;

 public class Student {
private int student_id;
private String student_name;
private String student_sex;
private int student_age;
private int class_id;
private Date birthday; public Student(){ } public Student(int student_id, String student_name, String student_sex, int student_age, int class_id,
Date birthday) {
this.student_id = student_id;
this.student_name = student_name;
this.student_sex = student_sex;
this.student_age = student_age;
this.class_id = class_id;
this.birthday = birthday;
}
public int getStudent_id() {
return student_id;
}
public void setStudent_id(int student_id) {
this.student_id = student_id;
}
public String getStudent_name() {
return student_name;
}
public void setStudent_name(String student_name) {
this.student_name = student_name;
}
public String getStudent_sex() {
return student_sex;
}
public void setStudent_sex(String student_sex) {
this.student_sex = student_sex;
}
public int getStudent_age() {
return student_age;
}
public void setStudent_age(int student_age) {
this.student_age = student_age;
}
public int getClass_id() {
return class_id;
}
public void setClass_id(int class_id) {
this.class_id = class_id;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
} }

  学生表dao层访问接口:IStudentDao.java

 package com.demo1212;

 import java.util.List;

 public interface IStudentDAO {
public void addStu(Student stu); public void deleteStu(Student stu); public void updateStu(Student stu); public List<Student> queryStu(String sql);
}

  学生表dao层访问接口实现类:StudentDao.java

 package com.demo1212;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List; public class StudentDAO implements IStudentDAO{
Connection conn;
PreparedStatement ps;
ResultSet rs;
@Override
public void addStu(Student stu) {
try {
conn = JDBCFactory.getConn();
String sql = "insert into student_info values(sq_student.nextval,?,?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, stu.getStudent_name());
ps.setString(2, stu.getStudent_sex());
ps.setInt(3, stu.getStudent_age());
ps.setInt(4, stu.getClass_id());
ps.setTimestamp(5, new Timestamp(stu.getBirthday().getTime()));
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCFactory.closeAll(conn, ps, rs);
}
} @Override
public void deleteStu(Student stu) {
if(stu.getStudent_id()!=0){
try {
conn = JDBCFactory.getConn();
String sql = "delete from student_info where student_id=?";
ps = conn.prepareStatement(sql);
ps.setInt(1, stu.getStudent_id());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCFactory.closeAll(conn, ps, rs);
}
}
} @Override
public void updateStu(Student stu) {
if(stu.getStudent_id()!=0){
try {
conn = JDBCFactory.getConn();
String sql = "update student_info set student_name=?,student_sex=?,student_age=?,class_id=?,birthday=? where student_id=?";
ps = conn.prepareStatement(sql);
ps.setString(1, stu.getStudent_name());
ps.setString(2, stu.getStudent_sex());
ps.setInt(3, stu.getStudent_age());
ps.setInt(4, stu.getClass_id());
ps.setTimestamp(5, new Timestamp(stu.getBirthday().getTime()));
ps.setInt(6, stu.getStudent_id());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCFactory.closeAll(conn, ps, rs);
}
}
} @Override
public List<Student> queryStu(String sql) {
List<Student> list = new ArrayList<>();
try {
conn = JDBCFactory.getConn();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery(); while(rs.next()){
Student stu = new Student();
stu.setStudent_id(rs.getInt(1));
stu.setStudent_name(rs.getString(2));
stu.setStudent_sex(rs.getString(3));
stu.setStudent_age(rs.getInt(4));
stu.setClass_id(rs.getInt(5));
stu.setBirthday(rs.getTimestamp(6));
list.add(stu);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCFactory.closeAll(conn, ps, rs);
}
return list;
} }

  用多态的形式调用dao层的实现方法:Test.java

 package com.demo1212;

 import java.util.Date;

 public class Test {
public static void main(String[] args) {
Student stu = new Student(0, "测试新增", "1", 18, 2, new Date());
IStudentDAO stuDAO = new StudentDAO();
stuDAO.addStu(stu);
}
}

 

 作业:通讯录需求

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

部分实现示例:

  表结构

 user_info
user_id number 主键
user_name varchar2 用户名
user_password varchar2 密码 group_info
group_type char 组群类型:1.表示是默认组群,不能修改和删除 2.普通组群。可以删除修改
group_id number 主键
group_name varchar2 名字
user_id number 用户外键 contact
contact_id number 主键
group_id number 组群外键
user_id number 用户外键
phone varchar2 电话
contact_name varchar2 联系人名
birthday date 生日

业务层:

ContactService.java
 package com.demo1211;

 public class ContactService {

 }

  GroupInfoService.java

 package com.demo1211;

 public class GroupInfoService {
/**
* 给新用户分配默认组群
*/
public void addDefaultGroup(int userId){ }
}

  UserInfoService.java

 package com.demo1211;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; public class UserInfoService {
Connection conn;
PreparedStatement ps;
ResultSet rs; /**
*
* @param username
* @return true表示重复 flase表示不重复
*/
public boolean isNameRepeat(String username){
try {
conn = JDBCFactory.getConn();
String sql = "select * from user_info where user_name=?";
ps = conn.prepareStatement(sql);
ps.setString(1, username);
rs = ps.executeQuery();
if(rs.next()){
return true;
}
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCFactory.closeAll(conn, ps, rs);
}
return false;
}
/**
*
* @param username
* @param password
* @return 0表示失败 1表示成功
*/
public int addUser(String username,String password){
try {
conn = JDBCFactory.getConn();
String sql = "insert into user_info(sq_user.nextval,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCFactory.closeAll(conn, ps, rs);
}
return 0;
}
}

  主菜单 :Menu.java

 package com.demo1211;

 import java.util.Scanner;

 public class Menu {
Scanner sc = new Scanner(System.in);
UserInfoService userSer = new UserInfoService();
GroupInfoService groupSer = new GroupInfoService();
ContactService conSer = new ContactService();
int userId;//记录当前登录人的id // 一级菜单
public void FristMenu() {
System.out.println("1.用户登录");
System.out.println("2.用户注册");
System.out.println("请选择功能:");
String a = sc.next();
switch (a) {
case "1":
login();
break;
case "2":
register();
break;
}
} // 二级菜单
public void secondMenu() {
System.out.println("1.组群管理");
System.out.println("2.联系人管理");
System.out.println("3.联系人查看");
System.out.println("4.退出登录");
System.out.println("请选择功能:"); String a = sc.next();
switch (a) {
case "1":
ThirdMenuGroup();
break;
case "2":
ThirdMenuContact();
break;
case "3":
ThirdMenuQueryContact();
break;
case "4":
FristMenu();
break;
}
} // 三级菜单--组群管理
public void ThirdMenuGroup() {
System.out.println("组群管理:");
System.out.println("1.新建组群");
System.out.println("2.修改组群");
System.out.println("3.删除组群");
} // 三级菜单--联系人管理
public void ThirdMenuContact() { } // 三级菜单--查看联系人
public void ThirdMenuQueryContact() { } // 登录
public void login() { } // 注册
public void register() {
System.out.println("欢迎注册新用户");
String username = "";
while (true) {// 判断用户名是否重复
System.out.println("请输入用户名:");
username = sc.next();
if (userSer.isNameRepeat(username)) {
System.out.println("该用户名已经被注册,请重新输入");
} else {
break;
}
}
System.out.println("请输入密码:");
String password = sc.next();
// 完成注册
int result = userSer.addUser(username, password);
if (result == 1) {
System.out.println("注册成功!");
//给默认用户分配一个默认组群
groupSer.addDefaultGroup(0);
//跳珠到二级菜单
secondMenu();
} else {
System.out.println("注册失败,请重新注册!");
register();
}
}
}

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. hihocoder编程练习赛75

    题目1 : 工作城市分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H公司在北京和上海两个城市各有一间办公室.该公司最近新招募了2N名员工,小Hi负责把这2N名员工 ...

  2. Java自动内存管理机制学习(一):Java内存区域与内存溢出异常

    备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创 ...

  3. Spring之AOP的注解配置

    配置过程可以简单的分为3步: 1,业务类配置 在业务类前加入,将业务类交由Spring管理 @Component("s") 这个表示,这个业务类的Bean名字为 s . 2,将切点 ...

  4. php对二维数据排序

    对于一维数组排序比较简单,像使用sort(),asort(),arsort()等函数进行排序,但是对于二维数组比较麻烦,所有借鉴网上的总结了一下 // 对二维数组进行指定key排序 $arr 二维数组 ...

  5. JS中的可枚举属性与不可枚举属性以及扩展

    在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的.可枚举性决定了这个属性能否被for…in查找遍历到. 一.怎么判断属性是否可枚举 js中基本包 ...

  6. 利用Fiddler修改请求信息通过Web API执行Dynamics 365操作(Action)实例

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复261或者20170724可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  7. Javascript 对象 - 数学对象

    数学对象 JavaScript中提供了math对象,math对象包含一些常用的属相和方法.Math对象与Array对象.String对象.Data对象不同,没有构造函数,因此不能创建Math对象.可直 ...

  8. Jmeter自带录制功能

    版本更新迭代较快的情况下,通过自动化进行冒烟测试以判断版本准入,在无接口文档的情况下,如果进行自动化?Jmeter有一个自带的录制功能,可以通过录制,获取各个接口设计情况,下面介绍如何进行使用 1.打 ...

  9. css的定义、用法、注释、命名规则、书写规范

    什么是css: css全名是层叠样式表(Cascading Style Sheets) CSS的作用:给html标签添加"样式",样式定义了如何显示 HTML 元素 标签是可以由自 ...

  10. html之css选择器学习

    相关内容: 什么是css选择器 标签选择器 类选择器 id选择器 并集选择器(分组选择器) 交集选择器 后代选择器 子标签选择器 属性选择器 相邻兄弟选择器 伪类选择器 伪元素选择器(伪对象选择器) ...