Panduan Cepat untuk MyBatis

1. Perkenalan

MyBatis adalah kerangka kerja ketekunan open source yang menyederhanakan implementasi akses database di aplikasi Java. Ini memberikan dukungan untuk SQL kustom, prosedur tersimpan dan berbagai jenis hubungan pemetaan.

Sederhananya, ini adalah alternatif dari JDBC dan Hibernate.

2. Ketergantungan Maven

Untuk menggunakan MyBatis kita perlu menambahkan ketergantungan ke pom.xml kita :

 org.mybatis mybatis 3.4.4 

Versi terbaru dari ketergantungan tersebut dapat ditemukan di sini.

3. API Java

3.1. SQLSessionFactory

SQLSessionFactory adalah kelas inti untuk setiap aplikasi MyBatis. Kelas ini dipakai dengan menggunakan SQLSessionFactoryBuilder' s builder () metode yang beban file konfigurasi XML:

String resource = "mybatis-config.xml"; InputStream inputStream Resources.getResourceAsStream(resource); SQLSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

File konfigurasi Java menyertakan pengaturan seperti definisi sumber data, detail manajer transaksi, dan daftar pembuat peta yang menentukan hubungan antar entitas, ini bersama-sama digunakan untuk membuat instance SQLSessionFactory :

public static SqlSessionFactory buildqlSessionFactory() { DataSource dataSource = new PooledDataSource(DRIVER, URL, USERNAME, PASSWORD); Environment environment = new Environment("Development", new JdbcTransactionFactory(), dataSource); Configuration configuration = new Configuration(environment); configuration.addMapper(PersonMapper.class); // ... SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); return builder.build(configuration); }

3.2. SQLSession

SQLSession berisi metode untuk melakukan operasi database, mendapatkan pembuat peta, dan mengelola transaksi. Ini bisa dipakai dari kelas SQLSessionFactory . Instance dari kelas ini tidak aman untuk thread.

Setelah melakukan operasi database, sesi harus ditutup. Karena SqlSession mengimplementasikan antarmuka AutoCloseable , kita dapat menggunakan blok try-with-resources :

try(SqlSession session = sqlSessionFactory.openSession()) { // do work }

4. Pemeta

Mappers adalah antarmuka Java yang memetakan metode ke pernyataan SQL yang sesuai. MyBatis memberikan penjelasan untuk menentukan operasi database:

public interface PersonMapper { @Insert("Insert into person(name) values (#{name})") public Integer save(Person person); // ... @Select( "Select personId, name from Person where personId=#{personId}") @Results(value = { @Result(property = "personId", column = "personId"), @Result(property="name", column = "name"), @Result(property = "addresses", javaType = List.class, column = "personId", [email protected](select = "getAddresses")) }) public Person getPersonById(Integer personId); // ... }

5. Anotasi MyBatis

Mari kita lihat beberapa penjelasan utama yang disediakan oleh MyBatis:

  • @Insert, @Select, @Update, @Delete - anotasi tersebut mewakili pernyataan SQL yang akan dijalankan dengan memanggil metode beranotasi:
    @Insert("Insert into person(name) values (#{name})") public Integer save(Person person); @Update("Update Person set name= #{name} where personId=#{personId}") public void updatePerson(Person person); @Delete("Delete from Person where personId=#{personId}") public void deletePersonById(Integer personId); @Select("SELECT person.personId, person.name FROM person WHERE person.personId = #{personId}") Person getPerson(Integer personId);
  • @Results - ini adalah daftar hasil pemetaan yang berisi detail bagaimana kolom database dipetakan ke atribut kelas Java:
    @Select("Select personId, name from Person where personId=#{personId}") @Results(value = { @Result(property = "personId", column = "personId") // ... }) public Person getPersonById(Integer personId);
  • @Result - ini mewakili satu contoh Hasil dari daftar hasil yang diambil dari @Result. Ini mencakup detail seperti pemetaan dari kolom database ke properti kacang Java, jenis properti Java dan juga kaitannya dengan objek Java lainnya:
    @Results(value = { @Result(property = "personId", column = "personId"), @Result(property="name", column = "name"), @Result(property = "addresses", javaType =List.class) // ... }) public Person getPersonById(Integer personId);
  • @ Banyak - menentukan pemetaan dari satu objek ke kumpulan objek lainnya:
    @Results(value ={ @Result(property = "addresses", javaType = List.class, column = "personId", [email protected](select = "getAddresses")) })

    Di sini getAddresses adalah metode yang mengembalikan kumpulan Alamat dengan menanyakan tabel Alamat.

    @Select("select addressId, streetAddress, personId from address where personId=#{personId}") public Address getAddresses(Integer personId);

    Mirip dengan @Many penjelasan, kita memiliki @One penjelasan yang menentukan hubungan satu ke satu pemetaan antara objek.

  • @MapKey - ini digunakan untuk mengonversi daftar rekaman ke Peta rekaman dengan kunci seperti yang ditentukan olehatribut nilai :
    @Select("select * from Person") @MapKey("personId") Map getAllPerson();
  • @Options - anotasi ini menetapkan berbagai sakelar dan konfigurasi yang akan ditentukan sehingga alih-alih mendefinisikannya pada pernyataan lain, kita dapat @Options untuk mendefinisikannya:
    @Insert("Insert into address (streetAddress, personId) values(#{streetAddress}, #{personId})") @Options(useGeneratedKeys = false, flushCache=true) public Integer saveAddress(Address address);

6. SQL Dinamis

SQL Dinamis adalah fitur yang sangat kuat yang disediakan oleh MyBatis. Dengan ini, kita dapat menyusun SQL kompleks kita dengan akurat.

Dengan kode JDBC tradisional, kita harus menulis pernyataan SQL, menggabungkannya dengan akurasi spasi di antaranya dan meletakkan koma di tempat yang tepat. Ini sangat rentan terhadap kesalahan dan sangat sulit untuk di-debug, dalam kasus pernyataan SQL yang besar.

Mari jelajahi bagaimana kita dapat menggunakan SQL dinamis dalam aplikasi kita:

@SelectProvider(type=MyBatisUtil.class, method="getPersonByName") public Person getPersonByName(String name);

Di sini kami telah menentukan kelas dan nama metode yang benar-benar membangun dan menghasilkan SQL akhir:

public class MyBatisUtil { // ... public String getPersonByName(String name){ return new SQL() {{ SELECT("*"); FROM("person"); WHERE("name like #{name} || '%'"); }}.toString(); } }

Dynamic SQL menyediakan semua konstruksi SQL sebagai kelas misalnya SELECT , WHERE dll. Dengan ini, kita secara dinamis dapat mengubah pembuatan klausa WHERE .

7. Dukungan Prosedur Tersimpan

Kami juga dapat menjalankan prosedur tersimpan menggunakan anotasi @Select . Di sini kita perlu meneruskan nama prosedur yang tersimpan, daftar parameter dan menggunakan Panggilan eksplisit ke prosedur itu:

@Select(value= "{CALL getPersonByProc(#{personId, mode=IN, jdbcType=INTEGER})}") @Options(statementType = StatementType.CALLABLE) public Person getPersonByProc(Integer personId);

8. Kesimpulan

Dalam tutorial singkat ini, kita telah melihat berbagai fitur yang disediakan oleh MyBatis dan bagaimana memudahkan pengembangan aplikasi yang dihadapi database. Kami juga telah melihat berbagai anotasi yang disediakan oleh perpustakaan.

Kode lengkap untuk artikel ini tersedia di GitHub.