一.DAO设计思想

a) Data access Object(数据访问对象):前人总结出的一种固定模式的设计思想。

高可读性、

高复用性、

高扩展性、

b) JDBC代码实现的增删改查操作是有复用需求的。所以需要将对数据库的增删改查操作进行封装。

c) DAO类:特殊类。只对对数据库进行CRUD(增删改查)的操作进行具体的封装。

d) 注意:DAO类的个数取决于table的个数(一份库表对应一个DAO类)

e) 实体类:在项目开发中,对数据库进行增删改查的操作中,不能直接操作对象。但是在面向对象的项目开发中,万物皆对象,所以可以让CRUD操作去操作某个对象的属性。该对象就可以成为实体对象,创建实体对象的模板叫做实体类。

f) Java中访问数据库的技术:JDBC,hibnate,mybatis

g) 为了让DAO具有更强的通用性:DAO接口+不同的DAO实现类

二.Service设计思想

a) Service也被称作为Biz或者Business:业务层处理。

b) 业务:指的就是项目中某一个具体的功能或者一个具体的操作。(注册)

c) 业务的组成:是由DAO的调用组成。

d) Service类:对具有复用需求的业务进行封装。

e) Service标准的开发方式:Service接口+Service实现类。目的:屏蔽实现的差异。比如转账(业务)操作,会有两种不同实现的方式,一种是收手续费的实现方式,一种是不收手续费的实现方式。

三.事物处理的封装

a) 事物:要保证业务(Service)中的DAO方法的执行要一起成功或者一起失败。

b) 事物控制代码书写的位置:写在Service层中(业务方法)

c) 事物控制代码:

conn.commot():提交事物。conn是jbdc中的数据库连接对象。

conn.rollback():撤掉事物。conn是jbdc中的数据库连接对象。

d) 问题:提交事物的方法commit必须是由连接对象调用的。但是在业务方法中是没有连接对象的。连接对象存在DAO中的。所以我们需要将DAO中的连接对象可以在Service的业务方法中获取。(保证Service业务方法中的连接对象和DAO中的连接对象是同一个)

e) 解决:使用线程绑定(ThreadLocal):

i. 线程绑定原理:我们可以将“连接对象”存放到一个线程对象中。只要是在同一个线程中,就可以取得之前存放在线程中的数据。

ii. get():获取线程中存放的数据

iii. set(T obj):向线程中存放数据。

iv. 获取当前线程对象:ThreadLocal<Connection>  tl=new ThreadLocal<Connection>();

f) 注意(重要):JDBC中会自动为sql语句添加事物。

g) 关闭JDBC自动提交事物机制:conn.setAutoCommit(false);(写在业务方法中)

代码演示:

1.实体类

package entitys;

