JDBC中DAO+service设计思想
来源:互联网 发布:编程课 编辑:程序博客网 时间:2024/06/01 08:18
一.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 blocke.printStackTrace();}finally{try {JdbcProterties.close(conn, null);} catch (Exception e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();}return flag;}@Overridepublic 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 blocke.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 blocke.printStackTrace();} pt = new Properties();//Properties集合对象try {pt.load(fs);} catch (IOException e) {// TODO Auto-generated catch blocke.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.OracleDriverURl=jdbc:oracle:thin:@127.0.0.1:1521:XEUser=HRPWD=123456
五.测试
package test;import org.junit.Test;import service.UserServiceImp;import service.UserServiceInterface;public class UserTest {@Testpublic void test()throws Exception{UserServiceInterface us =new UserServiceImp();us.userRegist();}}
- JDBC中DAO+service设计思想
- JAVA-JDBC: (4) DAO设计思想及骨架搭建
- JDBC : DAO设计模式
- JDBC DAO设计
- JDBC中Dao层
- 简化DAO设计的思想
- Spring DAO层设计思想
- 第二十章 JDBC DAO设计
- JDBC中的Dao设计模式
- JDBC(七) DAO设计模式
- facade service domain dao 设计
- Spring DAO层的设计思想
- JDBC编程——DAO设计模式
- JDBC编程和DAO设计模式
- JDBC连接MYSQL的DAO设计模式
- JDBC Dao的设计模式框架搭建
- Dao与Service层的设计
- Dao、Service为什么设计成单例模式
- ReactRouter升级 v2 to v4
- 针对python机器学习与实战代码在python3上运行出现的错误分析和warning的修改代码34—38
- 提升PPT逼格的利器!只需1招,让PPT页面化腐朽为神奇~
- Python异常:Django1.11--context must be a dict rather than RequestContext.
- 解决MySQL每隔8小时自动断开连接的问题
- JDBC中DAO+service设计思想
- #if _MSC_VER > 1000 #pragma once #endif 作用解释
- Python3.6简单的操作Mysql数据库
- js中数组原型Array、自定义原型函数Array.prototype
- 综合案例【session、context、filter、listener...】
- 系统维护开发核心秘籍
- Autodesk T-Splines 4.0 For Rhino下载
- What?你和酷炫的PPT之间居然只差了一个QQ截图!
- bzoj1491 [NOI2007]社交网络(Floyd+组合数学)