Panduan Pantas ke MyBatis

1. Pengenalan

MyBatis adalah kerangka ketekunan sumber terbuka yang mempermudah pelaksanaan akses pangkalan data dalam aplikasi Java. Ini memberikan sokongan untuk SQL tersuai, prosedur tersimpan dan berbagai jenis hubungan pemetaan.

Ringkasnya, ini adalah alternatif untuk JDBC dan Hibernate.

2. Pergantungan Maven

Untuk menggunakan MyBatis, kita perlu menambahkan kebergantungan pada pom.xml kita :

 org.mybatis mybatis 3.4.4 

Versi ketergantungan terkini boleh didapati di sini.

3. API Java

3.1. SQLSessionFactory

SQLSessionFactory adalah kelas teras untuk setiap aplikasi MyBatis. Kelas ini dibuat dengan menggunakan kaedah SQLSessionFactoryBuilder 's builder () yang memuat fail konfigurasi XML:

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

Fail konfigurasi Java merangkumi tetapan seperti definisi sumber data, perincian pengurus transaksi, dan daftar pemetaan yang menentukan hubungan antara entiti, semuanya digunakan untuk membina contoh 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 mengandungi kaedah untuk melakukan operasi pangkalan data, memperoleh pemetaan dan menguruskan transaksi. Ia dapat ditunjukkan dari kelas SQLSessionFactory . Contoh kelas ini tidak selamat di dalam benang.

Setelah menjalankan operasi pangkalan data sesi harus ditutup. Oleh kerana SqlSession menerapkan antara muka AutoCloseable , kita dapat menggunakan blok try-with-resources :

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

4. Pemetaan

Mappers adalah antara muka Java yang memetakan kaedah ke pernyataan SQL yang sesuai. MyBatis menyediakan anotasi untuk menentukan operasi pangkalan data:

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 lihat beberapa anotasi utama yang disediakan oleh MyBatis:

  • @Insert, @Select, @Update, @Delete - anotasi tersebut mewakili pernyataan SQL yang akan dilaksanakan dengan memanggil kaedah anotasi:
    @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 pemetaan hasil yang berisi perincian bagaimana lajur pangkalan data 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 - ia mewakili satu contoh Keputusan dari senarai hasil yang diambil dari @Results. Ini termasuk perincian seperti pemetaan dari kolom pangkalan data ke properti kacang Java, jenis properti Java dan juga hubungan 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 - ini menentukan pemetaan satu objek ke koleksi objek lain:
    @Results(value ={ @Result(property = "addresses", javaType = List.class, column = "personId", [email protected](select = "getAddresses")) })

    Di sini getAddresses adalah kaedah yang mengembalikan koleksi Alamat dengan meminta jadual Alamat.

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

    Mirip dengan @Banyak anotasi, kami mempunyai @Satu anotasi yang menentukan hubungan pemetaan satu ke satu antara objek.

  • @MapKey - ini digunakan untuk menukar senarai rekod ke Peta rekod dengan kunci seperti yang ditentukan olehatribut nilai :
    @Select("select * from Person") @MapKey("personId") Map getAllPerson();
  • @Options - anotasi ini menentukan pelbagai suis dan konfigurasi yang akan ditentukan sehingga daripada menentukannya pada pernyataan lain, kita dapat @Options untuk menentukannya:
    @Insert("Insert into address (streetAddress, personId) values(#{streetAddress}, #{personId})") @Options(useGeneratedKeys = false, flushCache=true) public Integer saveAddress(Address address);

6. SQL Dinamik

Dynamic SQL adalah ciri yang sangat hebat yang disediakan oleh MyBatis. Dengan ini, kita dapat membuat struktur SQL kompleks kita dengan tepat.

Dengan kod JDBC tradisional, kita harus menulis pernyataan SQL, menggabungkannya dengan ketepatan ruang di antara mereka dan meletakkan koma di tempat yang betul. Ini sangat rawan ralat dan sangat sukar untuk debug, dalam hal penyataan SQL yang besar.

Mari terokai bagaimana kita dapat menggunakan SQL dinamik dalam aplikasi kita:

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

Di sini kami telah menentukan kelas dan nama kaedah yang benar-benar membina 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 seperti SELECT , WHERE dll. Dengan ini, kita dapat mengubah generasi klausa WHERE secara dinamik .

7. Sokongan Prosedur Tersimpan

Kami juga dapat melaksanakan prosedur yang tersimpan menggunakan anotasi @Pilih . Di sini kita perlu memberikan nama prosedur yang tersimpan, senarai parameter dan menggunakan Panggilan yang jelas untuk prosedur itu:

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

8. Kesimpulannya

Dalam tutorial ringkas ini, kami telah melihat pelbagai ciri yang disediakan oleh MyBatis dan bagaimana ia memudahkan pengembangan aplikasi yang menghadap pangkalan data. Kami juga telah melihat pelbagai anotasi yang disediakan oleh perpustakaan.

Kod lengkap untuk artikel ini terdapat di GitHub.