ฤดูใบไม้ผลิ - ภาพรวมของกรอบ JDBC

ในขณะที่ทำงานกับฐานข้อมูลโดยใช้ JDBC แบบเก่าจะยุ่งยากในการเขียนโค้ดที่ไม่จำเป็นเพื่อจัดการกับข้อยกเว้นการเปิดและปิดการเชื่อมต่อฐานข้อมูล ฯลฯ อย่างไรก็ตาม Spring JDBC Framework จะดูแลรายละเอียดระดับต่ำทั้งหมดโดยเริ่มตั้งแต่การเปิดการเชื่อมต่อเตรียม และดำเนินการคำสั่ง SQL ข้อยกเว้นของกระบวนการจัดการธุรกรรมและปิดการเชื่อมต่อในที่สุด

ดังนั้นสิ่งที่คุณต้องทำก็แค่กำหนดพารามิเตอร์การเชื่อมต่อและระบุคำสั่ง SQL ที่จะดำเนินการและทำงานที่จำเป็นสำหรับการทำซ้ำแต่ละครั้งในขณะที่ดึงข้อมูลจากฐานข้อมูล

Spring JDBC มีหลายแนวทางและคลาสที่แตกต่างกันเพื่อเชื่อมต่อกับฐานข้อมูล ฉันจะใช้แนวทางคลาสสิกและเป็นที่นิยมมากที่สุดซึ่งใช้ประโยชน์จากJdbcTemplateคลาสของกรอบ นี่คือคลาสเฟรมเวิร์กกลางที่จัดการการสื่อสารฐานข้อมูลและการจัดการข้อยกเว้นทั้งหมด

คลาส JdbcTemplate

คลาส JDBC Template เรียกใช้เคียวรี SQL อัพเดตคำสั่งเก็บการเรียกโพรซีเดอร์ดำเนินการซ้ำบน ResultSets และแยกค่าพารามิเตอร์ที่ส่งคืน นอกจากนี้ยังจับข้อยกเว้น JDBC และแปลเป็นลำดับชั้นข้อยกเว้นทั่วไปที่ให้ข้อมูลมากขึ้นซึ่งกำหนดไว้ในแพ็คเกจ org.springframework.dao

อินสแตนซ์ของคลาสJdbcTemplateคือthreadsafeเมื่อกำหนดค่าแล้ว ดังนั้นคุณสามารถกำหนดค่าอินสแตนซ์เดียวของJdbcTemplateจากนั้นฉีดข้อมูลอ้างอิงที่แชร์นี้ลงใน DAO หลายตัวได้อย่างปลอดภัย

แนวทางปฏิบัติทั่วไปเมื่อใช้คลาส JDBC Template คือกำหนดค่าDataSourceในไฟล์คอนฟิกูเรชัน Spring ของคุณจากนั้นใช้การพึ่งพา DataSource bean ที่แบ่งใช้ลงในคลาส DAO ของคุณและ JdbcTemplate จะถูกสร้างขึ้นในตัวตั้งค่าสำหรับ DataSource

การกำหนดค่าแหล่งข้อมูล

ให้เราสร้างตารางฐานข้อมูล Student ในฐานข้อมูลของเรา TEST. เราถือว่าคุณกำลังทำงานกับฐานข้อมูล MySQL หากคุณทำงานกับฐานข้อมูลอื่นคุณสามารถเปลี่ยนการสืบค้น DDL และ SQL ของคุณได้

CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   PRIMARY KEY (ID)
);

ตอนนี้เราจำเป็นต้องจัดหาแหล่งข้อมูลให้กับเทมเพลต JDBC เพื่อให้สามารถกำหนดค่าตัวเองเพื่อเข้าถึงฐานข้อมูลได้ คุณสามารถกำหนดค่า DataSource ในไฟล์ XML ด้วยส่วนของโค้ดดังที่แสดงในข้อมูลโค้ดต่อไปนี้ -

