Tulisan kali ini akan membahas mengenai MyBatis. Melalui site resmi MyBatis mybatis.github.io/mybatis-3, pengembangnya mengatakan bahwa MyBatis merupakan sebuah persistence framework yang dapat mempermudah para pengembang untuk bekerja dengan basisdata karena framework ini menyederhakan penggunaan JDBC.
Untuk bisa memahami penggunaan MyBatis maka kita harus langsung praktik. Seperti biasa saya membuat sebuah project menggunakan Maven. Gambar dibawah ini menunjukkan struktur akhir project.
Dependencies
Pada file pom.xml tambahkan beberapa dependency yang dibutuhkan. Lihat kodenya dibawah ini, yang paling utama tentunya kita menambahkan dependency dari MyBatis
file : pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.agungsetiawan</groupId> <artifactId>TutorialMyBatis</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>TutorialMyBatis</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> </dependency> </dependencies> </project> |
Tabel Database dan Kelas Entity
Kita buat sebuah tabel database dengan nama user. Tabel ini nantinya akan kita gunakan untuk menampung data user yang kita jadikan sampel data untuk mengetes kode kita. Berikut adalah kode sql untuk membuat tabel tersebut.
1 2 3 4 5 6 7 8 |
CREATE TABLE `user` ( `user_id` int(10) NOT NULL AUTO_INCREMENT, `email` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `first_name` varchar(50) NOT NULL, `last_name` varchar(50) NOT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 |
Buat juga sebuah kelas entity dari tabel user tadi. Gunanya buat apa? sudah berkali-kali saya jelaskan, silahkan cek tulisan-tulisan yang terdahulu.
file : src/main/java/com/agungsetiawan/tutorialmybatis/domain/User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com.agungsetiawan.tutorialmybatis.domain; public class User { private Integer userId; private String email; private String password; private String firstName; private String lastName; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getFirstname() { return firstName; } public void setFirstname(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } } |
Konfigurasi MyBatis
Sekarang kita sampai pada bagian membuat file konfigurasi yang dibutuhkan oleh MyBatis. Disini kita akan membuat 2 buah file. File pertama berisi setingan untuk data source seperti username dan password database. Sedangkan file kedua merupakan file konfigurasi utama dari MyBatis.
file : src/main/resources/jdbc.properties
1 2 3 4 |
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/tutorial_mybatis jdbc.username=root jdbc.password= |
file : src/main/resources/mybatis-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC '-//mybatis.org//DTD Config 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-config.dtd'> <configuration> <properties resource='jdbc.properties'/> <typeAliases> <typeAlias type='com.agungsetiawan.tutorialmybatis.domain.User' alias='User'></typeAlias> </typeAliases> <environments default='development'> <environment id='development'> <transactionManager type='JDBC'/> <dataSource type='POOLED'> <property name='driver' value='${jdbc.driverClassName}'/> <property name='url' value='${jdbc.url}'/> <property name='username' value='${jdbc.username}'/> <property name='password' value='${jdbc.password}'/> </dataSource> </environment> </environments> <mappers> <mapper resource='mapper/UserMapper.xml'/> </mappers> </configuration> |
Pada konfigurasi diatas alias digunakan supaya file konfigurasi UserMapper (akan kita buat pada bagian selanjutnya) bisa mengenali bahwa jika kita menuliskan “User” maka yang dimaksud adalah “com.agungsetiawan.tutorialmybatis.domain.User”
Mapper
Buat sebuah interface untuk menangani proses CRUD
file : src/main/java/com/agungsetiawan/tutorialmybatis/mapper/UserMapper.java
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.agungsetiawan.tutorialmybatis.mapper; import java.util.List; import com.agungsetiawan.tutorialmybatis.domain.User; public interface UserMapper { public void save(User user); public void edit(User user ); public void delete(Integer id); public User findOne(Integer id); public List<User> findAll(); } |
Selanjutnya kita siapkan file xml untuk CRUD. SQL kita tulis disini, proses CRUD juga terjadi disini
src : src/main/resources/mapper/UserMapper/xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE mapper PUBLIC '-//mybatis.org//DTD Mapper 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-mapper.dtd'> <mapper namespace='com.agungsetiawan.tutorialmybatis.mapper.UserMapper'> //jika tanpa alias maka menggunakan kelas User seperti ini, ditulis lengkap package-nya <select id="findOne" parameterType="int" resultType="com.agungsetiawan.tutorialmybatis.domain.User"> SELECT user_id as userId, email as email, password, first_name as firstName, last_name as lastName FROM USER WHERE USER_ID = #{userId} </select> //menggunakan alias, maka cukup dituliskan User <resultMap type='User' id='UserResult'> <id property='userId' column='user_id'/> <result property='email' column='email'/> <result property='password' column='password'/> <result property='firstName' column='first_name'/> <result property='lastName' column='last_name'/> </resultMap> <select id='findAll' resultMap='UserResult'> SELECT * FROM USER </select> <insert id='save' parameterType='User' useGeneratedKeys='true' keyProperty='userId'> INSERT INTO USER(email, password, first_name, last_name) VALUES(#{email}, #{password}, #{firstName}, #{lastName}) </insert> <update id='edit' parameterType='User'> UPDATE USER SET EMAIL=#{email}, PASSWORD= #{password}, FIRST_NAME = #{firstName}, LAST_NAME = #{lastName} WHERE USER_ID = #{userId} </update> <delete id='delete' parameterType='int'> DELETE FROM USER WHERE USER_ID = #{userId} </delete> </mapper> |
Service
MyBatis untuk dapat bekerja memanipulasi database dia membutuhkan sebuah kelas yang bernama SqlSessionFactory. Kelas ini idealnya hanya diciptakan sekali ketika aplikasi berjalan, dia ada selama aplikasi masih hidup. Dia tidak dihapus dari memory atau diciptakan kembali. Hanya diciptakan sekali saat pertama kali dan hanya dihapus ketika aplikasi ditutup. Untuk itu kita akan membuat sebuah kelas util yang berguna untuk membuat objek dari SqlSessionFactory yang cukup sekali menggunakan Static Singleton pattern. Lebih jelas mengenai urusan life cycle ini silahkan kunjungi link berikut http://mybatis.github.io/mybatis-3/getting-started.html pada bagian Scope and Lifecycle.
So, berikut ini adalah kelas utilnya
file : src/main/java/com/agungsetiawan/tutorialmybatis/service/MyBatisUtil.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com.agungsetiawan.tutorialmybatis.service; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisUtil { private static SqlSessionFactory factory; static{ Reader reader; try{ reader=Resources.getResourceAsReader("mybatis-config.xml"); }catch(IOException exception){ throw new RuntimeException(exception.getMessage()); } factory=new SqlSessionFactoryBuilder().build(reader); } public static SqlSessionFactory getSqlSessionFactory(){ return factory; } } |
Yup, next step adalah membuat service yang digunakan untuk proses CRUD memanfaatkan interface UserMapper yang kita buat diatas tadi.
file : src/main/java/com/agungsetiawan/tutorialmybatis/UserService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
package com.agungsetiawan.tutorialmybatis.service; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.agungsetiawan.tutorialmybatis.domain.User; import com.agungsetiawan.tutorialmybatis.mapper.UserMapper; public class UserService { public void save(User user){ SqlSession sqlSession=MyBatisUtil.getSqlSessionFactory().openSession(); try{ UserMapper userMapper=sqlSession.getMapper(UserMapper.class); userMapper.save(user); sqlSession.commit(); }catch(Exception ex){ sqlSession.rollback(); }finally{ sqlSession.close(); } } public void edit(User user){ SqlSession sqlSession=MyBatisUtil.getSqlSessionFactory().openSession(); try{ UserMapper userMapper=sqlSession.getMapper(UserMapper.class); userMapper.edit(user); sqlSession.commit(); }catch(Exception ex){ sqlSession.rollback(); }finally{ sqlSession.close(); } } public void delete(Integer id){ SqlSession sqlSession=MyBatisUtil.getSqlSessionFactory().openSession(); try{ UserMapper userMapper=sqlSession.getMapper(UserMapper.class); userMapper.delete(id); sqlSession.commit(); }catch(Exception ex){ sqlSession.rollback(); }finally{ sqlSession.close(); } } public User findOne(Integer id){ SqlSession sqlSession=MyBatisUtil.getSqlSessionFactory().openSession(); try{ UserMapper userMapper=sqlSession.getMapper(UserMapper.class); return userMapper.findOne(id); }catch(Exception ex){ ex.printStackTrace(); }finally{ sqlSession.close(); } return null; } public List<User> findAll(){ SqlSession sqlSession=MyBatisUtil.getSqlSessionFactory().openSession(); try{ UserMapper userMapper=sqlSession.getMapper(UserMapper.class); return userMapper.findAll(); }catch(Exception ex){ ex.printStackTrace(); }finally{ sqlSession.close(); } return null; } } |
Penutup
MyBatis bisa dijadikan alternatif sebagai persistence framework untuk aplikasi yang kita bangun. Biasanya muncul pertanyaan kapan menggunakan MyBatis? kenapa tidak Hibernate atau JPA atau malah plain JDBC?
hehe untuk menjawabnya perlu banyak pengalaman dilapangan. Menjawab pertanyaan “kenapa” lebih susah daripada menjawab “bagaimana” π
Semoga bermanfaat π