ฤดูใบไม้ผลิ - ภาพรวมของกรอบ 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 |