Sambungkan Java ke Pangkalan Data MySQL

Java Teratas

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS

1. Gambaran keseluruhan

Terdapat banyak cara untuk kita menyambung ke pangkalan data MySQL dari Java dan dalam tutorial ini, kita akan meneroka beberapa pilihan untuk melihat bagaimana mencapainya.

Kita akan mulakan dengan melihat pilihan yang paling popular dengan menggunakan JDBC dan Hibernate.

Kemudian, kita juga akan melihat beberapa perpustakaan luaran termasuk MyBatis, Apache Cayenne dan Spring Data . Sepanjang perjalanan, kami akan memberikan beberapa contoh praktikal.

2. Prasyarat

Kami akan menganggap bahawa kami sudah memasang pelayan MySQL dan berjalan di localhost (port lalai 3306) dan kami mempunyai skema ujian dengan jadual orang berikut:

CREATE TABLE person ( ID INT, FIRST_NAME VARCHAR(100), LAST_NAME VARCHAR(100) );

Kami juga memerlukan artifak mysql-connector-java yang selalu tersedia dari Maven Central:

 mysql mysql-connector-java 8.0.19 

3. Menghubungkan Menggunakan JDBC

JDBC (Java Database Connectivity) adalah API untuk menghubungkan dan melaksanakan pertanyaan pada pangkalan data.

3.1. Sifat Biasa

Sepanjang artikel ini, kami biasanya akan menggunakan beberapa sifat JDBC biasa :

  • URL Sambungan - rentetan yang digunakan pemacu JDBC untuk menyambung ke pangkalan data. Ini boleh mengandungi maklumat seperti tempat mencari pangkalan data, nama pangkalan data untuk disambungkan dan sifat konfigurasi lain:
    jdbc:mysql://[host][,failoverhost...] [:port]/[database] [?propertyName1][=propertyValue1] [&propertyName2][=propertyValue2]...

    Kami akan menetapkan harta ini seperti: jdbc: mysql: // localhost: 3306 / test? ServerTimezone = UTC

  • Kelas pemandu - nama kelas yang layak digunakan pemandu. Dalam kes kami, kami akan menggunakan pemacu MySQL: com.mysql.cj.jdbc.Driver
  • Nama pengguna dan kata laluan - kelayakan akaun MySQL

3.2. Contoh Sambungan JDBC

Mari lihat bagaimana kita dapat menyambung ke pangkalan data kita dan melaksanakan pilihan mudah melalui sumber-sumber yang banyak dicuba:

String sqlSelectAllPersons = "SELECT * FROM person"; String connectionUrl = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC"; try (Connection conn = DriverManager.getConnection(connectionUrl, "username", "password"); PreparedStatement ps = conn.prepareStatement(sqlSelectAllPersons); ResultSet rs = ps.executeQuery()) { while (rs.next()) { long id = rs.getLong("ID"); String name = rs.getString("FIRST_NAME"); String lastName = rs.getString("LAST_NAME"); // do something with the extracted data... } } catch (SQLException e) { // handle the exception }

Seperti yang dapat kita lihat, di dalam badan percubaan , kita melakukan iterasi melalui set hasil dan mengekstrak nilai dari jadual orang.

4. Menghubungkan Menggunakan ORM

Lebih biasa, kami akan menyambung ke pangkalan data MySQL kami menggunakan Kerangka Pemetaan Objektif (ORM) . Oleh itu, mari kita lihat beberapa contoh sambungan yang menggunakan kerangka kerja yang lebih popular.

4.1. API Hibernate Asli

Di bahagian ini, kita akan melihat bagaimana menggunakan Hibernate untuk menguruskan sambungan JDBC ke pangkalan data kami.

Pertama, kita perlu menambahkan kebergantungan hibernate-core Maven:

 org.hibernate hibernate-core 5.4.10.Final 

Hibernate menghendaki kelas entiti mesti dibuat untuk setiap jadual. Mari maju dan tentukan kelas Person :

@Entity @Table(name = "Person") public class Person { @Id Long id; @Column(name = "FIRST_NAME") String firstName; @Column(name = "LAST_NAME") String lastName; // getters & setters } 

Aspek penting lain adalah membuat fail sumber Hibernate, biasanya bernama hibernate.cfg.xml , di mana kami akan menentukan maklumat konfigurasi:

