1. 程式人生 > >JDBC操作資料庫以及三層架構模式

JDBC操作資料庫以及三層架構模式

JDBC操作資料庫

1、JDBC概念

JDBC是實現java程式對各種資料庫的訪問,是一組類和介面,位於java.sql與javax.sql包

2、通過JDBC連線資料庫(不優化前)

//1、載入驅動
			Class.forName("com.mysql.jdbc.Driver");
			//2、建立連線
			String url="jdbc:mysql://localhost:3306/myschool";
			String user ="root" ;
			String password = "aaaaa123";
			con= DriverManager.getConnection
(url, user, password); //建立sql語句 String sql ="SELECT studentno,studentName FROM student"; //建立物件 pstm =con.prepareStatement(sql); //執行sql語句 rs=pstm.executeQuery(); //處理結果 System.out.println("編號:\t姓名:"); while(rs.next()) { System.out.println(rs.getInt("studentno")+"\t"+rs.getString
("studentName")); } //關閉資源 rs.close(); pstm.close(); con.close();

Class.forName() 後加載 反射,事先不知道載入哪個類,執行時進行載入(橋接) 而Student stu =new Student() 先載入類

3、使用JDBC操作資料庫(增刪改查)(不優化前)

//增加資料
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; public class Test3 { public static void main(String[] args) { ResultSet rs =null; PreparedStatement pstm=null; Connection con =null; //1、載入驅動 try { Class.forName("com.mysql.jdbc.Driver"); //2、建立連線 String url="jdbc:mysql://localhost:3306/kgcnews"; String user ="root" ; String password = "aaaaa123"; con= DriverManager.getConnection(url, user, password); //建立sql語句 String sql ="INSERT INTO news_category (NAME,createDate) VALUES (?,?)"; //建立物件 pstm =con.prepareStatement(sql); //給佔位符賦值 pstm.setString(1, "哈哈"); pstm.setTimestamp(2, new Timestamp(10)); //執行sql語句 int i=pstm.executeUpdate(); //處理結果 if(i>=1) { System.out.println("增加成功"); }else { System.out.println("未增加"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally { if(null !=pstm) { try { pstm.close(); } catch (SQLException e) { e.printStackTrace(); } } if(null !=con) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }

增刪改操作類似,只是替換sql語句即可

4、JDBC封裝和三層架構

1、JDBC的三層架構

  • 表示層

    實際開發中的網頁或者我們這裡的test包,相當於現實中單客戶

  • 邏輯業務層

    處理邏輯業務,我們這裡的service包,相當於現實中的經理

  • 資料處理層

    底層處理資料層,這裡的dao以及entity包,相當於員工

為什麼要進行JDBC封裝?
主要是因為業務程式碼和資料訪問程式碼的耦合。這就導致了可讀性差、不利於後期修改和維護、不利於程式碼複用。
所以我們採用面向介面程式設計,可以降低程式碼之間的耦合性。

2、專案包

在這裡插入圖片描述

3、具體實現步驟

  • 先建entity包,這個包中放實體類,這裡我們放pet類,,將資料庫表中的欄位作為pet的屬性,併為其新增set和get方法,以及相應的有參和無參構造方法
package entity;

public class Pet {
	private int id;
	private String name;
	private int health;
	private int love;
	private String strain;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getHealth() {
		return health;
	}
	public void setHealth(int health) {
		this.health = health;
	}
	public int getLove() {
		return love;
	}
	public void setLove(int love) {
		this.love = love;
	}
	public String getStrain() {
		return strain;
	}
	public void setStrain(String strain) {
		this.strain = strain;
	}
	public Pet() {
		super();
	}
	public Pet(int id, String name, int health, int love, String strain) {
		super();
		this.id = id;
		this.name = name;
		this.health = health;
		this.love = love;
		this.strain = strain;
	}
	
}

  • 建dao包,寫BaseDao基類

    package dao;
    /**
     * 基類
     * 1.建立連線物件
     * 2.關閉資源
     * 3.增加,刪除,修改操作
     * 4.查詢方法
     * @author Administrator
     *
     */
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Properties;
    
    public class BaseDao {
    	
    
    	//靜態變數可以保證類被載入的時候已經為連線引數賦值,並且只會執行一次
    	private static String driver =null;
    	private static String url =null;
    	private static String user =null;
    	private static String password =null;
    	
    	/*
    	 * 靜態程式碼塊
    	 */
    	static {
    		Properties proper = new Properties();
    		InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
    		try {
    			proper.load(is);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}finally {
    			try {
    				if(null!=is) {
    					is.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		//為靜態程式碼塊賦值
    		driver=proper.getProperty("driver");
    		url=proper.getProperty("url");
    		user=proper.getProperty("user");
    		password=proper.getProperty("password");
    	}
    	protected Connection conn =null;
    	protected PreparedStatement pstmt =null;
    	protected ResultSet rs =null;
    	
    	/**
    	 * 獲取連線物件
    	 * @return
    	 */
    	public Connection getConnection() {
    		try {
    			//1、載入驅動類
    			Class.forName(driver);
    			//2、建立連線物件
    			conn=DriverManager.getConnection(url,user,password);
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return conn;
    	}
    	
    	/**
    	 * 關閉資源
    	 * @param conn
    	 * @param pstmt
    	 * @param rs
    	 */
    	public void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs) {
    		try {
    			if(null!=conn) {
    				conn.close();
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		try {
    			if(null!=pstmt) {
    				pstmt.close();
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		try {
    			if(null!=rs) {
    				rs.close();
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 增刪改操作
    	 * @param sql
    	 * @param params
    	 * @return
    	 */
    	public int exxcutUpdate(String sql,Object[] params) {
    		this.getConnection();
    		int result=-1;
    		try {
    			//3、建立prepareStatement物件
    			pstmt=conn.prepareStatement(sql);
    			//4、為佔位符賦值
    			if(null!=params) {
    				for (int i = 0; i < params.length; i++) {
    					pstmt.setObject(i+1, params[i]);
    				}
    			}
    			//5.呼叫方法:執行sql語句
    			result=pstmt.executeUpdate();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}finally {
    			this.closeAll(conn, pstmt, rs);
    		}
    		return result;
    	}
    	
    	/**
    	 * 查詢方法
    	 * @param sql
    	 * @param params
    	 * @return
    	 */
    	public ResultSet  executQuery(String sql,Object... params) {
    		this.getConnection();
    		try {
    			//3、建立prepareStatement物件
    			pstmt=conn.prepareStatement(sql);
    			//4、為佔位符賦值
    			if(null!=params) {
    				for (int i = 0; i < params.length; i++) {
    					pstmt.setObject(i+1, params[i]);
    				}
    			}
    			//5.呼叫方法:執行sql語句
    			rs=pstmt.executeQuery();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return rs;
    	}
    	
    	
    	
    	
    	
    	
    	
    }
    
    
  • 寫資料處理層的介面

    package dao;
    
    import java.util.List;
    
    import entity.Pet;
    
    /**
     * 介面
     * @author Administrator
     *
     */
    public interface PetDao {
    	
    	/**
    	 * 查詢所有寵物列表
    	 * @return
    	 */
    	public List<Pet> findaLLPet();
    	
    	/**
    	 * 根據編號查詢寵物列表
    	 * @param id
    	 * @return
    	 */
    	public Pet findAllPetById(int id);
    	
    	/**
    	 * 新增寵物
    	 * @param pet
    	 * @return
    	 */
    	public int addPet(Pet pet);
    }
    
    
  • 寫資料處理層實現類PetDaoImpl,在dao包下面建子包impl

    注意建子包要父包名點子包名,然後設定包的顯示順序

    package dao.impl;
    
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import dao.BaseDao;
    import dao.PetDao;
    import entity.Pet;
    
    /**
     * 實現類
     * @author Administrator
     *
     */
    public class PetDaoImpl extends BaseDao implements PetDao{
    	
    	/**
    	 * 查詢所有寵物
    	 */
    	@Override
    	public List<Pet> findaLLPet() {
    		List<Pet> list =null;
    		try {
    			String sql = "SELECT id,NAME,health,love,strain FROM pet";
    			Object[] params=null;
    			//呼叫方法
    			rs=this.executQuery(sql, params);
    			if(null!=rs) {
    				list = new ArrayList<>();
    				while(rs.next()) {
    					Pet pet =new Pet();
    					pet.setId(rs.getInt("id"));
    					pet.setName(rs.getString("name"));
    					pet.setHealth(rs.getInt("health"));
    					pet.setLove(rs.getInt("love"));
    					pet.setStrain(rs.getString("strain"));
    					list.add(pet);
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			this.closeAll(conn, pstmt, rs);
    		}
    		return list;
    	}
    	
    	/**
    	 * 根據id查寵物資訊
    	 */
    	@Override
    	public Pet findAllPetById(int id) {
    		Pet pet=null;
    		try {
    			String sql = "SELECT id,NAME,health,love,strain FROM pet WHERE id=?";
    			Object[] params= {id};
    			//呼叫方法
    			rs=this.executQuery(sql, params);
    			if(null!=rs) {
    				while(rs.next()) {
    					pet =new Pet();
    					pet.setId(rs.getInt("id"));
    					pet.setName(rs.getString("name"));
    					pet.setHealth(rs.getInt("health"));
    					pet.setLove(rs.getInt("love"));
    					pet.setStrain(rs.getString("strain"));
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			this.closeAll(conn, pstmt, rs);
    		}
    		return pet;
    	}
    
    	@Override
    	public int addPet(Pet pet) {
    		String sql ="INSERT INTO pet (id,NAME,health,love,strain) VALUES (DEFAULT,?,?,?,?)";
    		Object[] params= {pet.getName(),pet.getHealth(),pet.getLove(),pet.getStrain()};
    		int result =-1;
    		try {
    			result=this.exxcutUpdate(sql, params);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return result;
    	}
    	
    }
    
    
  • 建service包,寫業務處理層的介面PetService

    package service;
    
    import java.util.List;
    
    import entity.Pet;
    
    /**
     * 業務邏輯類
     * @author Administrator
     *
     */
    public interface PetService {
    	//查詢所有寵物資訊
    	public List<Pet> getAllPet();
    	//查詢指定id寵物資訊
    	public Pet getPetById(int id);
    	//註冊
    	public boolean register(Pet pet);
    }
    
    
  • 寫業務處理層的實現類PetServiceImpl,在service包下再建一個包叫impl

    package service.impl;
    
    import java.util.List;
    
    import dao.PetDao;
    import dao.impl.PetDaoImpl;
    import entity.Pet;
    import service.PetService;
    
    /**
     * 業務邏輯類 實現類
     * @author Administrator
     *
     */
    public class PetServiceImpl implements PetService{
    	PetDao petDao = new PetDaoImpl();
    	
    	//查詢所有寵物資訊
    	@Override
    	public List
                
               

    相關推薦

    JDBC操作資料庫以及架構模式

    JDBC操作資料庫 1、JDBC概念 JDBC是實現java程式對各種資料庫的訪問,是一組類和介面,位於java.sql與javax.sql包 2、通過JDBC連線資料庫(不優化前) //1、載入驅動 Class.forName("com.mysql.jdbc.Dr

    也談TDD,以及架構、設計模式、ORM……:沒有免費的午餐

    太特麼的難寫了! 但再難寫也要寫啊,要等到“能寫好了再寫”,怕是黃花菜都涼了——尤其是技術類文章,時效性非常強的。 剛好罈子裡這篇部落格:關於拒絕測試驅動開發(NoTDD),看評論爭議不小,而這個問題也是我最想寫的,所以,蹭個熱點,呵呵。 其實我很好奇,部落格下

    c#基於sqlserver資料庫架構

    我比較菜,大神就不用看了,寫這個是為了做一個學習記錄。 本來佈置的是基於sqlite,還涉及對配置檔案的讀寫,還有基於Base64編碼,讀取sqlite資料庫。上網查了資料對具體的實現方法還是不很清楚,於是就用sqlserver簡單的實現了一下。 談談我自己的理解吧,首先是

    JavaEE——架構模式介紹

    宣告:本欄目所使用的素材都是凱哥學堂VIP學員所寫,學員有權匿名,對文章有最終解釋權;凱哥學堂旨在促進VIP學員互相學習的基礎上公開筆記。 三層架構模式介紹 三層架構模式: 三層架構(3-tier architecture) 通常意義上的三層架構就是將整個業務應用劃分為

    利用jdbc操作資料庫——prepareStatement和Statement的比較以及利用batch模式提高效率的心得

    1.prepareStatement   vs  statement (1)prepareStatement預編譯SQL語句,批處理效率高 什麼是預編譯,好處?(參考https://blog.csdn.net/Marvel__Dead/article/details/69

    軟件架構和MVC模式的區別

    tro 不能 服務器端 輸出 com 業務層 架構 直接 事務 剛開始學習MVC模式的時候,很容易將兩個混為一談,覺得兩者一個是中文描述,一個是英文描述(哈哈,很奇怪當時的想法),當深入了解後,發現根本不是一回事啊,遂將兩者做一下總結: 1. 從概念上來說:   

    簡述MVC模式和Java Web 的架構

    MVC   它不是java獨有,所有的B/S結構的專案都在使用它!  M -- model 模型(自己寫程式碼)  V -- View  檢視(jsp)  C -- Cotroller 控制器(Servlet) =============

    javaweb:常用的web設計模式(Model1,Model2,javaweb架構和mvc)和結構案例展示

    Jsp模式介紹: SUN公司推出JSP技術後,同時也推薦了兩種web應用程式的開發模式,一種是JSP+JavaBean模式,一種是Servlet+JSP+JavaBean模式。 JSP+JavaBean模式適合開發業務邏輯不太複雜的web應用程式,這種模式下,JavaBean用於封裝業務

    Java——Web開發之開源框架DBUtils的使用,JSP開發模式架構與MVC設計模式的認識

    DBUtils的使用: 在使用開源框架DBUtils時,它只是幫我們簡化了CRUD的程式碼,但是它不負責連線的建立以及獲取工作。 1.和使用開源框架都一樣的一個步驟,先匯入jar檔案 2.在這裡採用的是開源資料庫連線池C3P0進行連線 3.編寫CRUD程式碼 使用其功

    基於架構下的公共資料訪問方法(Sqlite資料庫

    作者總結了一下,使用Winform的三層架構做窗體應用程式,在資料訪問方面,有用到純sql語句方法、引數方法、儲存過程方法。 那麼什麼是三層架構呢? UI---存放Form窗體---(使用者所關心的) 業務邏輯層----存放業務傳遞(BLL) 資料訪問層----底層的資料處理方法(DAL) 資料公共

    淺談Javaweb經典架構和MVC框架模式

    淺談javaweb三大框架和MVC設計模式 小序:博主以前在學javaweb的時候開始總不理解javaweb三大框架和MVC框架模式,雖然沒有把兩者混為一談,但是也是很暈菜。作為一個Java開發程式設計師的話,特別是B/S架構的開發來說,MVC框架模式是我們必須要掌握的!!

    經典架構以及分層的原則

    Controller:控制層  ——》接收使用者請求。並相應使用者的請求。同時會根據使用者的請求呼叫對應的service完成我們專案中的功能。 注意他不會直接與業務和資料庫相關聯  Service:業務邏輯層——》完成專案中的功能(專案中某個功能的業務和邏輯),它會呼

    【設計模式】MVC模式架構關係

    前言 對於許多新手都不明白MVC模式和三層架構的關係,本人也是,特地整合了網上的一些文章對MVC模式和三層架構的關係進行介紹,希望對大家有幫助。 關於三層架構 在軟體體系架構設計中,分層式結構是最常見,也是最重要的一種結構。微軟推薦的分層式結構一般分為三層,從下

    關於【架構】的理解以及詳細分析

    三層架構已經學了一段時間,一直想做一個比較完整、比較完美的總結。但是左思右想,不知道如何下筆。都說萬事開頭難嘛,今天整理了一下凌亂的思路,哎,還是沒整理好,想到哪就說到哪吧。 初學者很不理解: 1,什麼是三層? 2,為什麼使用三層? 3,三層與以往使用的兩層相比有

    架構與mvc模式

    什麼是三層架構? 三層架構由使用者介面層/表示層(User Interface),業務邏輯層(Business Logic Layer)和資料訪問層(Data Acess Layer)構成。 其中每一層的作用為: 使用者介面層:負責與使用者進行互動。 業務邏輯層:主要

    架構架構)、框架(MVC)、設計模式三者異同點

    前言: 本部落格主要針對架構、框架和設計模式三者的區別、還有三層和MVC的區別進行討論、對於這三者一點都不瞭解的、請點在維基和百度百科上補補課、這裡就不發連結了 軟體架構(software arch

    JAVAEE架構與webMVC模式

    1.JAVAEE三層架構web層:頁面層service層:業務層dao層:資料訪問層說明:對於上面的三層架構只有JAVAEE擁有。是針對javaee開發中使用的一種規範2.webMVC模式model:模

    什麼是MVC模式?MVC架構的含義和作用?

    MVC是一種框架型模式,它本身並不引入新的功能,只是用來指導我們改善應用程式的架構,使應用的模型和檢視相分離,從而得到更好的開發和維護效率。 在MVC模式中,應用程式被劃分成模式、檢視和控制器三個部分。其中模型部分又包含了業務處理層和資料持久層(資料業務)。

    用java觀察者模式解耦經典架構

    三層架構是一個非常經典的架構模式,根據系統的職責不同,將系統分成了表現層,邏輯層和資料訪問層,並且配合資料實體進行資料傳輸,可以大大的封裝性和複用性。 經典的三層架構圖: 我們再深入到架構圖內部,看看具體的類圖,用簡單的登陸舉例吧: 這裡通過LoginUI,呼叫了Log

    ASP.NET MVC架構基礎詳細操作圖文教程(VS2017)(2)

    沒錯,Userinformation_BLL.cs類就是邏輯類。我們先把DAL層的方法都COPY過來,因為他們是要是BLL層裡實現的,當然我是倒著講的,所以現在我們倒著在實現,嘿嘿。按理來說,我們應該先UI,再BLL,最後再DAL。為了方便大家深入了理解,所以我就反著來了。COPY過來後,我們刪掉方法內的內容