一.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  tl=new ThreadLocal();

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 tl = new ThreadLocal();//通过线程绑定机制,创建当前线程对象用来存储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();

}

}

java中service设计_JDBC中DAO+service设计思想相关推荐

  1. JDBC , 使用java来控制mysql。JavaWeb开发的分层设计-三层架:DAO层设计,连接池使用,类加载使用,配置...

    大家可以关注一下我的博客  我的博客所有随笔都是我从基础开始学习java的所有知识点 1. Jdbc概述 问题:实际开发中,不可能用工具或者命令行操作数据库,数据库表中的数据最终要使用Java程序来操 ...

  2. java domain层_java框架中的controller层、dao层、domain层、service层、view层

    1.Controller层:接口层,用户访问请求时对接. Controller层负责具体的业务模块流程的控制,在此层里面要调用Serice层的接口来控制业务流程,控制的配置也同样是在Spring的配置 ...

  3. java web中的service,servlet和Dao有什么区别

    servlet一般用于生成网页:service在后端中,web,service,Dao三层中,用于service调用Dao层.DAO类都是进行数据操作的类,是对于数据库中的数据做增删改查等操作的代码. ...

  4. java 支付类的接口,Java后端支付大杂烩之core.dao,service,web(重点是接口的设计)(二)...

    PayMap PayMap是一个使用Java语言集成三方支付的小Demo,现已集成支付宝(国内.国际.移动端.PC端).微信.银联(ACP.UPOP).光大(网关.网页).邮政支付,采用的技术栈为:S ...

  5. Spring中的@ Component,@ Repository和@Service批注有什么区别?

    @Repository @Component , @Repository和@Service批注可以在Spring中互换使用吗,或者除了充当注解设备外,它们还提供任何特定功能吗? 换句话说,如果我有一个 ...

  6. java po vo bo是什么以及_JAVA中(PO,VO,TO,BO,DAO,POJO)分别是指什么

    (一)O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据. 在O/R Mapping的世界 ...

  7. 浅谈Service Mesh体系中的Envoy

    摘要: 提到Envoy就不得不提Service Mesh,说到Service Mesh就一定要谈及微服务了,那么我们就先放下Envoy,简单了解下微服务.Service Mesh以及Envoy在Ser ...

  8. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...

  9. java dao service实例_浅谈Action+Service +Dao 功能

    1. Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. D ...

最新文章

  1. android toast几种使用方法 (转)
  2. 《数据库原理与应用》(第三版) 第 3 章 关系数据库 习题参考答案
  3. 自己动手写CPU(4)移动操作指令的实现
  4. Replace Inheritance with Delegation(以委托取代继承)
  5. python——rang函数、for、braek循环
  6. 干货:用Python玩转数据可视化,炫酷图表是这样做出来的
  7. 减少HTTP请求的方法
  8. 动态构建LINQ表达式
  9. 热烈祝贺:关于OpenJDK8 LINUX版本输入法候选框不能跟随光标移动的BUG及解决办法,已上报Oracle
  10. snmp 获取mac add table_【群晖系统】不拆机不进PE直接修改黑群晖的SN和MAC
  11. Yum离线安装(一) --- RPM 打包技术与典型 SPEC 文件分析
  12. amd编码器 hevc_Bandicam支持Nvidia NVENC编码器(H264, HEVC) - Bandicam(班迪录屏)
  13. MySQL数据库基础
  14. 关于Protel 2004 绘制电路原理图
  15. div水平垂直居中方法汇总(共六种)
  16. 西瓜数据集3.0 python_决策树对西瓜数据集2.0二分类
  17. ABAPDEMO批量更改BOM组件_SAP刘梦_新浪博客
  18. linux识别riser卡,Riser卡和PCIe槽位
  19. openjudge 1.5.21 角谷猜想
  20. Stern-Brocot树 (生成0-1之间的所有真分数)

热门文章

  1. 《C++并发编程实战》——1.1 什么是并发
  2. UVa 208-Firetruck
  3. features its own
  4. 智能指针auto_ptr管理单例
  5. php变量存储过程,php - 从存储过程调用返回的变量作为用于可变的输出值 - SO中文参考 - www.soinside.com...
  6. mysql 堆表_Mysql聚集索引和非聚集索引(堆组织表和索引组织表)
  7. 步进电机为什么无法高速启动?
  8. C++面试题-面向对象-静态成员变量以及静态成员函数
  9. 标准 C I/O函数
  10. TurboDrive技术