Bạn
cần phải có các software và tool sau:
-
Java JDK 1.5+
-
MyBatis version
(https://code.google.com/p/mybatis/)
-
MySQL
(http://www.mysql.com/)
hoặc CSDL quan hệ nào có
thể kết nối bởi JDBC Driver
-
Eclipse (http://www.eclipse.org)
hoặc IDE khác ( tốt nhất
là eclipse)
-
Apache Maven build tool(nên
dùng)
Getting
started
- MyBatis là gì?
- Tại sao lại dùng MyBatis?
- MyBatis là gì?
MyBatis
là một persistence framework mã nguồn mở được tạo ra
nhằm đơn giản hóa việc kết nối đến CSDL của JDBC và
cung cấp các API để thao tác với Database dễ dàng hơn.
Trước
đây MyBatis được gọi là iBatis và được viết ra năm
2002 bởi Clinton Begin. Mybatis 3 được thiết kế lại từ
iBatis, có hỗ trợ Mapper và Annotations.
MyBatis
được sử dụng phổ biến là do tính đơn giản và dễ
sử dụng của nó. Người sử dụng có thể thao tác dễ
dàng với SQL mà không cần sử dụng đến code JDBC ở mức
thấp(viết lặp lại nhiều và rất nản:
open,close,createStatement..) MyBatis tự động xử lý câu lệnh
SQL và lấy kết quả trả về ( từ các ResultSet của
JDBC) gán vào các đối tượng java được xây dựng bởi
lập trình viên (POJOs) hoặc
lưu dữ liệu từ các đối tượng java xuống Database.
2.
Tại sao lại dùng MyBatis?
Có
rất nhiều Persistence framework được viết ra cho lập
trình java, nhưng MyBatis được sử dụng nhiều vì các lý
do sau:
- Giảm thiểu đáng kể code JDBC
- Dễ học và sử dụng
- Có thể nhúng SQL query thuần
- Giảm thiểu đáng kể code JDBC
Java
cung cấp các JDBC API (Java DataBase Connectivity) để làm việc
với CSDL quan hệ, nhưng mà code JDBC là ở mức thấp (có
trộn lẫn SQL query vào code java) và lập trình viên thường
phải viết đi viết lại nhiều đoạn code để thực hiện
các thao tác với CSDL.
- Dễ học và sử dụng
Vì
MyBatis được thiết kế nhằm mapping các câu truy vấn SQL
nên chỉ cần bạn có kiến thức về SQL và Java là có
thể học được và sử dụng hiệu quả, và điều đó
cũng không tốn nhiều thời gian bằng học các framework
khác như Hibernate hoặc EJB. :D
- Có thể nhúng SQL query thuần
MyBatis
cho phép người dùng có thể viết câu lệnh SQL thông
thường, ngoài ra còn cho phép người dùng tùy biến câu
lệnh truy vấn theo các parameter truyền vào. Ví dụ tìm
kiếm sinh viên theo ID, Name, Mark,
nếu các parameter trên mà có thì thêm vào ở trong điều
kiện WHERE,để thực hiện điều này trong JDBC rất vất
vả là bạn phải if … else rồi cộng chuỗi sql, sau đó
mới đưa vào đối tượng Statement hoặc preparedStatement.
Nhưng với MyBatis bạn sẽ có cấu trúc điều khiển sử
dụng rất rõ ràng và hiệu quả mà không gây ra lỗi khi
bạn muốn thay đổi câu truy vấn, vấn đề này sẽ được
đề cập sau.
- hỗ trợ để tích hợp với Spring và Guice framework
MyBatis
có thể tích hợp dễ dàng với Spring và Guice. Ví dụ các
dự án dùng Spring thường đi kèm với persistence framework
là Hibernate (ORM – Object Relation Mapping – nôm na là
mapping các row trong DB thành các đối tượng trong java)
hoặc MyBatis( có thể hiểu nôm na là mapping câu truy vấn
SQL – để dễ so sánh với Hibernate :) :D)
- Hiệu năng truy vấn cao.
Hiệu
năng là một vấn đề cần quan tâm của một dự án phần
mềm, trong đó đóng vai trò quan trọng của framework nào
sử dụng để viết ra nó. MyBatis được đánh giá là có
hiệu năng cao và nhiều developer sử dụng, vì MyBatis hỗ
trợ các tính năng sau:
-
Connection pool: điều này thì không phải bàn cãi, một
ứng dụng sử dụng connection pool sẽ cải thiện tốc độ
xử lý đáng kể và sử dụng tối đa một connection (
search google nhé :))
-
Caching data: MyBatis sử dụng một cơ chế gọi là in-build
cache mechanism để lưu kết quả của truy vấn vào
SqlSession. Việc này rất hữu ích khi bạn sử dụng lại
kết quả, thì MyBatis chỉ việc trả về kết quả trong
cache mà không phải truy vấn lại Database lần nữa.
-
MyBatis không sử dụng proxy cho việc kết nối nên sẽ có
hiệu suất tốt hơn so với các framework ORM khác.
3.
Cài
đặt và cấu hình MyBatis
Việc
cài đặt MyBatis rất đơn giản, bạn chỉ việc coppy file
mybatis-x.x.x.jar vào thư mục lib của WEB-INF nếu bạn xây
dựng project Dynamic Web hoặc thêm vào dependencies trong file
pom.xml của project maven
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.2</version>
</dependency>
Để
cấu hình MyBatis trong ứng dụng ta sẽ xây dựng một demo
đơn giản mà tôi chắc chắn rằng bạn sẽ hiểu được
ngay sau khi deploy được nó.
Ta sẽ tạo một demo có thể:
- xem danh sách sinh viên
- tìm kiếm sinh viên theo id
- thêm 1 sinh viên vào csdl
Sử dụng MySQL với script sau:
CREATE TABLE STUDENT ( ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, PRIMARY KEY (ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;
Tạo một maven project như sau:
Cấu trúc chương trình như hình sau:
Chương
trình ta sẽ sử dụng CSDL MySQL, ghi log thì sử dụng slf4j
và log4j.
Các
dependencies cần thiết trong file pom.xml là
org.mybatis mybatis 3.2.2 mysql mysql-connector-java 5.1.22 runtime org.slf4j slf4j-api 1.7.5 org.slf4j slf4j-log4j12 1.7.5 runtime log4j log4j 1.2.17 runtime
Việc đầu tiên là tạo file cấu hình cho MyBatis, file mybatis-config.xml này phải đặt trong thư mục classpath của project thì mới đọc được, tôi sẽ đặt nó trong thư mục resources.
Tiếp đến cấu hình cho log. File log4j.properties cũng nằm trong thư mục resources.
log4j.rootLogger=ERROR, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n
Việc cấu hình đã xong, bây giờ ta sẽ xây dựng lớp FactoryUtil để quản lý SqlSessionFactory.
package vn.ds.util; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.log4j.Logger; public class FactoryUtil { private static SqlSessionFactory sessionFactory = getSessionFactory(); private static Logger log = Logger.getLogger(FactoryUtil.class); public static SqlSessionFactory getSessionFactory() { if (sessionFactory == null) { InputStream stream; try { stream = Resources.getResourceAsStream("mybatis-config.xml"); sessionFactory = new SqlSessionFactoryBuilder().build(stream); } catch (IOException e) { log.error("not find mybatis-config.xml"); throw new RuntimeException(e.getCause()); } } return sessionFactory; } public static SqlSession openSession() { return sessionFactory.openSession(); } }
Tiếp đến là tạo mapper. File StudentMapper.xml sẽ mapping các câu truy vấn vào bản g STUDENT bao gồm 2 câu SELECT và 1 câu INSERT. File StudentMapper.java là một interface chứa các method để thực hiện các tác vụ, các method này chính là các id trong tag select và insert của file StudentMapper.xml. Lưu ý là 2 file này sau khi biên dịch, phải nằm cũng một thư mục (file .class) ở đây ta đăt chung vào thư mục vn.ds.mapper.
package vn.ds.mapper; import java.util.List; import vn.ds.domain.Student; public interface StudentMapper { ListfindAllStudents(); Student findStudentById(Integer id); void insertStudent(Student student); }
INSERT INTO STUDENT(ID,NAME) VALUES(#{id},#{name})
domain
Chứa các lớp POJOs lưu trữ dữ liệu từ DB, các lớp này bao gồm các thuộc tính, setter và getter.
cụ thể lớp Student như sau:
package vn.ds.domain; public class Student { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student{'ID' : " + id + ", NAME : " + name + "}"; } }Tiếp theo ta tạo lớp service để thực thi interface StudentMapper.
package vn.ds.service; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import vn.ds.domain.Student; import vn.ds.mapper.StudentMapper; import vn.ds.util.FactoryUtil; public class StudentService { private Logger logger = LoggerFactory.getLogger(getClass()); public ListfindAllStudents() { SqlSession session = FactoryUtil.openSession(); try { StudentMapper mapper = session.getMapper(StudentMapper.class); return mapper.findAllStudents(); } finally { session.close(); } } public Student findStudentById(Integer studId) { logger.debug("Select Student By ID :{}", studId); SqlSession sqlSession = FactoryUtil.openSession(); try { StudentMapper studentMapper = sqlSession .getMapper(StudentMapper.class); return studentMapper.findStudentById(studId); } finally { sqlSession.close(); } } public void createStudent(Student student) { SqlSession sqlSession = FactoryUtil.openSession(); try { StudentMapper studentMapper = sqlSession .getMapper(StudentMapper.class); studentMapper.insertStudent(student); sqlSession.commit(); } finally { sqlSession.close(); } } }
Cuối cùng ta tạo một controller để gọi service trên
package vn.ds.controller; import java.util.List; import vn.ds.domain.Student; import vn.ds.service.StudentService; public class StudentController { public static void main(String[] args) { StudentService service = new StudentService(); Listsource code: http://www.mediafire.com/download/aoi5zxqixdt3t2u/Mybatis1.rarlist =service.findAllStudents(); for(Student s : list) System.out.println(s.toString()); Student student = new Student(); student.setId(4); student.setName("Student 4"); service.createStudent(student); System.out.println(service.findStudentById(3)); } }