Tự động tạo lớp thực thể và tệp ánh xạ từ bảng cơ sở dữ liệu
Trong MyBatis hoặc MyBatis Plus, mặc dù không có chức năng tích hợp sẵn để tạo mã nguồn bằng một cú nhấp chuột, nhưng bạn có thể sử dụng các công cụ và plugin để tự động tạo lớp thực thể và tệp ánh xạ từ bảng cơ sở dữ liệu. Dưới đây là hướng dẫn chi tiết về cách thực hiện:
Tạo lớp thực thể thủ công
Đầu tiên, bạn có thể tạo một lớp thực thể KhachHang để ánh xạ bảng khach_hang:
import java.util.Date;
public class KhachHang {
private Long maKhachHang;
private String tenDangNhap;
private String matKhau;
private String muoiBam;
private String hinhDaiDien;
private Date ngayDangKy;
private Date ngayDangNhapCuoi;
private Integer soLanDangNhap;
// Getters and Setters
}
Sử dụng MyBatis Plus để tự động tạo mã nguồn
MyBatis Plus cung cấp trình tạo mã nguồn có thể tự động tạo lớp thực thể, giao diện Mapper và tệp XML tương ứng dựa trên cấu trúc bảng cơ sở dữ liệu.
Bước 1: Thêm dependency
Đảm bảo dự án của bạn đã thêm dependency của MyBatis Plus và trình tạo mã nguồn:
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.x.x</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.x.x</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.x.x</version>
</dependency>
<!-- Driver cơ sở dữ liệu -->
<dependency>
<groupId>driver.csd</groupId>
<artifactId>tendriver</artifactId>
<version>version</version>
</dependency>
</dependencies>
Bước 2: Cấu hình trình tạo mã nguồn
Thiết lập cấu hình cho trình tạo, bao gồm kết nối cơ sở dữ liệu, tên gói, chiến lược...
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.Scanner;
public class TaoMaNguon {
public static String nhapThongTin(String thongTin) {
Scanner scanner = new Scanner(System.in);
System.out.println("Vui lòng nhập " + thongTin + ":");
if (scanner.hasNext()) {
String dauVao = scanner.next();
if (StringUtils.isNotBlank(dauVao)) {
return dauVao.trim();
}
}
throw new MybatisPlusException("Vui lòng nhập đúng " + thongTin + "!");
}
public static void main(String[] args) {
// Khởi tạo trình tạo mã nguồn
AutoGenerator taoMaNguon = new AutoGenerator();
// Cấu hình toàn cục
GlobalConfig cauHinhToanCuc = new GlobalConfig();
String duongDanDuAn = System.getProperty("user.dir");
cauHinhToanCuc.setOutputDir(duongDanDuAn + "/src/main/java");
cauHinhToanCuc.setAuthor("Tên của bạn");
cauHinhToanCuc.setOpen(false);
cauHinhToanCuc.setFileOverride(true);
cauHinhToanCuc.setServiceName("%sDichVu");
cauHinhToanCuc.setMapperName("%sBoDieuKhien");
taoMaNguon.setGlobalConfig(cauHinhToanCuc);
// Cấu hình nguồn dữ liệu
DataSourceConfig cauHinhNguonDuLieu = new DataSourceConfig();
cauHinhNguonDuLieu.setUrl("jdbc:mysql://localhost:3306/co_so_du_lieu?useUnicode=true&useSSL=false&characterEncoding=utf8");
cauHinhNguonDuLieu.setDriverName("com.mysql.cj.jdbc.Driver");
cauHinhNguonDuLieu.setUsername("ten_dang_nhap");
cauHinhNguonDuLieu.setPassword("mat_khau");
taoMaNguon.setDataSource(cauHinhNguonDuLieu);
// Cấu hình gói
PackageConfig cauHinhGoi = new PackageConfig();
cauHinhGoi.setModuleName(nhapThongTin("tên module"));
cauHinhGoi.setParent("com.vi.du");
taoMaNguon.setPackageInfo(cauHinhGoi);
// Cấu hình chiến lược
StrategyConfig chienLuoc = new StrategyConfig();
chienLuoc.setNaming(NamingStrategy.underline_to_camel);
chienLuoc.setColumnNaming(NamingStrategy.underline_to_camel);
chienLuoc.setEntityLombokModel(true);
chienLuoc.setRestControllerStyle(true);
chienLuoc.setInclude(nhapThongTin("tên bảng, phân tách bằng dấu phẩy").split(","));
taoMaNguon.setStrategy(chienLuoc);
// Thiết lập engine template
taoMaNguon.setTemplateEngine(new FreemarkerTemplateEngine());
taoMaNguon.execute();
}
}
Bước 3: Chạy trình tạo mã nguồn
Chạy mã nguồn trên và nhập tên module và tên bảng khi được yêu cầu. Trình tạo sẽ tạo các tệp tương ứng trong thư mục được chỉ định.
Phân tích mối quan hệ ánh xạ
Hiểu cách MyBatis và MyBatis Plus xử lý mối quan hệ giữa lớp thực thể và bảng cơ sở dữ liệu là rất quan trọng. Các framework này hỗ trợ ánh xạ cột trong bảng cơ sở dữ liệu sang thuộc tính của đối tượng Java.
MyBatis - Mối quan hệ ánh xạ
Trong MyBatis, tên bảng và tên cột thường cần được chỉ định rõ ràng trong tệp ánh xạ XML. MyBatis không cung cấp chức năng tự động ánh xạ tên bảng và tên cột sang tên lớp và tên thuộc tính.
Ánh xạ tên bảng và tên cột
- Ánh xạ tên bảng: Tên bảng thường được mã cứng trực tiếp trong câu truy vấn SQL, ví dụ trong tệp
mapper.xml:
<select id="timKhachHang" resultType="com.vi.du.KhachHang">
SELECT * FROM bang_khach_hang WHERE ma = #{ma}
</select>
- Ánh xạ tên cột: Nếu tên thuộc tính của lớp thực thể và tên cột trong cơ sở dữ liệu không khớp, cần sử dụng
<resultMap>để định nghĩa rõ ràng mối quan hệ ánh xạ:
<resultMap id="khachHangKetQua" type="com.vi.du.KhachHang">
<result property="tenDangNhap" column="ten_dang_nhap"/>
<result property="diaChiEmail" column="dia_chi_email"/>
</resultMap>
MyBatis Plus - Mối quan hệ ánh xạ
MyBatis Plus cung cấp chức năng ánh xạ tự động nâng cao, có thể tự động chuyển đổi tên bảng và tên cột sang tên lớp và tên thuộc tính tương ứng.
Chức năng ánh xạ tự động
- @TableName và @TableField: Sử dụng annotation để ánh xạ tự động tên bảng và tên cột.
@TableName("bang_khach_hang")
public class KhachHang {
@TableId(type = IdType.AUTO)
private Long maKhachHang;
@TableField("ten_dang_nhap")
private String tenDangNhap;
@TableField("dia_chi_email")
private String diaChiEmail;
// Getters and Setters
}
- Hỗ trợ đặt tên camelCase tự động: Mặc định, MyBatis Plus tự động chuyển đổi quy ước đặt tên snake_case trong cơ sở dữ liệu sang camelCase trong Java, ví dụ:
ten_dang_nhapsẽ được ánh xạ sang thuộc tínhtenDangNhap.
Sự khác biệt giữa MyBatis và MyBatis Plus
- Cấu hình ánh xạ: MyBatis yêu cầu cấu hình rõ ràng từng câu lệnh SQL và mối quan hệ ánh xạ, trong khi MyBatis Plus cung cấp annotation và ánh xạ thông minh, giảm thiểu công việc cấu hình lặp đi lặp lại.
- Ánh xạ tự động: MyBatis Plus hỗ trợ ánh xạ camelCase và đơn giản hóa công việc cấu hình bằng annotation, trong khi MyBatis không có các chức năng tự động này và cần ánh xạ thủ công từng trường.
- Tiện lợi phát triển: MyBatis Plus cung cấp triển khai CRUD mặc định, cải thiện đáng kể hiệu suất phát triển, phù hợp với ứng dụng kinh doanh nhanh. MyBatis cung cấp nhiều quyền kiểm soát và linh hoạt hơn, phù hợp với các kịch bản tương tác cơ sở dữ liệu phức tạp.
So sánh hành vi mặc định về ánh xạ camelCase
MyBatis và MyBatis-Plus có hành vi mặc định khác nhau khi xử lý ánh xạ thuộc tính và cột cơ sở dữ liệu.
Hành vi mặc định của MyBatis
- Không ánh xạ tự động: MyBatis mặc định không tự động chuyển đổi camelCase sang snake_case. Nếu cột trong cơ sở dữ liệu dùng snake_case và thuộc tính Java dùng camelCase, nhà phát triển thường cần cấu hình thủ công hoặc đặt
mapUnderscoreToCamelCasethànhtruetrong tệp cấu hình MyBatis:
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
Hành vi mặc định của MyBatis-Plus
- Ánh xạ tự động: MyBatis-Plus mặc định hỗ trợ chuyển đổi camelCase sang snake_case. Điều này có nghĩa là trong hầu hết các trường hợp, bạn không cần viết
resultMapđể xử lý ánh xạ thuộc tính cơ bản. Ngoài ra, MyBatis-Plus cung cấp nhiều chức năng tiện lợi như CRUD tự động và xây dựng truy vấn đơn giản hơn, tất cả đều dựa trên nguyên tắc quy ước优于 cấu hình.
Tóm lại, lựa chọn giữa MyBatis và MyBatis-Plus phụ thuộc vào yêu cầu dự án và sở thích của đội phát triển. Nếu dự án có nhiều thao tác cơ sở dữ liệu tiêu chuẩn và muốn giảm thiểu công việc cấu hình, MyBatis-Plus là lựa chọn tốt. Nhưng đối với các kịch bản kinh doanh phức tạp cần kiểm soát SQL chi tiết, MyBatis cung cấp nhiều quyền kiểm soát và linh hoạt hơn.