אביב JDBC

1. סקירה כללית

במאמר זה נעבור על מקרי שימוש מעשיים של מודול האביב JDBC.

כל השיעורים באביב JDBC מחולקים לארבע חבילות נפרדות:

  • הליבה - פונקציונליות הליבה של JDBC. חלק מהשיעורים החשובים תחת חבילה זו כוללים JdbcTemplate, SimpleJdbcInsert,SimpleJdbcCall ו NamedParameterJdbcTemplate.
  • מקור מידע - שיעורי שירות לגישה למקור נתונים. יש לו גם יישומי מקורות נתונים שונים לבדיקת קוד JDBC מחוץ למכולה EE של ג'קרטה.
  • לְהִתְנַגֵד - גישה ל- DB באופן מונחה עצמים. זה מאפשר לבצע שאילתות ולהחזיר את התוצאות כאובייקט עסקי. הוא ממפה גם את תוצאות השאילתה בין העמודות והמאפיינים של אובייקטים עסקיים.
  • תמיכה - שיעורי תמיכה לשיעורים מתחת הליבה ו לְהִתְנַגֵד חבילות. לְמָשָׁל. מספק את SQLException פונקציונליות תרגום.

2. תצורה

ראשית, נתחיל בתצורה פשוטה כלשהי של מקור הנתונים (נשתמש במסד נתונים של MySQL לדוגמא זו):

@Configuration @ComponentScan ("com.baeldung.jdbc") מחלקה ציבורית SpringJdbcConfig {@Bean DataSource הציבור mysqlDataSource () {DriverManagerDataSource dataSource = DriverManagerDataSource חדש (); dataSource.setDriverClassName ("com.mysql.jdbc.Driver"); dataSource.setUrl ("jdbc: mysql: // localhost: 3306 / springjdbc"); dataSource.setUsername ("אורח_משתמש"); dataSource.setPassword ("סיסמת אורח"); להחזיר dataSource; }}

לחלופין, אנו יכולים גם לעשות שימוש טוב במסד נתונים משובץ לפיתוח או בדיקה - הנה תצורה מהירה היוצרת מופע של מסד נתונים משובץ H2 ומאכלסת אותו מראש בסקריפטים פשוטים של SQL:

@Bean DataSource ציבורי DataSource () {להחזיר EmbeddedDatabaseBuilder חדש () .setType (EmbeddedDatabaseType.H2) .addScript ("classpath: jdbc / schema.sql") .addScript ("classpath: jdbc / test-data.sql"). (); } 

לבסוף - ניתן לעשות זאת, כמובן, באמצעות הגדרת XML עבור ה- מקור מידע:

3. ה JdbcTemplate ורישום שאילתות

3.1. שאילתות בסיסיות

תבנית JDBC היא ה- API הראשי דרכו ניגש לרוב הפונקציונליות בה אנו מעוניינים:

  • יצירת וסגירת קשרים
  • ביצוע הצהרות ושיחות נוהל מאוחסנות
  • איטרציה מעל ResultSet והחזרת תוצאות

ראשית, נתחיל בדוגמה פשוטה לראות מה JdbcTemplate יכול לעשות:

int result = jdbcTemplate.queryForObject ("בחר ספירה (*) מהעובד", Integer.class); 

וגם הנה הוספה פשוטה:

