חבר את Java למסד נתונים של MySQL

ג'אווה טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

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

ישנן דרכים רבות בהן אנו יכולים להתחבר למסד נתונים של MySQL מ- Java ובמדריך זה, אנו נבדוק מספר אפשרויות כדי לראות כיצד להשיג זאת.

נתחיל בבחינת האפשרויות הפופולריות ביותר באמצעות JDBC ו- Hibernate.

לאחר מכן נבחן גם כמה ספריות חיצוניות, כולל MyBatis, Apache Cayenne ו- Spring Data. בהמשך הדרך נספק מספר דוגמאות מעשיות.

2. תנאים מוקדמים

אנו נניח שכבר מותקן ושרת MySQL הפועל ב- localhost (יציאת ברירת מחדל 3306) ושיש לנו סכימת בדיקה עם טבלת האדם הבאה:

צור אדם שולחן (ID INT, FIRST_NAME VARCHAR (100), LAST_NAME VARCHAR (100));

נצטרך גם את mysql-connector-java חפץ אשר זמין כתמיד ממייבען סנטרל:

 mysql mysql-connector-java 8.0.19 

3.חיבור באמצעות JDBC

JDBC (Java Database Connectivity) הוא ממשק API לחיבור וביצוע שאילתות במסד נתונים.

3.1. נכסים משותפים

במהלך מאמר זה נשתמש בדרך כלל בכמה מאפייני JDBC נפוצים:

  • כתובת URL לחיבור - מחרוזת שבה מנהל ההתקן JDBC משתמש כדי להתחבר למסד נתונים. הוא יכול להכיל מידע כגון היכן לחפש את מסד הנתונים, שם מסד הנתונים אליו יש להתחבר ומאפייני תצורה אחרים:
    jdbc: mysql: // [host] [, failoverhost ...] [: port] / [database] [? propertyName1] [= propertyValue1] [& propertyName2] [= propertyValue2] ...

    נגדיר נכס זה כך: jdbc: mysql: // localhost: 3306 / test? serverTimezone = UTC

  • מחלקת נהגים - שם הכיתה המוסמך במלואו של הנהג לשימוש. במקרה שלנו, נשתמש במנהל ההתקן של MySQL: com.mysql.cj.jdbc.Driver
  • שם משתמש וסיסמה - אישורי חשבון MySQL

3.2. דוגמא לחיבור JDBC

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