     com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/test?serverTimezone=UTC username password  org.hibernate.dialect.MySQL5Dialect  validate    

Hibernate mempunyai banyak sifat konfigurasi. Terlepas dari sifat sambungan standard, perlu disebutkan sifat dialek yang membolehkan kita menentukan nama dialek SQL untuk pangkalan data.

Properti ini digunakan oleh kerangka untuk menukar penyataan Hibernate Query Language (HQL) dengan betul ke SQL yang sesuai untuk pangkalan data kami yang diberikan. Hibernate kapal dengan lebih daripada 40 dialek SQL. Semasa kami memfokus pada MySQL dalam artikel ini, kami akan mengikuti dialek MySQL5Dialect .

Akhirnya, Hibernate juga perlu mengetahui nama kelas entiti yang layak sepenuhnya melalui tag pemetaan. Setelah kami menyelesaikan konfigurasi, kami akan menggunakan kelas SessionFactory , yang merupakan kelas yang bertanggungjawab untuk membuat dan menyatukan sambungan JDBC.

Biasanya, ini hanya perlu disediakan sekali untuk aplikasi:

SessionFactory sessionFactory; // configures settings from hibernate.cfg.xml StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build(); try { sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); } catch (Exception e) { // handle the exception }

Setelah hubungan kita disiapkan, kita boleh menjalankan pertanyaan untuk memilih semua orang dari jadual orang kita:

Session session = sessionFactory.openSession(); session.beginTransaction(); List result = session.createQuery("from Person", Person.class).list(); result.forEach(person -> { //do something with Person instance... }); session.getTransaction().commit(); session.close();

4.2. MyBatis

MyBatis diperkenalkan pada tahun 2010 dan merupakan rangka mapper SQL dengan kesederhanaan sebagai kekuatannya . Dalam tutorial lain, kami membincangkan bagaimana mengintegrasikan MyBatis dengan Spring and Spring Boot. Di sini, kita akan memfokuskan cara mengkonfigurasi MyBatis secara langsung.

Untuk menggunakannya, kita perlu menambahkan ketergantungan mybatis :

 org.mybatis mybatis 3.5.3 

Dengan mengandaikan bahawa kita menggunakan semula kelas Person di atas tanpa anotasi, kita boleh terus membuat antara muka PersonMapper :

public interface PersonMapper { String selectAll = "SELECT * FROM Person"; @Select(selectAll) @Results(value = { @Result(property = "id", column = "ID"), @Result(property = "firstName", column = "FIRST_NAME"), @Result(property = "lastName", column = "LAST_NAME") }) List selectAll(); }

Langkah seterusnya adalah mengenai konfigurasi MyBatis:

Configuration initMybatis() throws SQLException { DataSource dataSource = getDataSource(); TransactionFactory trxFactory = new JdbcTransactionFactory(); Environment env = new Environment("dev", trxFactory, dataSource); Configuration config = new Configuration(env); TypeAliasRegistry aliases = config.getTypeAliasRegistry(); aliases.registerAlias("person", Person.class); config.addMapper(PersonMapper.class); return config; } DataSource getDataSource() throws SQLException { MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setDatabaseName("test"); dataSource.setServerName("localhost"); dataSource.setPort(3306); dataSource.setUser("username"); dataSource.setPassword("password"); dataSource.setServerTimezone("UTC"); return dataSource; }

Konfigurasi terdiri daripada membuat objek Konfigurasi yang merupakan wadah untuk tetapan seperti Lingkungan . Ini juga mengandungi tetapan sumber data.

Kita kemudian dapat menggunakan objek Konfigurasi , yang biasanya disiapkan sekali untuk aplikasi membuat SqlSessionFactory :

Configuration configuration = initMybatis(); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); try (SqlSession session = sqlSessionFactory.openSession()) { PersonMapper mapper = session.getMapper(PersonMapper.class); List persons = mapper.selectAll(); // do something with persons list ... }

4.3. Apache Cayenne

Apache Cayenne adalah kerangka ketekunan yang rilis pertamanya bermula pada tahun 2002. Untuk mengetahui lebih lanjut mengenainya, kami sarankan membaca pengenalan kami kepada Apache Cayenne.

Seperti biasa, mari kita tambahkan kebergantungan Maven server-cayenne :

 org.apache.cayenne cayenne-server 4.0.2 

Kami akan memberi tumpuan khusus pada tetapan sambungan MySQL. Dalam kes ini, kami akan mengkonfigurasi cayenne-project.xml :

After the automatic generation of the datamap.map.xml and Person class in the form of a CayenneDataObject, we can execute some queries.

For example, we'll continue as previously with a select all:

ServerRuntime cayenneRuntime = ServerRuntime.builder() .addConfig("cayenne-project.xml") .build(); ObjectContext context = cayenneRuntime.newContext(); List persons = ObjectSelect.query(Person.class).select(context); // do something with persons list...

5.Connecting Using Spring Data

Spring Data is a Spring-based programming model for data access. Technically, Spring Data is an umbrella project which contains many subprojects that are specific to a given database.

Let's see how to use two of these projects to connect to a MySQL database.

5.1. Spring Data / JPA

Spring Data JPA is a robust framework that helps reduce boilerplate code and provides a mechanism for implementing basic CRUD operations via one of several predefined repository interfaces. In addition to this, it has many other useful features.

Be sure to check out our introduction to Spring Data JPA to learn more.

The spring-data-jpa artifact can be found on Maven Central:

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

We'll continue using the Person class. The next step is to configure JPA using annotations:

@Configuration @EnableJpaRepositories("packages.to.scan") public class JpaConfiguration { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC"); dataSource.setUsername( "username" ); dataSource.setPassword( "password" ); return dataSource; } @Bean public JpaTransactionManager transactionManager(EntityManagerFactory emf) { return new JpaTransactionManager(emf); } @Bean public JpaVendorAdapter jpaVendorAdapter() { HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setDatabase(Database.MYSQL); jpaVendorAdapter.setGenerateDdl(true); return jpaVendorAdapter; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean lemfb = new LocalContainerEntityManagerFactoryBean(); lemfb.setDataSource(dataSource()); lemfb.setJpaVendorAdapter(jpaVendorAdapter()); lemfb.setPackagesToScan("packages.containing.entity.classes"); return lemfb; } }

To allow Spring Data to implement the CRUD operations, we have to create an interface that extends the CrudRepository interface:

@Repository public interface PersonRepository extends CrudRepository { }

And finally, let's see an example of select-all with Spring Data:

personRepository.findAll().forEach(person -> { // do something with the extracted person });

5.2. Spring Data / JDBC

Spring Data JDBC is a limited implementation of the Spring Data family, with its primary goal to allow simple access to relational databases.

For this reason, it doesn't provide features like caching, dirty tracking, lazy loading, and many other JPA features.

This time the Maven dependency we need is spring-data-jdbc:

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

The configuration is lighter compared to the one we used in the previous section for Spring Data JPA:

@Configuration @EnableJdbcRepositories("packages.to.scan") public class JdbcConfiguration extends AbstractJdbcConfiguration { // NamedParameterJdbcOperations is used internally to submit SQL statements to the database @Bean NamedParameterJdbcOperations operations() { return new NamedParameterJdbcTemplate(dataSource()); } @Bean PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC"); dataSource.setUsername("username"); dataSource.setPassword("password"); return dataSource; } }

In the case of Spring Data JDBC, we have to define a new Person class or modify the existing one to add some Spring specific annotations.

This is because Spring Data JDBC will take care directly of the entity mapping instead of Hibernate:

import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; @Table(value = "Person") public class Person { @Id Long id; @Column(value = "FIRST_NAME") String firstName; @Column(value = "LAST_NAME") String lastName; // getters and setters }

Dengan Spring Data JDBC, kita juga dapat menggunakan antara muka CrudRepository . Jadi pengisytiharan itu akan sama dengan yang kita tulis di atas dalam contoh Spring Data JPA. Begitu juga, yang sama berlaku untuk contoh pilih-semua.

6. Kesimpulannya

Dalam tutorial ini, kami telah melihat beberapa cara yang berbeza untuk menyambung ke pangkalan data MySQL dari Java . Kami bermula dengan sambungan JDBC yang penting. Kemudian kami melihat ORM yang biasa digunakan seperti Hibernate, Mybatis, dan Apache Cayenne. Akhirnya, kami melihat Spring Data JPA dan Spring Data JDBC.

Menggunakan JDBC atau Hibernate API bermaksud lebih banyak kod plat boiler. Menggunakan kerangka kerja yang mantap, seperti Spring Data atau Mybatis, memerlukan lebih banyak konfigurasi tetapi memberikan kelebihan yang signifikan kerana menyediakan implementasi dan ciri lalai seperti caching dan pemuatan malas.

Bahagian bawah Java

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS