Các thành phần công cụ của MyBatis

MyBatis cung cấp một số lớp tiện ích giúp nhà phát triển dễ dàng hơn trong quá trình phát triển. Dưới đây là các lớp công cụ phổ biến trong MyBatis cùng với mô tả về chức năng của chúng:

Lớp công cụ SQL (org.apache.ibatis.jdbc.SQL)

Dùng để xây dựng động các câu lệnh SQL, hỗ trợ chuỗi gọi và tránh việc nối chuỗi.

Ví dụ

import org.apache.ibatis.jdbc.SQL;

public class CauLenhSQL {
    public String timTheoID(Long id) {
        return new SQL() {{
            SELECT("*");
            FROM("nguoi_dung");
            WHERE("id = #{id}");
        }}.toString();
    }

    public String themMoiNguoiDung(NguoiDung nguoiDung) {
        return new SQL() {{
            INSERT_INTO("nguoi_dung");
            VALUES("ten", "#{ten}");
            VALUES("tuoi", "#{tuoi}");
            VALUES("email", "#{email}");
        }}.toString();
    }

    public String capNhatNguoiDung(NguoiDung nguoiDung) {
        return new SQL() {{
            UPDATE("nguoi_dung");
            SET("ten = #{ten}", "tuoi = #{tuoi}", "email = #{email}");
            WHERE("id = #{id}");
        }}.toString();
    }
}

Các trường hợp sử dụng

  • Tạo động các câu lệnh SQL (ví dụ: @SelectProvider, @InsertProvider).
  • Hạn chế nối chuỗi thủ công, nâng cao khả năng đọc và bảo mật.

Lớp ScriptRunner (org.apache.ibatis.jdbc.ScriptRunner)

Sử dụng để thực thi các tập lệnh SQL (như schema.sql hoặc data.sql), thường được dùng để khởi tạo cơ sở dữ liệu.

Ví dụ

import org.apache.ibatis.jdbc.ScriptRunner;
import java.io.Reader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;

public class ChayTepSQL {
    public static void main(String[] args) throws Exception {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/kiemtra", "root", "matkhau");
        ScriptRunner runner = new ScriptRunner(conn);
        runner.setAutoCommit(true); 
        runner.setStopOnError(true); 
        
        Reader reader = new InputStreamReader(ChayTepSQL.class.getResourceAsStream("/schema.sql"));
        runner.runScript(reader);
        
        conn.close();
    }
}

Các trường hợp sử dụng

  • Khởi tạo cơ sở dữ liệu (tạo bảng, thêm dữ liệu ban đầu).
  • Nhanh chóng khởi tạo dữ liệu kiểm thử trong đơn vị kiểm thử.

Lớp MetaObject (org.apache.ibatis.reflection.MetaObject)

Dùng để thao tác phản chiếu đối tượng thuộc tính, hỗ trợ truy cập thuộc tính lồng nhau (ví dụ: nguoi_dung.dia_chi.thanh_pho).

Ví dụ

import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;

public class VíDuMetaObject {
    public static void main(String[] args) {
        NguoiDung nguoiDung = new NguoiDung();
        nguoiDung.setTen("Nguyễn Văn A");
        
        MetaObject metaObject = SystemMetaObject.forObject(nguoiDung);
        
        metaObject.setValue("ten", "Nguyễn Văn B");
        
        String ten = (String) metaObject.getValue("ten");
        System.out.println(ten); 
        
        DiaChi diaChi = new DiaChi();
        diaChi.setThanhPho("Hà Nội");
        nguoiDung.setDiaChi(diaChi);
        
        metaObject.setValue("dia_chi.thanh_pho", "Thành phố Hồ Chí Minh");
        System.out.println(nguoiDung.getDiaChi().getThanhPho());
    }
}

Các trường hợp sử dụng

  • MyBatis sử dụng nội bộ để xử lý ánh xạ tham số #{param}.
  • Trong các bộ đệm tùy chỉnh hoặc trình chuyển đổi kiểu dữ liệu để thao tác động đối tượng thuộc tính.

Các lớp công cụ liên quan đến ResultSetHandler