public int addEmplyee (int id) {return jdbcTemplate.update ("הכנס לערכי המועסקים (?,?,?,?)", מזהה, "ביל", "גייטס", "ארה"ב"); }

שימו לב לתחביר הסטנדרטי של מתן פרמטרים - באמצעות התו `?". לאחר מכן - בואו נסתכל על אלטרנטיבה לתחביר זה.

3.2. שאילתות עם פרמטרים עם שם

להשיג תמיכה בפרמטרים שמונשתמש בתבנית JDBC האחרת המסופקת על ידי המסגרת - NamedParameterJdbcTemplate.

בנוסף, זה עוטף את JbdcTemplate ומספק אלטרנטיבה לתחביר המסורתי באמצעות "?”כדי לציין פרמטרים. מתחת למכסה המנוע, הוא מחליף את הפרמטרים שצוינו ל- JDBC "?" מציין מקום ונציגים לעטופים JDCTemplate לביצוע השאילתות:

SqlParameterSource namedParameters = MapSqlParameterSource חדש (). AddValue ("id", 1); להחזיר בשםParameterJdbcTemplate.queryForObject ("בחר FIRST_NAME FROM EMPLOYEE WHERE ID =: id", namedParameters, String.class);

שימו לב כיצד אנו משתמשים ב- MapSqlParameterSource כדי לספק את הערכים עבור הפרמטרים שצוינו.

לדוגמא, בואו נסתכל על הדוגמה שלהלן המשתמשת במאפיינים מהשעועית לקביעת הפרמטרים שצוינו:

עובד שכיר = עובד חדש (); employee.setFirstName ("ג'יימס"); מחרוזת SELECT_BY_ID = "בחר מספר (*) מהעובד איפה FIRST_NAME =: שם פרטי"; SqlParameterSource namedParameters = BeanPropertySqlParameterSource חדש (עובד); החזר בשםParameterJdbcTemplate.queryForObject (SELECT_BY_ID, namedParameters, Integer.class);

שים לב כיצד אנו משתמשים כעת ב- BeanPropertySqlParameterSource יישומים במקום לציין את הפרמטרים שצוינו באופן ידני כמו בעבר.

3.3. מיפוי תוצאות שאילתות לאובייקט Java

תכונה שימושית נוספת מאוד היא היכולת למפות תוצאות שאילתות לאובייקטים של Java - על ידי יישום ה- RowMapper מִמְשָׁק.

לדוגמא - עבור כל שורה המוחזרת על ידי השאילתה, Spring משתמשת במפת השורות לאכלוס שעועית הג'אווה:

מחלקה ציבורית EmployeeRowMapper מיישמת את RowMapper {@Override ציבור העובדים mapRow (ResultSet rs, int rowNum) זורק SQLException {עובד שכיר = עובד חדש (); employee.setId (rs.getInt ("מזהה")); employee.setFirstName (rs.getString ("FIRST_NAME")); employee.setLastName (rs.getString ("LAST_NAME")); employee.setAddress (rs.getString ("ADDRESS")); עובד חוזר; }}

לאחר מכן, כעת נוכל להעביר את מיפוי השורות ל- API השאילתה ולקבל אובייקטים של Java מאוכלסים במלואם:

שאילתת מחרוזת = "בחר * מהעובד איפה מזהה =?"; עובד עובד = jdbcTemplate.queryForObject (שאילתה, אובייקט חדש [] {id}, EmployeeRowMapper חדש ());

4. תרגום חריג

אביב מגיע עם היררכיית חריגות נתונים משלו מחוץ לקופסה - עם DataAccessException כחריג השורש - והוא מתרגם את כל החריגים הגולמיים הבסיסיים אליו.

וכך אנו שומרים על שפיותנו בכך שאיננו צריכים להתמודד עם חריגים בהתמדה ברמה נמוכה ונהנים מהעובדה שאביב עוטף את החריגים ברמה הנמוכה DataAccessException או אחת מתתי הכיתות שלה.

כמו כן, הדבר שומר על מנגנון הטיפול בחריגים ללא קשר למסד הנתונים הבסיסי בו אנו משתמשים.

חוץ מזה, ברירת המחדל SQLErrorCodeSQLExceptionTranslator, אנו יכולים גם לספק את היישום שלנו SQLExceptionTranslator.

הנה דוגמה מהירה ליישום מותאם אישית, התאמה אישית של הודעת השגיאה כאשר קיימת הפרת מפתח כפולה, מה שמביא לקוד שגיאה 23505 בעת שימוש ב- H2:

מחלקה ציבורית CustomSQLErrorCodeTranslator מרחיב SQLErrorCodeSQLExceptionTranslator {@Override מוגן DataAccessException customTranslate (מחרוזת משימה, מחרוזת sql, SQLException sqlException) {if (sqlException.getErrorCode () == 23505 קיבולת (Exception). Exception = "Exception. ); } להחזיר אפס; }}

כדי להשתמש במתרגם חריג מותאם אישית זה, עלינו להעביר אותו ל- JdbcTemplate על ידי התקשרות setExceptionTranslator () שיטה:

CustomSQLErrorCodeTranslator customSQLErrorCodeTranslator = חדש CustomSQLErrorCodeTranslator (); jdbcTemplate.setExceptionTranslator (customSQLErrorCodeTranslator);

5. פעולות JDBC באמצעות שיעורי SimpleJdbc

SimpleJdbc מחלקות מספקות דרך קלה להגדרה ולביצוע הצהרות SQL. שיעורים אלה משתמשים במטא נתונים של מסד נתונים כדי לבנות שאילתות בסיסיות. SimpleJdbcInsert ו SimpleJdbcCall שיעורים מספקים דרך קלה יותר לביצוע שיחות הוספה ואחסון מאוחסנות.

5.1. SimpleJdbcInsert

בואו נסתכל על ביצוע הצהרות הכנסה פשוטות עם תצורה מינימלית.

משפט INSERT נוצר על סמך התצורה של SimpleJdbcInsert וכל מה שאנחנו צריכים זה לספק את שם הטבלה, שמות העמודות והערכים.

ראשית, בואו ניצור a SimpleJdbcInsert:

SimpleJdbcInsert simpleJdbcInsert = חדש SimpleJdbcInsert (dataSource) .withTableName ("EMPLOYEE");

לאחר מכן, בואו נספק את שמות העמודים והערכים ונבצע את הפעולה:

public int addEmplyee (עובד עובדים) {פרמטרים של מפה = HashMap חדש (); parameters.put ("ID", emp.getId ()); parameters.put ("FIRST_NAME", emp.getFirstName ()); parameters.put ("LAST_NAME", emp.getLastName ()); parameters.put ("ADDRESS", emp.getAddress ()); להחזיר simpleJdbcInsert.execute (פרמטרים); }

יתר על כן, כדי לאפשר את מסד נתונים ליצירת המפתח הראשי, אנחנו יכולים לעשות שימוש ב- executeAndReturnKey () API; נצטרך גם להגדיר את העמודה בפועל שנוצרת אוטומטית:

SimpleJdbcInsert simpleJdbcInsert = חדש SimpleJdbcInsert (dataSource) .withTableName ("EMPLOYEE") .usingGeneratedKeyColumns ("ID"); מספר id = simpleJdbcInsert.executeAndReturnKey (פרמטרים); System.out.println ("נוצר מזהה -" + id.longValue ());

לבסוף - אנו יכולים גם להעביר נתונים אלה באמצעות ה- BeanPropertySqlParameterSource ו MapSqlParameterSource.

5.2. נהלים מאוחסנים עם SimpleJdbcCall

בנוסף, בואו נסתכל על ביצוע נהלים מאוחסנים - נשתמש ב- SimpleJdbcCall הַפשָׁטָה:

SimpleJdbcCall simpleJdbcCall = חדש SimpleJdbcCall (dataSource) .withProcedureName ("READ_EMPLOYEE"); 
עובד ציבורי getEmployeeUsingSimpleJdbcCall (int id) {SqlParameterSource in = MapSqlParameterSource חדש (). addValue ("in_id", id); מפה החוצה = simpleJdbcCall.execute (in); עובד עובד = עובד חדש (); emp.setFirstName ((מחרוזת) out.get ("FIRST_NAME")); emp.setLastName ((String) out.get ("LAST_NAME")); חזרת אמפ; }

6. פעולות אצווה

מקרה שימוש פשוט נוסף - אצוות פעולות מרובות יחד.

6.1. פעולות אצווה בסיסיות באמצעות JdbcTemplate

באמצעות JdbcTemplate, פעולות אצווה ניתן לבצע באמצעות batchUpdate () ממשק API.

החלק המעניין כאן הוא התמציתי אך שימושי ביותר BatchPreparedStatementSetter יישום:

public int [] batchUpdateUsingJdbcTemplate (רשימת עובדים) {return jdbcTemplate.batchUpdate ("הכנס לערכי העובד (?,?,?,?)", חדש BatchPreparedStatementSetter () {@Override ציבורי בטל ריבועי חלל (PreparedStatment) {ps.setInt (1, workers.get (i) .getId ()); ps.setString (2, workers.get (i) .getFirstName ()); ps.setString (3, workers.get (i). getLastName ()); ps.setString (4, workers.get (i) .getAddress ();} @Override public int getBatchSize () {return 50;}});}

6.2. פעולות אצווה באמצעות NamedParameterJdbcTemplate

יש לנו גם אפשרות לבצע פעולות אצווה עם ה- NamedParameterJdbcTemplatebatchUpdate () ממשק API.

ממשק API זה פשוט יותר מהקודם - אין צורך ליישם ממשקים נוספים להגדרת הפרמטרים, מכיוון שיש לו מגדיר הצהרה מוכן פנימי להגדרת ערכי הפרמטרים.

במקום זאת, ניתן להעביר את ערכי הפרמטרים אל ה- batchUpdate () שיטה כמערך של SqlParameterSource.

SqlParameterSource [] אצווה = SqlParameterSourceUtils.createBatch (workers.toArray ()); int [] updateCounts = namedParameterJdbcTemplate.batchUpdate ("הכנס לערכי העובד (: id,: firstname,: lastName,: address)", אצווה); להחזיר updateCounts;

7. אביב JDBC עם מגף קפיץ

Spring Boot מספק פתיחה אביב-אתחול-המתנע-jdbc לשימוש ב- JDBC עם מסדי נתונים יחסיים.

כמו בכל המתנע של Spring Boot, גם זה עוזר לנו להפעיל את היישום שלנו במהירות.

7.1. תלות של Maven

אנחנו נצטרך את אביב-אתחול-המתנע-jdbc תלות כראשונית וכן תלות במסד הנתונים בו נשתמש. במקרה שלנו זה MySQL:

 org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java runtime 

7.2. תְצוּרָה

Spring Boot מגדיר עבורנו את מקור הנתונים באופן אוטומטי. אנחנו רק צריכים לספק את המאפיינים ב- נכסים קוֹבֶץ:

spring.datasource.url = jdbc: mysql: // localhost: 3306 / springjdbc spring.datasource.username = guest_user spring.datasource.password = guest_password

זהו זה, רק על ידי ביצוע תצורות אלה בלבד, היישום שלנו פועל ואנחנו יכולים להשתמש בו לפעולות אחרות של מסדי נתונים.

התצורה המפורשת שראינו בפרק הקודם ליישום Spring סטנדרטי כלולה כעת כחלק מהתצורה האוטומטית של Spring Boot.

8. מסקנה

במאמר זה, בחנו את ההפשטה של ​​JDBC במסגרת האביב, וכיסינו את היכולות השונות שמספק Spring JDBC עם דוגמאות מעשיות.

כמו כן, בדקנו כיצד נוכל להתחיל במהירות עם Spring JDBC באמצעות מתנע JDBC של Spring Boot.

קוד המקור של הדוגמאות זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found