java中service设计_JDBC中DAO+service设计思想
一.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设计思想相关推荐
- JDBC , 使用java来控制mysql。JavaWeb开发的分层设计-三层架:DAO层设计,连接池使用,类加载使用,配置...
大家可以关注一下我的博客 我的博客所有随笔都是我从基础开始学习java的所有知识点 1. Jdbc概述 问题:实际开发中,不可能用工具或者命令行操作数据库,数据库表中的数据最终要使用Java程序来操 ...
- java domain层_java框架中的controller层、dao层、domain层、service层、view层
1.Controller层:接口层,用户访问请求时对接. Controller层负责具体的业务模块流程的控制,在此层里面要调用Serice层的接口来控制业务流程,控制的配置也同样是在Spring的配置 ...
- java web中的service,servlet和Dao有什么区别
servlet一般用于生成网页:service在后端中,web,service,Dao三层中,用于service调用Dao层.DAO类都是进行数据操作的类,是对于数据库中的数据做增删改查等操作的代码. ...
- java 支付类的接口,Java后端支付大杂烩之core.dao,service,web(重点是接口的设计)(二)...
PayMap PayMap是一个使用Java语言集成三方支付的小Demo,现已集成支付宝(国内.国际.移动端.PC端).微信.银联(ACP.UPOP).光大(网关.网页).邮政支付,采用的技术栈为:S ...
- Spring中的@ Component,@ Repository和@Service批注有什么区别?
@Repository @Component , @Repository和@Service批注可以在Spring中互换使用吗,或者除了充当注解设备外,它们还提供任何特定功能吗? 换句话说,如果我有一个 ...
- java po vo bo是什么以及_JAVA中(PO,VO,TO,BO,DAO,POJO)分别是指什么
(一)O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据. 在O/R Mapping的世界 ...
- 浅谈Service Mesh体系中的Envoy
摘要: 提到Envoy就不得不提Service Mesh,说到Service Mesh就一定要谈及微服务了,那么我们就先放下Envoy,简单了解下微服务.Service Mesh以及Envoy在Ser ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...
- java dao service实例_浅谈Action+Service +Dao 功能
1. Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. D ...
最新文章
- android toast几种使用方法 (转)
- 《数据库原理与应用》(第三版) 第 3 章 关系数据库 习题参考答案
- 自己动手写CPU(4)移动操作指令的实现
- Replace Inheritance with Delegation(以委托取代继承)
- python——rang函数、for、braek循环
- 干货:用Python玩转数据可视化,炫酷图表是这样做出来的
- 减少HTTP请求的方法
- 动态构建LINQ表达式
- 热烈祝贺:关于OpenJDK8 LINUX版本输入法候选框不能跟随光标移动的BUG及解决办法,已上报Oracle
- snmp 获取mac add table_【群晖系统】不拆机不进PE直接修改黑群晖的SN和MAC
- Yum离线安装(一) --- RPM 打包技术与典型 SPEC 文件分析
- amd编码器 hevc_Bandicam支持Nvidia NVENC编码器(H264, HEVC) - Bandicam(班迪录屏)
- MySQL数据库基础
- 关于Protel 2004 绘制电路原理图
- div水平垂直居中方法汇总(共六种)
- 西瓜数据集3.0 python_决策树对西瓜数据集2.0二分类
- ABAPDEMO批量更改BOM组件_SAP刘梦_新浪博客
- linux识别riser卡,Riser卡和PCIe槽位
- openjudge 1.5.21 角谷猜想
- Stern-Brocot树 (生成0-1之间的所有真分数)
热门文章
- 《C++并发编程实战》——1.1 什么是并发
- UVa 208-Firetruck
- features its own
- 智能指针auto_ptr管理单例
- php变量存储过程,php - 从存储过程调用返回的变量作为用于可变的输出值 - SO中文参考 - www.soinside.com...
- mysql 堆表_Mysql聚集索引和非聚集索引(堆组织表和索引组织表)
- 步进电机为什么无法高速启动?
- C++面试题-面向对象-静态成员变量以及静态成员函数
- 标准 C I/O函数
- TurboDrive技术