MyBatis cung cấp một số lớp để xử lý ResultSet, bao gồm:

  • DefaultResultSetHandler (sử dụng bên trong, thường không gọi trực tiếp)
  • ResultHandler (dùng để tùy chỉnh xử lý kết quả)

Ví dụ (tùy chỉnh ResultHandler)

import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;

public class XulyKetQuaTuDinh implements ResultHandler<NguoiDung> {
    private List<NguoiDung> danhSachND = new ArrayList<>();

    @Override
    public void handleResult(ResultContext ketQua) {
        NguoiDung nguoiDung = ketQua.getResultObject();
        danhSachND.add(nguoiDung);
        
        if (danhSachND.size() >= 100) {
            ketQua.stop(); 
        }
    }

    public List<NguoiDung> layDanhSach() {
        return danhSachND;
    }
}

Cách sử dụng

SqlSession session = sessionFactory.openSession();
XulyKetQuaTuDinh xuLy = new XulyKetQuaTuDinh();
session.select("com.vídu.mapper.NguoiDungMapper.layTấtCả", xuLy);
List<NguoiDung> danhSachND = xuLy.layDanhSach();
session.close();

Các trường hợp sử dụng

  • Xử lý dữ liệu lớn theo từng phần, tránh tràn bộ nhớ.
  • Tùy chỉnh logic xử lý kết quả.

Lớp SqlRunner (org.apache.ibatis.jdbc.SqlRunner)

Tăng cường các hoạt động JDBC, cung cấp chức năng tương tự như Spring JdbcTemplate.

Ví dụ

import org.apache.ibatis.jdbc.SqlRunner;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Map;

public class VíDuSqlRunner {
    public static void main(String[] args) throws Exception {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/kiemtra", "root", "matkhau");
        SqlRunner sqlRunner = new SqlRunner(conn);
        
        List<Map<String, Object>> nguoiDungs = sqlRunner.selectAll("SELECT * FROM nguoi_dung WHERE tuoi > ?", 18);
        System.out.println(nguoiDungs);
        
        int soDongThayDoi = sqlRunner.update("INSERT INTO nguoi_dung(ten, tuoi) VALUES(?, ?)", "Nguyễn Thị C", 25);
        System.out.println("Số dòng đã thay đổi: " + soDongThayDoi);
        
        conn.close();
    }
}

Các trường hợp sử dụng

  • Hoạt động JDBC đơn giản, không muốn viết nhiều mã mẫu.
  • Nhanh chóng thực hiện các thao tác cơ sở dữ liệu trong dự án nhỏ hoặc khi kiểm thử.

Các lớp công cụ liên quan đến TypeHandler

MyBatis cung cấp một số lớp TypeHandler để tùy chỉnh việc chuyển đổi kiểu dữ liệu:

  • BaseTypeHandler (khuyên dùng kế thừa)
  • EnumTypeHandler (xử lý mặc định cho kiểu liệt kê)
  • DateTypeHandler (xử lý ngày)

Ví dụ (tùy chỉnh TypeHandler)

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class XulyJson extends BaseTypeHandler<Object> {
    private static final ObjectMapper mapper = new ObjectMapper();

    @Override
    public void setNonNullParameter(PreparedStatement stmt, int index, Object param, JdbcType jdbcType) throws SQLException {
        stmt.setString(index, mapper.writeValueAsString(param));
    }

    @Override
    public Object getNullableResult(ResultSet rs, String tenCot) throws SQLException {
        String json = rs.getString(tenCot);
        return json == null ? null : mapper.readValue(json, Object.class);
    }

    // Các phương thức getNullableResult khác...
}

Cách cấu hình

<typeHandlers>
    <typeHandler handler="com.vídu.XulyJson"/>
</typeHandlers>

Các trường hợp sử dụng

  • Tùy chỉnh chuyển đổi giữa đối tượng Java và trường cơ sở dữ liệu (ví dụ: lưu trữ JSON).
  • Xử lý các kiểu dữ liệu đặc biệt (ví dụ: trường mã hóa, kiểu phức tạp).

Thẻ: mybatis sql ScriptRunner MetaObject ResultSetHandler

Đăng vào ngày 30 tháng 6 lúc 16:45