<bean id = "dataSource" 
   class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name = "driverClassName" value = "com.mysql.jdbc.Driver"/>
   <property name = "url" value = "jdbc:mysql://localhost:3306/TEST"/>
   <property name = "username" value = "root"/>
   <property name = "password" value = "password"/>
</bean>

วัตถุการเข้าถึงข้อมูล (DAO)

DAO ย่อมาจาก Data Access Object ซึ่งมักใช้สำหรับการโต้ตอบกับฐานข้อมูล DAO มีอยู่เพื่อให้วิธีการอ่านและเขียนข้อมูลไปยังฐานข้อมูลและควรเปิดเผยฟังก์ชันนี้ผ่านอินเทอร์เฟซที่แอปพลิเคชันที่เหลือจะเข้าถึงได้

การสนับสนุน DAO ใน Spring ทำให้ง่ายต่อการทำงานกับเทคโนโลยีการเข้าถึงข้อมูลเช่น JDBC, Hibernate, JPA หรือ JDO ในลักษณะที่สอดคล้องกัน

การดำเนินการคำสั่ง SQL

ให้เราดูว่าเราสามารถดำเนินการ CRUD (สร้างอ่านอัปเดตและลบ) บนตารางฐานข้อมูลโดยใช้ออบเจ็กต์เทมเพลต SQL และ JDBC ได้อย่างไร

Querying for an integer

String SQL = "select count(*) from Student";
int rowCount = jdbcTemplateObject.queryForInt( SQL );

Querying for a long

String SQL = "select count(*) from Student";
long rowCount = jdbcTemplateObject.queryForLong( SQL );

A simple query using a bind variable

String SQL = "select age from Student where id = ?";
int age = jdbcTemplateObject.queryForInt(SQL, new Object[]{10});

Querying for a String

String SQL = "select name from Student where id = ?";
String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, String.class);

Querying and returning an object

String SQL = "select * from Student where id = ?";
Student student = jdbcTemplateObject.queryForObject(
   SQL, new Object[]{10}, new StudentMapper());

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      
      return student;
   }
}

Querying and returning multiple objects

String SQL = "select * from Student";
List<Student> students = jdbcTemplateObject.query(
   SQL, new StudentMapper());

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      
      return student;
   }
}

Inserting a row into the table

String SQL = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 11} );

Updating a row into the table

String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 10} );

Deleting a row from the table

String SQL = "delete Student where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{20} );

การดำเนินการคำสั่ง DDL

คุณสามารถใช้ไฟล์ execute(..)วิธีการจากjdbcTemplateเพื่อดำเนินการคำสั่ง SQL หรือคำสั่ง DDL ต่อไปนี้เป็นตัวอย่างการใช้คำสั่ง CREATE เพื่อสร้างตาราง -

String SQL = "CREATE TABLE Student( " +
   "ID   INT NOT NULL AUTO_INCREMENT, " +
   "NAME VARCHAR(20) NOT NULL, " +
   "AGE  INT NOT NULL, " +
   "PRIMARY KEY (ID));"

jdbcTemplateObject.execute( SQL );

ตัวอย่าง Spring JDBC Framework

จากแนวคิดข้างต้นให้เราตรวจสอบตัวอย่างที่สำคัญบางส่วนซึ่งจะช่วยคุณในการทำความเข้าใจการใช้งานกรอบงาน JDBC ในฤดูใบไม้ผลิ -

ซีเนียร์ ตัวอย่างและคำอธิบาย
1 ตัวอย่าง Spring JDBC

ตัวอย่างนี้จะอธิบายวิธีการเขียนแอปพลิเคชัน Spring ที่ใช้ JDBC อย่างง่าย

2 SQL Stored Procedure ในฤดูใบไม้ผลิ

เรียนรู้วิธีการเรียกใช้กระบวนงานที่จัดเก็บ SQL ขณะใช้ JDBC ใน Spring