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過來後,我們刪掉方法內的內容