• JDBC中DAO+service设计思想


    一.DAO设计思想

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

      高可读性、

      高复用性、

      高扩展性、

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

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

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

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

    f) Java中访问数据库的技术:JDBChibnatemybatis

    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():提交事物。connjbdc中的数据库连接对象。

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

    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();
    		
    	}
    
    }
    



  • 相关阅读:
    获取网站IP地址(Linux,C)
    linux_c_udp_example
    linux_c_tcp_example
    golang-sort
    docker_jenkins
    依赖抽象,而不要依赖具体实现
    网络杂记
    游戏开发中遇到的问题
    随手杂记
    go多态
  • 原文地址:https://www.cnblogs.com/jatpeo/p/11767567.html
Copyright © 2020-2023  润新知