dao模式--基礎

一共有23種設計模式
總體來說設計模式分爲三大類:
創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
單例模式:爲了解決只創建唯一一個類
解決辦法:不能創建公共的方法,創建一個靜態的方法,在多線程的環境下有問題,可以有一系列的解決辦法

dao全稱是data access object,數據訪問對象
主要的功能就是用於進行數據操作的,在程序的標準開發架構中屬於數據層的操作
一個典型的dao模式應該包括的部分有
vo:值對象 value object
dao接口:封裝所有的數據的操作
面向接口編程的主要優點就是:1.高內聚,低耦合;2.易於程序擴展和維護;
對擴展開放,對修改關閉
dao實現類
將定義和實現分開,這麼做最大的優點就是解耦,降低程序的耦合性
dao工廠:用來創建dao對象
把對數據的各種操作封裝

例:對圖書表進行操作的dao
vo:book//映射
bookid,bookname,price
dao:bookdao//操作
void insert();
void delete();
void update();
void select();
1.定義一個Sys_user 類(vo);
含有數據庫表中的字段

package vo;

public class Sys {
         Integer userid;
         String username;
         Integer remain;
		public Sys(String username, Integer remain) {
			super();
			this.username = username;
			this.remain = remain;
		}
		public Sys() {
			super();
		}
		public Integer getUserid() {
			return userid;
		}
		public void setUserid(Integer userid) {
			this.userid = userid;
		}
		public String getUsername() {
			return username;
		}
		public void setUsername(String username) {
			this.username = username;
		}
		public Integer getRemain() {
			return remain;
		}
		public void setRemain(Integer remain) {
			this.remain = remain;
		}
		@Override
		public String toString() {
			return "Sys [userid=" + userid + ", username=" + username + ", remain=" + remain + "]";
		}
		
		
         
         
}

定義一個dao接口

package dao;

import java.util.List;

import vo.Sys;


/*
 * 對Sys_user對象各種操作的封裝
 */
public interface SysDao {
	void delete(Integer userid);
	
	
	List<Sys> getAll();
	void insert(Sys s);
	boolean update(Sys s);
	Sys getSysById(Integer userid);
}


定義實現類

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import util.JdbcUtil;
import vo.Sys;

public class Sys_userDaoImpl implements SysDao {

	@Override
	public void insert(Sys s) {
		// TODO Auto-generated method stub
         //
		String sql = "insert into Sys_user values(null,?,?)";
         try(Connection conn = JdbcUtil.getConnections();
        		 PreparedStatement ps= conn.prepareStatement(sql))
         {
        	 ps.setString(1, s.getUsername());
        	 ps.setInt(2, s.getRemain());
        	 
        	 ps.execute();
        	 System.out.println("插入一個賬戶:"+s);
        	 
        	 
         } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void delete(Integer userid) {
		// TODO Auto-generated method stub
        String sql="delete from Sys_user where userid = ?";
        try(Connection conn = JdbcUtil.getConnections();
       		 PreparedStatement ps= conn.prepareStatement(sql))
        {
               ps.setInt(1, userid);
               ps.execute();
        } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        System.out.println("刪除成功");
	}

	@Override
	public boolean update(Sys s) {
		// TODO Auto-generated method stub
		int b=0;
		String sql = "update Sys_user set userName=?,remain=? where userid = ?";
		try(Connection conn = JdbcUtil.getConnections();
       		 PreparedStatement ps= conn.prepareStatement(sql))
        {
			
			ps.setString(1, s.getUsername());
			ps.setInt(2, s.getRemain());
			ps.setInt(3, s.getUserid());
			
			b= ps.executeUpdate();
			} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("更新成功!");
		return b>0?true:false;
	}
           
}

重複的代碼過多:
對方法進行重構;改變方法裏邊的內容,不影響用戶使用
不重複的地方只有sql語句
1.5版本的新特性 可變參數
優化後:

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JdbcUtil {
	
	static String url="jdbc:mysql://localhost:3306/java1114";
	static String user="root";
	static String password="root";
	static 
	{
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static Connection getConnections()
	{
		try {
			return DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 執行一個sql
	 * @param sql
	 * @param args;sql語句需要綁定的參數值  
	 * @return
	 */
	 
	public static int executeSql(String sql,Object...args) {
		int count = 0;
		try(Connection conn = JdbcUtil.getConnections();
				PreparedStatement ps = conn.prepareStatement(sql)){
			
			for(int i=0;i<args.length;i++) {
				ps.setObject(i+1, args[i]);
			}
			count = ps.executeUpdate();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return count;
	}
}

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import util.JdbcUtil;
import vo.Sys;

public class SysDaoImpl implements SysDao {

	String sql_insert = "insert into Sys_user values(null,?,?)";
	  String sql_delete="delete from Sys_user where userid = ?";
	  String sql_update = "update Sys_user set userName=?,remain=? where userid = ?";
	@Override
	public void insert(Sys s) {
		// TODO Auto-generated method stub
        JdbcUtil.executeSql(sql_insert, s.getUsername(),s.getRemain());
        System.out.println("插入成功!"+s);
        
	}

	@Override
	public void delete(Integer userid) {
		// TODO Auto-generated method stub
      JdbcUtil.executeSql(sql_delete, userid);
        System.out.println("刪除成功!"+userid);
	}

	@Override
	public boolean update(Sys s) {
		// TODO Auto-generated method stub
		if(JdbcUtil.executeSql(sql_update, s.getUsername(),s.getRemain(),s.getUserid())!=0)
			return true;
		return false;
		       
	}
           
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章