public class User {
int user_id;
String user_name;
String User_pwd;
int status;
int role;
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_pwd() {
return User_pwd;
}
public void setUser_pwd(String user_pwd) {
User_pwd = user_pwd;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getRole() {
return role;
}
public void setRole(int role) {
this.role = role;
} }
//此实体类对应数据库中的一张表中的列即属性

二.service层(业务处理层)

package service;

public interface  UserServiceInterface {
void userRegist(); }// 接口为了更好的扩展

service实现类:

package service;

import java.sql.Connection;
import java.util.Scanner; import com.chinasoft.javase.JdbcProterties; import entitys.User; import DAO.UserDaoImp; public class UserServiceImp implements UserServiceInterface{ //注册
public void userRegist() {
Connection conn = null;
try {
conn = JdbcProterties.getConnection();
//关闭JDBC事物自动提交方式
conn.setAutoCommit(false); //获取用户注册信息
Scanner input = new Scanner(System.in);
System.out.println("输入用户名:");
String name = input.next();
System.out.println("输入密码:");
String pwd = input.next();
int role = 1;
int status = 0;
//判断注册状态,判断用户名是否存在,存在注册失败,反之进行第三步
UserDaoImp userdaoImp = new UserDaoImp();
boolean isHas = userdaoImp.queryByUserName(name);
if(isHas==true){
System.out.println("用户名存在,注册失败!");
}else{
User user = new User();
user.setUser_id(14);
user.setUser_name(name);
user.setUser_pwd(pwd);
user.setStatus(status);
user.setRole(role);
//插入
userdaoImp.insertUser(user); }
//提交事物
conn.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
JdbcProterties.close(conn, null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } }

三.DAO层

接口:

package DAO;

import entitys.User;

public interface UserDaoInterface {
boolean queryByUserName(String name);//ture存在
void insertUser(User user);//保存存储信息 }

DAO实现类:

package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import utils.JdbcProterties;
import entitys.User; public class UserDaoImp implements UserDaoInterface {
public boolean queryByUserName(String name) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
boolean flag = false;
try {
conn = JdbcProterties.getConnection();
String sqlStr ="select *from t_user where username = ?";
ps = conn.prepareStatement(sqlStr);
ps.setString(1, name);
rs = ps.executeQuery();
if(rs.next()!=true){ flag = false;
}
else{
flag= true;
} JdbcProterties.close(null, ps, rs);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return flag; } @Override
public void insertUser(User user) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcProterties.getConnection();
String sqlStr ="insert into t_user values(?,?,?,?,?)";
ps = conn.prepareStatement(sqlStr);
ps.setInt(1, user.getUser_id());
ps.setString(2, user.getUser_name());
ps.setString(3,user.getUser_pwd());
ps.setInt(4,user.getStatus());
ps.setInt(5, user.getRole());
ps.executeUpdate();
System.out.println("插入完毕!");
//关闭
JdbcProterties.close(null, ps);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

四 .JDBC:封装过后的

1. JdbcProterties.java

package utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties; public class JdbcProterties {
//
static Properties pt = null;
static FileInputStream fs = null;
static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();//通过线程绑定机制,创建当前线程对象用来存储connection对象。
static{ try {
fs = new FileInputStream("src/OracleJdbc.properties");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pt = new Properties();//Properties集合对象
try {
pt.load(fs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//可以将流对象中的数据值以键值对加载到Properties集合对象中
}
public static Connection getConnection()throws Exception{
Connection conn = tl.get();
if(conn==null){
Class.forName(pt.getProperty("drivers")); conn =DriverManager.getConnection(pt.getProperty("URl"),pt.getProperty("User"),pt.getProperty("PWD"));
tl.set(conn);
return conn;
} return conn; }
//关闭
public static void close(Connection conn,PreparedStatement ps)throws Exception{
if(conn!=null){
conn.close(); }
if(ps!=null){
ps.close();
} }
//重载
public static void close(Connection conn,PreparedStatement ps,ResultSet rs)throws Exception{
if(conn!=null){
conn.close();
}
if(ps!=null){
ps.close();
}
if(rs!=null){
rs.close();
} } }

配置文件:

2.  OracleJdbc.properties

drivers=oracle.jdbc.OracleDriver
URl=jdbc:oracle:thin:@127.0.0.1:1521:XE
User=HR
PWD=123456

五.测试

package test;

import org.junit.Test;

import service.UserServiceImp;
import service.UserServiceInterface; public class UserTest {
@Test
public void test()throws Exception{
UserServiceInterface us =new UserServiceImp();
us.userRegist(); } }

JDBC中DAO+service设计思想的更多相关文章

  1. 讨论Android开发中的MVC设计思想

    最近闲着没事,总是想想做点什么.在时间空余之时给大家说说MVC设计思想在Android开发中的运用吧! MVC设计思想在Android开发中一直都是一套比较好的设计思想.很多APP的设计都是使用这套方 ...

  2. JDBC中DAO事务函数模版

    DAO事物函数模版1: public void OrderFinsByPage(){ Connection conn = null; PreparedStatement pstmt = null; R ...

  3. facade层,service 层,domain层,dao 层设计

    转自http://fei-6666.iteye.com/blog/446247,记录下来 一,Service->DAO,只能在Service中注入DAO. 二,DAO只能操作但表数据,跨表操作放 ...

  4. 撰写一篇博客要求讲述四则运算2的设计思想,源程序代码、运行结果截图、编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志。

    一.撰写一篇博客要求讲述四则运算2的设计思想,源程序代码.运行结果截图.编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志. 1.设计思想: ①创建test.jsp建立第一个前端界面,提 ...

  5. 一、DAO设计模式 二、DAO设计模式的优化 三、JDBC中的事务,连接池的使用

    一.DAO设计模式概述###<1>概念 DAO,Data Access Object ,用于访问数据库的对象. 位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问![](1.png) ...

  6. Spring框架中,在工具类或者普通Java类中调用service或dao

    spring注解的作用: 1.spring作用在类上的注解有@Component.@Responsity.@Service以及@Controller:而@Autowired和@Resource是用来修 ...

  7. 深入理解--SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层都有什么作用

    SSM是sping+springMVC+mybatis集成的框架. MVC即model view controller. model层=entity层.存放我们的实体类,与数据库中的属性值基本保持一致 ...

  8. React中的响应式设计思想和事件绑定

    这两个点是react入门非常重要的两个点,以前我们是直接操作dom的形式去做,react的设计思想和以前直接操作dom是完全不同的,react是一个响应式的框架,他在做编程的时候,强调的是我们不要直接 ...

  9. 代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件)

    package com.flong.codegenerator; import java.sql.Connection; import java.sql.DatabaseMetaData; impor ...

随机推荐

  1. hexo 错误汇总

    文章目录 发布文章遇到: 发布文章的时候出现错误: 代码推送到github,hexo g -d 半天推送不上去 记录一次hexo+coding hexo s本都没问题,hexo g -d 样式并未改变 ...

  2. jquery判断是pc端还是移动端

    原文地址:https://www.cnblogs.com/mo-cha/p/6038872.html $(function(){ var system = { win: false, mac: fal ...

  3. 一些关于Hibernate延迟加载的误区

    最近面试别人,正好出的笔试题中有道关于Hibernate延迟加载的问题,聊天过程中发现很多人对Hibernate的延迟加载有些理解误区,写 些东东在这里,希望对大家有所帮助. 首先是第一个误区:延迟加 ...

  4. 接着上回,导包正确之后,出现javabean.Friend cannot be cast to java.util.List,的错误。找了很久。以为是User user0作为参数,改成了String username还是错误,看了看listFriend.jsp没有错误,我想会不会是包多了,导致类型复杂。最后发现包少了一个:

    import org.apache.commons.dbutils.handlers.BeanListHandler;这个包,BeanListHandler让我发现List<Friend> ...

  5. 阿里云服务器安装Python3.8

    1.操作系统: CentOS 7.4 64位 2.下载python安装包 wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.x ...

  6. VM 虚拟机使用桥接模式却连不上网的解决办法(转载)

    只需将VM的虚拟网络编辑器中关于 VMnet0 的设置改一下就行了: 1.进入VMware的 编辑 -> 虚拟网络编辑器. 第一步 2.选择更改设置. 3.将VMnet0(或其它类型为桥接模式的 ...

  7. ActiveMQ 传输协议

    配置 ActiveMQ安装目录的conf/activemq.xml中的<transportConnectors>标签之内. 配置示例 TCP(默认协议,性能相对可靠) Transmissi ...

  8. Python数据挖掘之决策树DTC数据分析及鸢尾数据集分析

    Python数据挖掘之决策树DTC数据分析及鸢尾数据集分析 今天主要讲述的内容是关于决策树的知识,主要包括以下内容:1.分类及决策树算法介绍2.鸢尾花卉数据集介绍3.决策树实现鸢尾数据集分析.希望这篇 ...

  9. day 36 MySQL的库、表的详细操作

    MySQL的库.表的详细操作   MySQL数据库 本节目录 一 库操作 二 表操作 三 行操作 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset u ...

  10. Java 常用正则表达式

    一. 只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$".只能输入至少n位的数字:"^\d{n,}$".只能输入m~ ...