mybatis介紹
攔截器的一個(gè)作用就是我們可以攔截某些方法的調(diào)用,我們可以選擇在這些被攔截的方法執(zhí)行前后加上某些邏輯,也可以在執(zhí)行這些被攔截的方法時(shí)執(zhí)行自己的邏輯而不再執(zhí)行被攔截的方法。
mybatis 是一款優(yōu)秀的持久層框架,它支持定制化 sql、存儲過程以及高級映射。mybatis 避免了幾乎所有的 jdbc 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。mybatis 可以使用簡單的 xml 或注解來配置和映射原生類型、接口和 java 的 pojo(plain old java objects,普通老式 java 對象)為數(shù)據(jù)庫中的記錄。
mybatis架構(gòu)圖
我們這個(gè)demo實(shí)現(xiàn)就是基于mybatis的插件模塊(主要實(shí)現(xiàn)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實(shí)現(xiàn)
主要技術(shù) 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> |
數(shù)據(jù)庫 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( "進(jìn)入攔截器" ); object[] args = invocation.getargs(); mappedstatement mappedstatement = (mappedstatement) args[ 0 ]; //獲取參數(shù) object param = invocation.getargs()[ 1 ]; boundsql boundsql = mappedstatement.getboundsql(param); object parameterobject = boundsql.getparameterobject(); /** * 判斷是否是繼承pagevo來判斷是否需要進(jìn)行分頁 */ if (parameterobject instanceof pagevo) { //強(qiáng)轉(zhuǎn) 為了拿到分頁數(shù)據(jù) pagevo pagevo = (pagevo) param; string sql = boundsql.getsql(); //獲取相關(guān)配置 configuration config = mappedstatement.getconfiguration(); connection connection = config.getenvironment().getdatasource().getconnection(); //拼接查詢當(dāng)前條件的sql的總條數(shù) 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); //執(zhí)行獲得總條數(shù) resultset rs = preparedstatement.executequery(); int count = 0 ; if (rs.next()) { count = rs.getint( 1 ); } //拼接分頁sql string pagesql = sql + " limit " + pagevo.getlimit() + " , " + pagevo.getoffset(); //重新執(zhí)行新的sql donewsql(invocation, pagesql); object result = invocation.proceed(); connection.close(); //處理新的結(jié)構(gòu) 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(); } |
測試結(jié)果
github地址:https://github.com/xinyanjiang/mybaits-plugs
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對服務(wù)器之家的支持。