+5

Sử dụng MyBatis Java Framework với Spring boot

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


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí