จุดประสงค์ของการสอนนี้คือการใช้เลเยอร์แยกต่างหากที่เขียนใน Java เพื่อเข้าถึงตารางในฐานข้อมูล เลเยอร์นี้มักจะเรียกว่าเลเยอร์การเข้าถึงข้อมูล (DAL)
ประโยชน์ที่ใหญ่ที่สุดของการใช้ DAL คือการทำให้การทำงานของฐานข้อมูลง่ายขึ้นโดยใช้วิธีการบางอย่างเช่น insert () และค้นหา () แทนที่จะทำลิงค์ก่อนแล้วจึงดำเนินการค้นหาบางอย่าง
เลเยอร์นี้จัดการการโทรและการสืบค้นที่เกี่ยวข้องกับฐานข้อมูลทั้งหมด
สร้างฐานข้อมูล
เราต้องการสร้างตารางง่ายๆสำหรับผู้ใช้เราสามารถใช้ฟิลด์เหล่านี้เพื่อสร้าง
id int
ชื่อ Varchar (200)
รหัสผ่าน Varchar (200)
อายุ int
วัตถุการถ่ายโอนข้อมูล
เลเยอร์นี้ควรมีคลาสง่าย ๆ ที่เรียกว่าวัตถุการถ่ายโอนข้อมูล (DTO) คลาสนี้เป็นเพียงแผนที่ง่าย ๆ ที่สอดคล้องกับตารางในฐานข้อมูลและแต่ละคอลัมน์ในตารางสอดคล้องกับตัวแปรสมาชิกของคลาส
เป้าหมายของเราคือการใช้วัตถุ Java อย่างง่ายแทนที่จะประมวลผลคำสั่ง SQL และคำสั่งที่เกี่ยวข้องกับฐานข้อมูลอื่น ๆ เพื่อเพิ่มลบแก้ไขและตรวจสอบฐานข้อมูล
หากเราต้องการแมปตารางลงในรหัส Java เราเพียงแค่ต้องสร้างคลาส (ถั่ว) ที่มีฟิลด์เดียวกัน
เพื่อให้ดีขึ้นนอกเหนือจากตัวสร้างเราควรประกาศตัวแปรฟิลด์ทั้งหมดเป็นส่วนตัวให้สร้าง accessors (getters และ setters) ซึ่งหนึ่งในนั้นคือตัวสร้างเริ่มต้น
ผู้ใช้ระดับสาธารณะ {ID จำนวนเต็มส่วนตัว; ชื่อสตริงส่วนตัว; พาสสตริงส่วนตัว; อายุจำนวนเต็มส่วนตัว;}ในการแมปฟิลด์อย่างถูกต้องเราควรพิจารณาค่า NULL ในฐานข้อมูล สำหรับค่าเริ่มต้นดั้งเดิมของ Java เช่นประเภท int ค่าเริ่มต้นของมันคือ 0 ดังนั้นเราควรจัดเตรียมประเภทข้อมูลใหม่ที่สามารถรองรับค่า NULL ได้ เราสามารถแทนที่ Int โดยใช้คลาสพิเศษ - การห่อหุ้มเช่นจำนวนเต็ม
ในที่สุดชั้นเรียนของเราควรมีลักษณะเช่นนี้:
ผู้ใช้ระดับสาธารณะ {ID จำนวนเต็มส่วนตัว; ชื่อสตริงส่วนตัว; พาสสตริงส่วนตัว; อายุจำนวนเต็มส่วนตัว ผู้ใช้สาธารณะ () {} ผู้ใช้สาธารณะ (ชื่อสตริง, พาสสตริง, อายุจำนวนเต็ม) {this.name = name; this.pass = pass; this.age = อายุ; } ผู้ใช้สาธารณะ (ID จำนวนเต็ม, ชื่อสตริง, สตริงพาส, อายุจำนวนเต็ม) {this.id = id; this.name = ชื่อ; this.pass = pass; this.age = อายุ; } Public Integer Getage () {return Age; } การตั้งค่าโมฆะสาธารณะ (อายุจำนวนเต็ม) {this.age = อายุ; } จำนวนเต็มสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (ID จำนวนเต็ม) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } สตริงสาธารณะ getPass () {ส่งคืนผ่าน; } โมฆะสาธารณะ setpass (พาสสตริง) {this.pass = pass; -แนวทางปฏิบัติที่ดีคือการจัดหาตัวสร้างว่างเปล่าเริ่มต้นตัวสร้างที่สมบูรณ์และตัวสร้างที่สมบูรณ์โดยไม่มีพารามิเตอร์ ID
เชื่อมต่อกับฐานข้อมูล
เราสามารถใช้คลาสระดับกลางเพื่ออำนวยความสะดวกในการเชื่อมต่อกับฐานข้อมูล ในคลาสนี้เราจะจัดเตรียมพารามิเตอร์การเชื่อมต่อฐานข้อมูลเช่นฐานข้อมูล JDBC, URL, ชื่อผู้ใช้และรหัสผ่านและกำหนดตัวแปรเหล่านี้เป็นขั้นสุดท้าย (จะดีกว่าที่จะได้รับข้อมูลนี้จากคุณสมบัติหรือไฟล์การกำหนดค่า XML)
จัดเตรียมวิธีการส่งคืนวัตถุการเชื่อมต่อหรือส่งคืนค่าว่างเมื่อการเชื่อมต่อล้มเหลวหรือโยนข้อยกเว้นรันไทม์
public Static Final String URL = "JDBC: MySQL: // localHost: 3306/testDB"; สตริงสุดท้ายคงที่สาธารณะ = "testUser"; สตริงสุดท้ายคงที่สาธารณะผ่าน = "testPass";/*** รับวัตถุการเชื่อมต่อ* @@return object*/การเชื่อมต่อแบบคงที่สาธารณะ Return DriverManager.getConnection (URL, ผู้ใช้, ผ่าน); } catch (sqlexception ex) {โยน runtimeException ใหม่ ("ข้อผิดพลาดการเชื่อมต่อกับฐานข้อมูล", ex); -นอกจากนี้เรายังสามารถรวมวิธีการหลักในชั้นเรียนเพื่อทดสอบการเชื่อมต่อ ชั้นเรียนที่สมบูรณ์มีลักษณะเช่นนี้:
นำเข้า com.mysql.jdbc.driver; นำเข้า java.sql.connection; นำเข้า java.sql.drivermanager; นำเข้า java.sql.sqlexception;/** * เชื่อมต่อกับฐานข้อมูล * @author hany.sad */การเชื่อมต่อระดับสาธารณะ "JDBC: MySQL: // localhost: 3306/testDB"; ผู้ใช้สตริงสุดท้ายคงที่สาธารณะ = "testUser"; สตริงสุดท้ายคงที่สาธารณะผ่าน = "testPass"; / ** * รับการเชื่อมต่อกับฐานข้อมูล * @return Connection Object */ การเชื่อมต่อแบบคงที่สาธารณะ getConnection () {ลอง {driverManager.registerDriver (ไดรเวอร์ใหม่ ()); Return DriverManager.getConnection (URL, ผู้ใช้, ผ่าน); } catch (sqlexception ex) {โยน runtimeException ใหม่ ("ข้อผิดพลาดการเชื่อมต่อกับฐานข้อมูล", ex); }} / ** * ทดสอบการเชื่อมต่อ * / โมฆะคงที่สาธารณะหลัก (สตริง [] args) {การเชื่อมต่อการเชื่อมต่อ = connectionFactory.getConnection (); -วัตถุการเข้าถึงข้อมูล
ชั้น Dao สามารถดำเนินการ CRUD ได้ มันสามารถเพิ่มลบแก้ไขและตรวจสอบตารางของเรา
อินเทอร์เฟซเลเยอร์ Dao ของเราควรมีลักษณะเช่นนี้:
อินเทอร์เฟซสาธารณะ userdao {ผู้ใช้ getUser (); ตั้งค่า <user> getAllusers (); ผู้ใช้ GetUserByUserNameAnDPassword (); บูลีนแทรก (); บูลีนอัพเดท (); บูลีน deleteuser ();}ค้นหาผู้ใช้
ผู้ใช้สามารถสอบถามผ่านฟิลด์ที่ไม่ซ้ำกันเช่น ID ชื่อหรืออีเมล ในตัวอย่างนี้เราใช้ ID เพื่อค้นหาผู้ใช้ ขั้นตอนแรกคือการสร้างการเชื่อมต่อผ่านคลาส Connector จากนั้นเรียกใช้คำสั่ง SELECT เพื่อให้ผู้ใช้มี ID 7 เราสามารถใช้คำสั่งนี้เพื่อสอบถามผู้ใช้:
เลือก * จากผู้ใช้ที่ id = 7
ที่นี่เราสร้างคำสั่งแบบไดนามิกเพื่อรับ ID จากพารามิเตอร์
โดยการดำเนินการคิวรีนี้จะได้รับชุดผลลัพธ์ซึ่งผู้ใช้หรือ Null จะถูกบันทึกไว้ เราสามารถใช้เมธอดถัดไป () ของผลลัพธ์เพื่อตรวจสอบว่ามีค่าหรือไม่ หาก TRUE ถูกส่งคืนเราจะยังคงใช้ data getters เพื่อรับข้อมูลผู้ใช้จาก ResultSet เมื่อเราห่อหุ้มข้อมูลทั้งหมดลงในผู้ใช้เราจะส่งคืน หากผู้ใช้ที่มี ID นี้ไม่มีอยู่หรือมีข้อยกเว้นอื่น ๆ เกิดขึ้น (เช่นคำสั่ง SQL ที่ไม่ถูกต้อง) วิธีนี้จะส่งคืนค่า NULL
ผู้ใช้สาธารณะ getUser (ID int) {การเชื่อมต่อการเชื่อมต่อ = connectionFactory.getConnection (); ลอง {คำสั่ง stmt = connection.createstatement (); Resultset RS = STMT.ExecuteQuery ("เลือก * จากผู้ใช้ที่ id =" + id); if (rs.next ()) {ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.setId (rs.getInt ("id")); user.setName (rs.getString ("ชื่อ")); user.setPass (rs.getString ("pass")); user.setage (Rs.getInt ("อายุ")); ผู้ใช้ส่งคืน; }} catch (sqlexception ex) {ex.printStackTrace (); } return null;}มันจะสะดวกกว่าในการใช้วิธีการแยกต่างหากเพื่อแยกข้อมูลจากชุดผลลัพธ์เนื่องจากในหลายวิธีเราจะเรียกมันว่า
วิธีใหม่นี้จะโยน sqlexception และเพื่อข้อ จำกัด ควรเป็นส่วนตัว:
ผู้ใช้ส่วนตัว ExtractUserFromResultSet (Resultset RS) พ่น SQLException {ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.setId (rs.getInt ("id")); user.setName (rs.getString ("ชื่อ")); user.setPass (rs.getString ("pass")); user.setage (Rs.getInt ("อายุ")); ส่งคืนผู้ใช้;}วิธีการข้างต้นของเราควรได้รับการแก้ไขเป็นวิธีใหม่:
ผู้ใช้สาธารณะ getUser (ID int) {การเชื่อมต่อการเชื่อมต่อ = connectionFactory.getConnection (); ลอง {คำสั่ง stmt = connection.createstatement (); Resultset RS = STMT.ExecuteQuery ("เลือก * จากผู้ใช้ที่ id =" + id); if (rs.next ()) {return extractuserFromResultset (rs); }} catch (sqlexception ex) {ex.printStackTrace (); } return null;}วิธีการเข้าสู่ระบบ
การดำเนินการเข้าสู่ระบบคล้ายกัน เราต้องการให้รหัสทางเลือกของผู้ใช้และรหัสผ่านซึ่งจะไม่ส่งผลกระทบต่อรายการพารามิเตอร์และคำสั่งค้นหา หากชื่อผู้ใช้และรหัสผ่านถูกต้องวิธีนี้จะส่งคืนผู้ใช้ที่ถูกต้องมิฉะนั้นจะเป็นโมฆะ เนื่องจากมีพารามิเตอร์มากมายการใช้การจัดเตรียมจะมีประโยชน์มากกว่า
ผู้ใช้สาธารณะ GetUserByEnMeAnDpassword (ผู้ใช้สตริง, สตริงผ่าน) {ตัวเชื่อมต่อตัวเชื่อมต่อ = new Connector (); การเชื่อมต่อการเชื่อมต่อ = connector.getConnection (); ลอง {PreparedStatement PS = Connection.prepareStatement ("เลือก * จากผู้ใช้ที่ผู้ใช้ =? และ pass =?"); ps.setstring (1, ผู้ใช้); ps.setstring (2, pass); resultset rs = ps.executeQuery (); if (rs.next ()) {return extractuserFromResultset (rs); }} catch (sqlexception ex) {ex.printStackTrace (); } return null;}วิธีสอบถามผู้ใช้ทั้งหมด
วิธีนี้จะส่งคืนผู้ใช้ทั้งหมดดังนั้นเราควรส่งคืนพวกเขาในคอนเทนเนอร์ที่มีลักษณะคล้ายอาร์เรย์ แต่เพราะเราไม่รู้ว่ามีบันทึกกี่รายการ จะเป็นการดีกว่าที่จะใช้คอลเลกชันเช่นชุดหรือรายการ:
ชุดสาธารณะ getAllusers () {ตัวเชื่อมต่อตัวเชื่อมต่อ = new Connector (); การเชื่อมต่อการเชื่อมต่อ = connector.getConnection (); ลอง {คำสั่ง stmt = connection.createstatement (); Resultset RS = STMT.ExecuteQuery ("เลือก * จากผู้ใช้"); ตั้งค่าผู้ใช้ = new hashset (); ในขณะที่ (rs.next ()) {ผู้ใช้ผู้ใช้ = ExtractUserFromResultSet (RS); users.add (ผู้ใช้); } ผู้ใช้ที่ส่งคืน; } catch (sqlexception ex) {ex.printstacktrace (); } return null;}วิธีแทรก
วิธีการแทรกจะใช้ผู้ใช้เป็นพารามิเตอร์และใช้วัตถุ PreparedStatement เพื่อเรียกใช้คำสั่ง SQL Update วิธีการ ExecuteUpdate ส่งคืนจำนวนแถวที่ได้รับผลกระทบ หากเราเพิ่มบรรทัดเดียวนั่นหมายความว่าวิธีการควรกลับ 1 ถ้าเป็นเช่นนั้นเราจะส่งคืนจริงมิฉะนั้นเราจะกลับเท็จ
Public Boolean Insertuser (ผู้ใช้ผู้ใช้) {Connector Connector = new Connector (); การเชื่อมต่อการเชื่อมต่อ = connector.getConnection (); ลอง {PreparedStatement PS = Connection.prepareStatement ("แทรกลงในค่าผู้ใช้ (null,?,?,?)"); ps.setstring (1, user.getName ()); ps.setstring (2, user.getPass ()); ps.setint (3, user.getage ()); int i = ps.executeUpdate (); if (i == 1) {return true; }} catch (sqlexception ex) {ex.printStackTrace (); } return false;}วิธีการอัปเดต
วิธีการอัปเดตคล้ายกับวิธีการแทรก การเปลี่ยนแปลงเพียงอย่างเดียวคือคำสั่ง SQL
Public Boolean UpdateUser (ผู้ใช้ผู้ใช้) {Connector Connector = New Connector (); การเชื่อมต่อการเชื่อมต่อ = connector.getConnection (); ลอง {PreparedStatement PS = Connection.prepareStatement ("อัปเดตชื่อผู้ใช้ชื่อ =?, pass =?, age =? id =?"); ps.setstring (1, user.getName ()); ps.setstring (2, user.getPass ()); ps.setint (3, user.getage ()); ps.setint (4, user.getId ()); int i = ps.executeUpdate (); if (i == 1) {return true; }} catch (sqlexception ex) {ex.printStackTrace (); } return false;}ลบวิธีการ
วิธีการลบคือการใช้แบบสอบถามง่ายๆเช่น
ลบจากผู้ใช้โดยที่ id = 7
การส่งแบบสอบถามด้วยพารามิเตอร์ ID จะลบระเบียนนี้ หากลบออกสำเร็จ 1 จะถูกส่งคืน
บูลีนสาธารณะ DELETEUSER (ID int) {Connector Connector = new Connector (); การเชื่อมต่อการเชื่อมต่อ = connector.getConnection (); ลอง {คำสั่ง stmt = connection.createstatement (); int i = stmt.executeUpdate ("ลบจากผู้ใช้โดยที่ id =" + id); if (i == 1) {return true; }} catch (sqlexception ex) {ex.printStackTrace (); } return false;}ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!