mybatis介紹
攔截器的一個作用就是我們可以攔截某些方法的調用,我們可以選擇在這些被攔截的方法執行前后加上某些邏輯,也可以在執行這些被攔截的方法時執行自己的邏輯而不再執行被攔截的方法。
mybatis 是一款優秀的持久層框架,它支持定制化 sql、存儲過程以及高級映射。mybatis 避免了幾乎所有的 jdbc 代碼和手動設置參數以及獲取結果集。mybatis 可以使用簡單的 xml 或注解來配置和映射原生類型、接口和 java 的 pojo(plain old java objects,普通老式 java 對象)為數據庫中的記錄。
mybatis架構圖
我們這個demo實現就是基于mybatis的插件模塊(主要實現mybatis的interceptor接口)
interceptor接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package org.apache.ibatis.plugin; import java.util.properties; /** * @author clinton begin */ public interface interceptor { object intercept(invocation invocation) throws throwable; object plugin(object target); void setproperties(properties properties); } |
demo實現
主要技術 spring boot + mybatis
pom.xml
1
2
3
4
5
6
7
8
9
10
|
<dependency> <groupid>org.mybatis.spring.boot</groupid> <artifactid>mybatis-spring-boot-starter</artifactid> <version> 1.3 . 2 </version> </dependency> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <scope>runtime</scope> </dependency> |
數據庫 ddl
1
2
3
4
5
|
create table user ( id int auto_increment primary key, username varchar( 20 ) null ); |
核心代碼
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
@override public object intercept(invocation invocation) throws throwable { logger.info( "進入攔截器" ); object[] args = invocation.getargs(); mappedstatement mappedstatement = (mappedstatement) args[ 0 ]; //獲取參數 object param = invocation.getargs()[ 1 ]; boundsql boundsql = mappedstatement.getboundsql(param); object parameterobject = boundsql.getparameterobject(); /** * 判斷是否是繼承pagevo來判斷是否需要進行分頁 */ if (parameterobject instanceof pagevo) { //強轉 為了拿到分頁數據 pagevo pagevo = (pagevo) param; string sql = boundsql.getsql(); //獲取相關配置 configuration config = mappedstatement.getconfiguration(); connection connection = config.getenvironment().getdatasource().getconnection(); //拼接查詢當前條件的sql的總條數 string countsql = "select count(*) from (" + sql + ") a" ; preparedstatement preparedstatement = connection.preparestatement(countsql); boundsql countboundsql = new boundsql(config, countsql, boundsql.getparametermappings(), boundsql.getparameterobject()); parameterhandler parameterhandler = new defaultparameterhandler(mappedstatement, parameterobject, countboundsql); parameterhandler.setparameters(preparedstatement); //執行獲得總條數 resultset rs = preparedstatement.executequery(); int count = 0 ; if (rs.next()) { count = rs.getint( 1 ); } //拼接分頁sql string pagesql = sql + " limit " + pagevo.getlimit() + " , " + pagevo.getoffset(); //重新執行新的sql donewsql(invocation, pagesql); object result = invocation.proceed(); connection.close(); //處理新的結構 pageresult<?> pageresult = new pageresult<list>(pagevo.page, pagevo.rows, count, (list) result); list<pageresult> returnresultlist = new arraylist<>(); returnresultlist.add(pageresult); return returnresultlist; } return invocation.proceed(); } |
測試結果
github地址:https://github.com/xinyanjiang/mybaits-plugs
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。