CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN Mybaits này triển khai mã lệnh in câu lệnh SQL do tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.
Bản thân Mybatis không cung cấp việc triển khai nhật ký nhưng các thành phần của bên thứ ba được giới thiệu. Mybatis hỗ trợ nhiều plug-in nhật ký của bên thứ ba. Mức độ ưu tiên từ thấp đến cao là slf4J, commonsLoging, Log4J2, Log4J và JdkLog.
Có một LogFactory trong mybatis, lấy lớp nhật ký xuất xưởng. Bạn có thể quay lại quá trình triển khai nhật ký tương ứng trong lớp kỹ thuật. Phân tích lớp kỹ thuật, bạn có thể tìm hiểu cách mybatis chọn nhật ký.
?
1
2
3
4
5
6
7
|
công cộng
tĩnh
Nhật ký getLog(String logger) {
thử
{
trở lại
logConstructor.newInstance(logger);
}
nắm lấy
(Có thể ném t) {
ném
mới
Ngoại lệ Nhật ký(
"Lỗi khi tạo logger cho logger"
+ người ghi nhật ký +
". Gây ra: "
+ t, t);
}
}
|
Quá trình tải logConstructor như sau.
?
1
2
3
4
5
6
7
8
|
tĩnh
{
thửImplementation(LogFactory::useSlf4jLogging);
thửImplementation(LogFactory::useCommonsLogging);
thửImplementation(LogFactory::useLog4J2Logging);
thửImplementation(LogFactory::useLog4JLogging);
thửImplementation(LogFactory::useJdkLogging);
thửImplementation(LogFactory::useNoLogging);
}
|
?
1
2
3
4
5
6
7
8
9
|
riêng tư
tĩnh
vô hiệu
tryImplementation(Có thể chạy được có thể chạy được) {
nếu như
(logConstructor ==
vô giá trị
) {
thử
{
runnable. chạy();
}
nắm lấy
(Có thể ném t) {
}
}
}
|
Trong tryImplementation, loại nhật ký được mybatis sử dụng sẽ được đặt. Sau khi thiết lập nhật ký được tham chiếu cho logConstructor, các loại nhật ký khác sẽ không được tải sau này. Do đó, mức độ ưu tiên trong mybatis từ thấp đến cao là slf4J, commonsLoging, Log4J2, Log4J và JdkLog. Có vẻ như đây cũng là một phương pháp triển khai SPI. Sự khác biệt là nhiều loại nhật ký của bên thứ ba không thể tạo thành một giao diện thống nhất. Vì vậy, để giải quyết vấn đề này, mybatis sử dụng chế độ bộ chuyển đổi.
Việc triển khai bộ điều hợp thường cho phép bộ điều hợp triển khai hoặc kế thừa mục tiêu và lưu giữ một tham chiếu nội bộ đến bộ điều hợp. Việc gọi phương thức đối tượng đích theo cách này thực ra gọi phương thức của bộ chuyển đổi.
Mybatis sử dụng nhật ký này như thế nào? Theo thói quen của mybatis, nên sử dụng chế độ proxy để in nhật ký này. Ví dụ: xem câu lệnh truy vấn và tìm câu lệnh truy vấn cuối cùng dựa trên MapperProxy.
?
1
2
3
4
5
6
7
8
9
10
11
|
công cộng
Danh sách doQuery(MappedStatement ms, Tham số đối tượng, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)
ném
Ngoại lệ SQL {
Câu lệnh stmt =
vô giá trị
;
thử
{
Cấu hình cấu hình = ms.getConfiguration();
Trình xử lý StatementHandler = configuration.newStatementHandler(wrapper, ms, tham số, rowBounds, resultHandler, boundSql);
stmt = prepareStatement(trình xử lý, ms.getStatementLog());
trở lại
handler.query(stmt, resultHandler);
}
Cuối cùng
{
đóng câu lệnh(stmt);
}
}
|
?
1
2
3
4
5
6
7
|
riêng tư
Câu lệnh prepareStatement(StatementHandler handler, Log statementLog)
ném
Ngoại lệ SQL {
Tuyên bố stmt;
Kết nối kết nối = getConnection(statementLog);
stmt = handler.prepare(kết nối, giao dịch.getTimeout());
handler.parameterize(stmt);
trở lại
stmt;
}
|
?
1
2
3
4
5
6
7
8
|
được bảo vệ
Kết nối getConnection(Log statementLog)
ném
Ngoại lệ SQL {
Kết nối kết nối = transaction.getConnection();
nếu như
(statementLog.isDebugEnabled()) {
trở lại
ConnectionLogger.newInstance(kết nối, statementLog, queryStack);
}
khác
{
trở lại
sự liên quan;
}
}
|
Ở đây bạn có thể thấy rằng khi mybatis có được kết nối, nó sẽ xác định xem có tạo lớp proxy hay không dựa trên mức độ in của nhật ký. Tại thời điểm này, về cơ bản bạn có thể đoán rằng trong lớp proxy, mybatis sẽ in câu lệnh SQL.
?
1
2
3
4
5
|
công cộng
tĩnh
Kết nối newInstance(Kết nối conn, Câu lệnh nhật kýLog,
số nguyên
truy vấnStack) {
Trình xử lý InvocationHandler =
mới
ConnectionLogger(conn, statementLog, queryStack);
ClassLoader cl = Kết nối.
lớp học
.getClassLoader();
trở lại
(Kết nối) Proxy.newProxyInstance(cl,
mới
Lớp[]{Kết nối.
lớp học
}, trình xử lý);
}
|
Sử dụng ConnectionLogger làm ví dụ và xem phương thức gọi bên trong.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
công cộng
Đối tượng invoke(Proxy đối tượng, Phương thức phương pháp, Đối tượng[] params)
ném
Có thể ném {
thử
{
nếu như
(Sự vật.
lớp học
.equals(phương thức.getDeclaringClass())) {
trở lại
phương pháp.invoke(
cái này
, tham số);
}
nếu như
(
"chuẩn bị câu lệnh"
.equals(phương thức.getName())) {
nếu như
(isDebugEnabled()) {
gỡ lỗi(
" Chuẩn bị: "
+ removeBreakingWhitespace((Chuỗi) tham số[
0
]),
ĐÚNG VẬY
);
}
PreparedStatement stmt = (PreparedStatement) phương thức.invoke(kết nối, tham số);
stmt = PreparedStatementLogger.newInstance(stmt, statementLog, queryStack);
trở lại
stmt;
}
khác
nếu như
(
"chuẩn bịGọi"
.equals(phương thức.getName())) {
nếu như
(isDebugEnabled()) {
gỡ lỗi(
" Chuẩn bị: "
+ removeBreakingWhitespace((Chuỗi) tham số[
0
]),
ĐÚNG VẬY
);
}
PreparedStatement stmt = (PreparedStatement) phương thức.invoke(kết nối, tham số);
stmt = PreparedStatementLogger.newInstance(stmt, statementLog, queryStack);
trở lại
stmt;
}
khác
nếu như
(
"createStatement"
.equals(phương thức.getName())) {
Câu lệnh stmt = (Câu lệnh) method.invoke(connection, params);
stmt = StatementLogger.newInstance(stmt, statementLog, queryStack);
trở lại
stmt;
}
khác
{
trở lại
method.invoke(kết nối, tham số);
}
}
nắm lấy
(Có thể ném t) {
ném
ExceptionUtil.unwrapThrowable(t);
}
}
|
Như bạn có thể thấy, mybatis cũng có thể tạo các lớp proxy cho các tình huống cụ thể. Lớp proxy lại được ủy quyền, đây cũng là phương pháp lập trình mà mybatis thích. Ví dụ: các plugin cũng được lớp proxy ủy quyền lại để đạt được nhiều plugin song song.
Đến đây là kết thúc bài viết về code để Mybaits in câu lệnh sql. Để biết thêm thông tin về Mybaits in câu lệnh sql, vui lòng tìm kiếm các bài viết trước của tôi hoặc tiếp tục duyệt qua các bài viết liên quan bên dưới, mong các bạn sẽ ủng hộ tôi trong thời gian tới! .
Liên kết gốc: https://juejin.im/post/5f0dbfed6fb9a07ec07b4888.
Cuối cùng, bài viết này về mã để Mybaits triển khai in câu lệnh sql kết thúc tại đây. Nếu bạn muốn biết thêm về mã để Mybaits triển khai in câu lệnh sql, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. ủng hộ tôi trong tương lai blog của tôi! .
Tôi là một lập trình viên xuất sắc, rất giỏi!