1. Giới thiệu vấn đề
Gần đây mình mới join một project mới, thay vì việc sử dụng Spring Data để mapping với dữ liệu từ database thì project sử dụng MyBatis Framework. Sau quá trình dùng, mình thấy cũng có 1 số tính năng khá hay nên viết bài này để tổng hợp kiến thức và chia sẻ cùng mọi người. Mình sẽ không đi sâu vào lý thuyết mà đi thẳng vào sample
2. Cách sử dụng
2.1. Định nghĩa
Xem ở đây
2.2. Thêm dependencies
Thêm thử viện MyBatis vào project
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.1</version> </dependency>
2.2. Khai báo path đến các config file trong application.properties
Trong ví dụ này ta để files trong resources folder
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mappers/*.xml
mybatis/mybatis-config.xml là file config tổng
<?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> <typeAliases> <typeAlias alias="Integer" type="java.lang.Integer"/> <typeAlias alias="Long" type="java.lang.Long"/> <typeAlias alias="HashMap" type="java.util.HashMap"/> <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/> <typeAlias alias="ArrayList" type="java.util.ArrayList"/> <typeAlias alias="LinkedList" type="java.util.LinkedList"/> <typeAlias type="com.example.mybatis3.model.Employee" alias="Employee"/> </typeAliases>
</configuration>
Với mỗi object, ta sẽ tạo từng file mapper riêng trong thư mục mybatis/mappers/*.xml
<?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.example.mybatis3.mapper.EmployeeMapper"> <resultMap id="EmployeeResultMap" type="Employee"> <id column="id" property="id" jdbcType="INTEGER"/> <result column="first_name" property="firstName" jdbcType="VARCHAR"/> <result column="last_name" property="lastName" jdbcType="VARCHAR"/> <result column="email_address" property="emailId" jdbcType="VARCHAR"/> </resultMap> <sql id="Base_Column_List"> id , first_name, last_name, email_address </sql> <select id="findAll" resultMap="EmployeeResultMap"> SELECT <include refid="Base_Column_List"/> FROM employees </select> <insert id="insert" parameterType="Employee"> INSERT INTO employees(id, first_name, last_name, email_address) VALUES (#{id}, #{firstName}, #{lastName}, #{emailId}) </insert> <select id="findById" resultMap="EmployeeResultMap" parameterType="long"> SELECT <include refid="Base_Column_List"/> FROM employees where id = #{id} </select> <update id="update" parameterType="Employee"> Update employees set first_name=#{firstName}, last_name=#{lastName}, email_address=#{emailId} where id = #{id} </update> <delete id="deleteById" parameterType="long"> DELETE FROM employees WHERE id = #{id} </delete> <delete id="deleteAll"> DELETE FROM employees </delete>
</mapper>
Các method trong file sẽ map chính xác các method trong file *Mapper.java
Ví dụ: findAll, findById, deleteById ...
@Mapper
public interface EmployeeMapper { List<Employee> findAll(); Employee findById(long id); // int deleteById(long id); int deleteAll(); // int insert(Employee employee); // int update(Employee employee);
}
Khi sử dụng chỉ cần khai báo file *Mapper.java
như thông thường và thực hiện các thao tác với cơ sở dữ liệu.
@Autowired EmployeeMapper employeeMapper; @Override public void run(String... args) { employeeMapper.deleteAll(); employeeMapper.insert(new Employee(10011L, "Ramesh", "Fadatare", "ramesh@gmail.com")); employeeMapper.insert(new Employee(10012L, "John", "Cena", "john@gmail.com")); employeeMapper.insert(new Employee(10013L, "tony", "stark", "stark@gmail.com")); logger.info("Employee id 10011 -> {}", employeeMapper.findById(10011L)); logger.info("Update 10003 -> {}", employeeMapper.update(new Employee(10011L, "ram", "Stark", "ramesh123@gmail.com"))); logger.info("Delete 10003 -> {}", employeeMapper.deleteById(10013L)); employeeMapper.findAll().forEach(System.out::println); employeeMapper.deleteAll(); }
3. Kết Luận
Theo cá nhân mình thấy thì nó sử dụng cũng khá tiện, dễ ràng custom query. Cũng là 1 framework hay để học hỏi.
Link Sourcecode