מחרוזת sqlSelectAllPersons = "בחר * מאדם"; מחרוזת connectionUrl = "jdbc: mysql: // localhost: 3306 / test? ServerTimezone = UTC"; נסה (Connection connect = DriverManager.getConnection (connectionUrl, "שם משתמש", "סיסמה"); PreparedStatement ps = conn.prepareStatement (sqlSelectAllPersons); ResultSet rs = ps.executeQuery ()) {בעוד (rs.next ()) {long id = rs.getLong ("ID"); שם מחרוזת = rs.getString ("FIRST_NAME"); מחרוזת lastName = rs.getString ("LAST_NAME"); // לעשות משהו עם הנתונים שחולצו ...}} לתפוס (SQLException e) {// לטפל בחריג}

כפי שאנו יכולים לראות, בתוך לְנַסוֹת גוף, אנו חוזרים דרך מערך התוצאות ומוציאים את הערכים מטבלת האדם.

4.חיבור באמצעות ORM

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

4.1. ממשקי API של Hibernate Native

בחלק זה נראה כיצד להשתמש ב- Hibernate לניהול חיבור JDBC למסד הנתונים שלנו.

ראשית, עלינו להוסיף את ליבת שינה תלות במייבון:

 org.hibernate hibernate-core 5.4.10.Final 

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

@Entity @Table (name = "Person") אדם בכיתה ציבורית {@ Id ארוך מזהה; @Column (name = "FIRST_NAME") שם מחרוזת; @Column (name = "LAST_NAME") שם משפחה מחרוזת; // גטרים וקובעים} 

היבט חיוני נוסף הוא יצירת קובץ המשאבים במצב שינה hibernate.cfg.xml, שם נגדיר את פרטי התצורה:

     com.mysql.cj.jdbc.Driver jdbc: mysql: // localhost: 3306 / test? serverTimezone = סיסמת שם משתמש UTC org.hibernate.dialect.MySQL5Dialect אימות 

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

מאפיין זה משמש את המסגרת להמרה נכונה של משפטים Hibernate Query Language (HQL) ל- SQL המתאים למסד הנתונים הנתון שלנו. ספינות שינה עם יותר מ -40 ניבים של SQL. כאשר אנו מתמקדים ב- MySQL במאמר זה, אנו נישאר עם ה- MySQL5Dialect נִיב.

לבסוף, מצב שינה צריך גם לדעת את השם המלא של מחלקת הישות באמצעות תג המיפוי. לאחר השלמת התצורה, נשתמש ב- SessionFactory class, שהוא הכיתה האחראית על יצירת ואיחוד חיבורי JDBC.

בדרך כלל, זה צריך להיות מוגדר פעם אחת בלבד עבור יישום:

SessionFactory sessionFactory; // מגדיר הגדרות מ- hibernate.cfg.xml StandardServiceRegistry registry = חדש StandardServiceRegistryBuilder (). configure (). build (); נסה את {sessionFactory = MetadataSources חדש (הרישום) .buildMetadata (). buildSessionFactory (); } לתפוס (חריג e) {// לטפל בחריג}

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

מושב מושב = sessionFactory.openSession (); session.beginTransaction (); תוצאת רשימה = session.createQuery ("מאדם", Person.class) .list (); result.forEach (אדם -> {// לעשות משהו עם מופע של אדם ...}); session.getTransaction (). commit (); session.close ();

4.2. MyBatis

MyBatis הוצגה בשנת 2010 והיא מסגרת מיפוי של SQL עם פשטות כחוזקה. במדריך אחר שוחחנו על איך לשלב את MyBatis עם Spring and Spring Boot. כאן נתמקד כיצד להגדיר את MyBatis ישירות.

כדי להשתמש בו, עלינו להוסיף את ה- mybatis תלות:

 org.mybatis mybatis 3.5.3 

בהנחה שנשתמש שוב ב אדם בכיתה למעלה ללא ביאורים, נוכל להמשיך ליצור a PersonMapper מִמְשָׁק:

ממשק ציבורי PersonMapper {String selectAll = "בחר * מאדם"; @Select (selectAll) @Results (value = {@Result (property = "id", column = "ID"), @Result (property = "firstName", column = "FIRST_NAME"), @Result (property = "lastName ", column =" LAST_NAME ")}) בחר selectAll (); }

השלב הבא הוא על כל תצורת MyBatis:

תצורת initMybatis () זורקת SQLException {DataSource dataSource = getDataSource (); TransactionFactory trxFactory = חדש JdbcTransactionFactory (); סביבת env = סביבה חדשה ("dev", trxFactory, dataSource); תצורת תצורה = תצורה חדשה (env); כינויים TypeAliasRegistry = config.getTypeAliasRegistry (); aliases.registerAlias ​​("אדם", Person.class); config.addMapper (PersonMapper.class); הגדרת תצורה; } DataSource getDataSource () זורק SQLException {MysqlDataSource dataSource = MysqlDataSource חדש (); dataSource.setDatabaseName ("מבחן"); dataSource.setServerName ("localhost"); dataSource.setPort (3306); dataSource.setUser ("שם משתמש"); dataSource.setPassword ("סיסמה"); dataSource.setServerTimezone ("UTC"); להחזיר dataSource; }

התצורה מורכבת מיצירת a תְצוּרָה אובייקט שהוא מיכל להגדרות כגון סביבה. הוא מכיל גם את הגדרות מקור הנתונים.

נוכל להשתמש ב- תְצוּרָה אובייקט, שבדרך כלל מוגדר פעם אחת ליישום ליצור SqlSessionFactory:

תצורת תצורה = initMybatis (); SqlSessionFactory sqlSessionFactory = חדש SqlSessionFactoryBuilder (). Build (תצורה); נסה (SqlSession session = sqlSessionFactory.openSession ()) {PersonMapper mapper = session.getMapper (PersonMapper.class); רשימת אנשים = mapper.selectAll (); // לעשות משהו עם רשימת אנשים ...}

4.3. אפאצ'י קאיין

אפאצ'י קאיין היא מסגרת התמדה שגרסתה הראשונה מתחילה בשנת 2002. למידע נוסף עליה, אנו ממליצים לקרוא את מבואנו לאפאצ'י קאיין.

כרגיל, בואו נוסיף את שרת קאיין תלות במייבון:

 org.apache.cayenne שרת קאיין 4.0.2 

אנו נתמקד במיוחד בהגדרות החיבור של MySQL. במקרה זה, נגדיר את ה- cayenne-project.xml:

לאחר הדור האוטומטי של datamap.map.xml ו אדם כיתה בצורה של א CayenneDataObject, אנו יכולים לבצע מספר שאילתות.

לדוגמא, נמשיך כבעבר עם בחר כל:

ServerRuntime cayenneRuntime = ServerRuntime.builder () .addConfig ("cayenne-project.xml") .build (); הקשר ObjectContext = cayenneRuntime.newContext (); רשימת אנשים = ObjectSelect.query (Person.class) .select (הקשר); // לעשות משהו עם רשימת אנשים ...

5.חיבור באמצעות נתוני קפיץ

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

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

5.1. נתוני אביב / JPA

Spring Data JPA היא מסגרת חזקה המסייעת בהפחתת קוד boilerplate ומספקת מנגנון ליישום פעולות בסיסיות של CRUD באמצעות אחד ממספר ממשקי מאגר מוגדרים מראש. בנוסף לכך, יש לו תכונות שימושיות רבות אחרות.

הקפד לבדוק את ההקדמה שלנו ל- Spring Data JPA למידע נוסף.

ה spring-data-jpa חפץ ניתן למצוא ב Maven Central:

 org.springframework.data spring-data-jpa 2.2.4.RELEASE 

נמשיך להשתמש ב- אדם מעמד. השלב הבא הוא קביעת תצורה של JPA באמצעות הערות:

@Configuration @EnableJpaRepositories ("packages.to.scan") מחלקה ציבורית JpaConfiguration {@Bean DataSource publicSource () {DriverManagerDataSource dataSource = DriverManagerDataSource חדש (); dataSource.setDriverClassName ("com.mysql.cj.jdbc.Driver"); dataSource.setUrl ("jdbc: mysql: // localhost: 3306 / test? serverTimezone = UTC"); dataSource.setUsername ("שם משתמש"); dataSource.setPassword ("סיסמה"); להחזיר dataSource; } @Bean הציבור JpaTransactionManager transactionManager (EntityManagerFactory emf) {להחזיר JpaTransactionManager חדש (emf); } @Bean הציבור JpaVendorAdapter jpaVendorAdapter () {HibernateJpaVendorAdapter jpaVendorAdapter = חדש HibernateJpaVendorAdapter (); jpaVendorAdapter.setDatabase (Database.MYSQL); jpaVendorAdapter.setGenerateDdl (נכון); החזר jpaVendorAdapter; } @Bean LocalContainerEntityManagerFactory ציבוריות entityManagerFactory () {LocalContainerEntityManagerFactoryBean lemfb = LocalContainerEntityManagerFactoryBean חדש (); lemfb.setDataSource (dataSource ()); lemfb.setJpaVendorAdapter (jpaVendorAdapter ()); lemfb.setPackagesToScan ("packages.containing.entity.classes"); להחזיר lemfb; }}

כדי לאפשר ל- Spring Data ליישם את פעולות ה- CRUD, עלינו ליצור ממשק שמרחיב את ה- מאגר Crud מִמְשָׁק:

ממשק ציבורי @ מאגר @ PersonRepository מרחיב את CrudRepository {}

ולבסוף, בואו נראה דוגמה של בחר הכל עם נתוני אביב:

personRepository.findAll (). forEach (person -> {// לעשות משהו עם האדם שחולץ});

5.2. נתוני אביב / JDBC

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

מסיבה זו, הוא אינו מספק תכונות כמו מטמון, מעקב מלוכלך, טעינה עצלה ותכונות רבות אחרות של JPA.

הפעם התלות ב- Maven שאנחנו צריכים היא spring-data-jdbc:

 org.springframework.data spring-data-jdbc 1.1.4.RELEASE 

התצורה קלה יותר בהשוואה לזו בה השתמשנו בסעיף הקודם עבור Spring Data JPA:

@Configuration @EnableJdbcRepositories ("packages.to.scan") מחלקה ציבורית JdbcConfiguration מרחיב את AbstractJdbcConfiguration {// NamedParameterJdbcOperations משמש באופן פנימי להגשת הצהרות SQL למסד הנתונים @Bean NamedParameterJdbcOperations () {להחזיר NamJam; } @Bean PlatformTransactionManager transactionManager () {להחזיר DataSourceTransactionManager חדש (dataSource ()); } @Bean DataSource ציבורי DataSource () {DriverManagerDataSource dataSource = חדש DriverManagerDataSource (); dataSource.setDriverClassName ("com.mysql.cj.jdbc.Driver"); dataSource.setUrl ("jdbc: mysql: // localhost: 3306 / test? serverTimezone = UTC"); dataSource.setUsername ("שם משתמש"); dataSource.setPassword ("סיסמה"); להחזיר dataSource; }}

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

הסיבה לכך היא ש- Spring Data JDBC תטפל ישירות במיפוי היישות במקום ב- Hibernate:

ייבא org.springframework.data.annotation.Id; יבוא org.springframework.data.relational.core.mapping.Column; יבוא org.springframework.data.relational.core.mapping.Table; @Table (value = "Person") אדם בכיתה ציבורית {@ Id ארוך מזהה; @Column (value = "FIRST_NAME") שם מחרוזת; @Column (value = "LAST_NAME") שם משפחה מחרוזת; // גטרים וקובעים}

עם Spring Data JDBC, אנו יכולים גם להשתמש ב- מאגר Crud מִמְשָׁק. אז ההצהרה תהיה זהה לזו שכתבנו לעיל בדוגמה של Spring Data JPA. כמו כן, הדבר תקף גם לדוגמא בחר הכל.

6. מסקנה

במדריך זה ראינו מספר דרכים שונות להתחבר למסד נתונים MySQL מ- Java. התחלנו בחיבור JDBC החיוני. ואז הסתכלנו על ORM נפוץ כמו Hibernate, Mybatis ו- Apache Cayenne. לבסוף, הסתכלנו על Spring Data JPA ו- Spring Data JDBC.

שימוש ב- API של JDBC או Hibernate פירושו יותר קוד boilerplate. שימוש במסגרות חזקות, כמו Spring Data או Mybatis, דורש תצורה רבה יותר אך נותן יתרון משמעותי מכיוון שהם מספקים יישומי ברירת מחדל ותכונות כמו אחסון במטמון ועומס עצל.

תחתית Java

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס