国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

2021-01-30 12:02yizhiwazi Java教程

本篇文章主要介紹了詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

序言:使用mybatis3提供的注解可以逐步取代xml,例如使用@select注解直接編寫sql完成數(shù)據(jù)查詢,使用@selectprovider高級(jí)注解還可以編寫動(dòng)態(tài)sql,以應(yīng)對(duì)復(fù)雜的業(yè)務(wù)需求。

一. 基礎(chǔ)注解

mybatis 主要提供了以下crud注解:

  1. @select
  2. @insert
  3. @update
  4. @delete

增刪改查占據(jù)了絕大部分的業(yè)務(wù)操作,掌握這些基礎(chǔ)注解的使用是很必要的。例如下面這段代碼無需xml即可完成數(shù)據(jù)查詢:

?
1
2
3
4
5
@mapper
public interface usermapper {
 @select("select * from t_user")
 list<user> list();
}

使用過hibernate的同學(xué)可能會(huì)好奇,這里為什么沒有配置映射關(guān)系也能完成屬性注入?在傳統(tǒng)項(xiàng)目使用過mybatis的童鞋可能很會(huì)就能反應(yīng)過來,是因?yàn)樵谂渲梦募虚_啟了全局駝峰映射,springboot中同樣能夠做到,并且更為簡單快捷。

雖然開啟了全局駝峰映射,但你可能還會(huì)質(zhì)疑,如果不符合下劃線轉(zhuǎn)駝峰規(guī)則的字段,拿查詢回來的實(shí)體對(duì)象屬性將獲取為null,比如上述user對(duì)象屬性mobilenum和對(duì)應(yīng)的數(shù)據(jù)庫字段phonenum,則查詢結(jié)果為:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
 {
 "userid": "1",
 "username": "admin",
 "password": "admin",
 "mobilenum": null
 },
 {
 "userid": "2",
 "username": "roots",
 "password": "roots",
 "mobilenum": null
 }
]

為了解決對(duì)象屬性和字段駝峰不一致的問題,我們可以使用映射注解@results來指定映射關(guān)系。

二. 映射注解

mybatis主要提供這些映射注解:

  1. @results 用于填寫結(jié)果集的多個(gè)字段的映射關(guān)系.
  2. @result 用于填寫結(jié)果集的單個(gè)字段的映射關(guān)系.
  3. @resultmap 根據(jù)id關(guān)聯(lián)xml里面<resultmap>.

例如上面的list方法,我們可以在查詢sql的基礎(chǔ)上,指定返回的結(jié)果集的映射關(guān)系,其中property表示實(shí)體對(duì)象的屬性名,column表示對(duì)應(yīng)的數(shù)據(jù)庫字段名。

?
1
2
3
4
5
6
7
8
@results({
  @result(property = "userid", column = "user_id"),
  @result(property = "username", column = "username"),
  @result(property = "password", column = "password"),
  @result(property = "mobilenum", column = "phone_num")
})
@select("select * from t_user")
list<user> list();

查詢結(jié)果如下,:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
 {
 "userid": "1",
 "username": "admin",
 "password": "admin",
 "mobilenum": "15011791234"
 },
 {
 "userid": "2",
 "username": "roots",
 "password": "roots",
 "mobilenum": "18812342017"
 }
]

為了方便演示和免除手工編寫映射關(guān)系的煩惱,這里提供了一個(gè)快速生成映射結(jié)果集的方法,具體內(nèi)容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 1.用于獲取結(jié)果集的映射關(guān)系
 */
public static string getresultsstr(class origin) {
 stringbuilder stringbuilder = new stringbuilder();
 stringbuilder.append("@results({\n");
 for (field field : origin.getdeclaredfields()) {
  string property = field.getname();
  //映射關(guān)系:對(duì)象屬性(駝峰)->數(shù)據(jù)庫字段(下劃線)
  string column = new propertynamingstrategy.snakecasestrategy().translate(field.getname()).touppercase();
  stringbuilder.append(string.format("@result(property = \"%s\", column = \"%s\"),\n", property, column));
 }
 stringbuilder.append("})");
 return stringbuilder.tostring();
}

在當(dāng)前main方法執(zhí)行效果如下:然后我們將控制臺(tái)這段打印信息復(fù)制到接口方法上即可。

詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

三. 高級(jí)注解

mybatis-3 主要提供了以下crud的高級(jí)注解:

  1. @selectprovider
  2. @insertprovider
  3. @updateprovider
  4. @deleteprovider

見名知意,這些高級(jí)注解主要用于動(dòng)態(tài)sql,這里以@selectprovider 為例,主要包含兩個(gè)注解屬性,其中type表示工具類,method 表示工具類的某個(gè)方法,用于返回具體的sql。

?
1
2
3
4
5
6
7
8
9
10
11
@mapper
public interface usermapper {
 @selectprovider(type = usersqlprovider.class, method = "list222")
 list<user> list2();
}
工具類代碼如下:
 
public class usersqlprovider {
 public string list222() {
  return "select * from t_user ;
 }

四. 詳細(xì)教程

對(duì)上述注解有所了解之后,我們以具體項(xiàng)目案例來進(jìn)一步鞏固這些注解的實(shí)際使用。
具體步驟

1. 引入依賴

為了方便演示,首選搭建web環(huán)境,另外數(shù)據(jù)庫選擇mysql 5.5+。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependencies>
 <dependency> <!--添加web依賴 -->
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-web</artifactid>
 </dependency>
 <dependency> <!--添加mybatis依賴 -->
  <groupid>org.mybatis.spring.boot</groupid>
  <artifactid>mybatis-spring-boot-starter</artifactid>
  <version>1.3.1</version>
 </dependency>
 <dependency><!--添加mysql驅(qū)動(dòng)依賴 -->
  <groupid>mysql</groupid>
  <artifactid>mysql-connector-java</artifactid>
  <scope>runtime</scope>
 </dependency>
 <dependency><!--添加test依賴 -->
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-test</artifactid>
  <scope>test</scope>
 </dependency>
</dependencies>

2. 添加配置

這里主要是添加數(shù)據(jù)源,配置駝峰映射和開啟sql日志的控制臺(tái)打印。在項(xiàng)目的資源目錄中,添加 application.yml 配置如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring:
 datasource:
 #連接mysql
 url: jdbc:mysql://localhost:3306/socks?usessl=false
 username: root
 password: root
 driver-class-name: com.mysql.jdbc.driver
 
mybatis:
 configuration:
 #配置項(xiàng):開啟下劃線到駝峰的自動(dòng)轉(zhuǎn)換. 作用:將數(shù)據(jù)庫字段根據(jù)駝峰規(guī)則自動(dòng)注入到對(duì)象屬性。
 map-underscore-to-camel-case: true
 
logging:
 level:
 #打印sql信息
 com.hehe.mapper: debug

3. 編寫數(shù)據(jù)層代碼

這里以我們熟悉的用戶信息為例,編寫usermapper接口和本案例使用的usersqlprovider。

3.1 usermapper

添加usermapper接口用于數(shù)據(jù)查詢:

?
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
package com.hehe.mapper;
@mapper
public interface usermapper {
 /**
  * 方式1:使用注解編寫sql。
  */
 @select("select * from t_user")
 list<user> list();
 
 /**
  * 方式2:使用注解指定某個(gè)工具類的方法來動(dòng)態(tài)編寫sql.
  */
 @selectprovider(type = usersqlprovider.class, method = "listbyusername")
 list<user> listbyusername(string username);
 
 /**
  * 延伸:上述兩種方式都可以附加@results注解來指定結(jié)果集的映射關(guān)系.
  *
  * ps:如果符合下劃線轉(zhuǎn)駝峰的匹配項(xiàng)可以直接省略不寫。
  */
 @results({
   @result(property = "userid", column = "user_id"),
   @result(property = "username", column = "username"),
   @result(property = "password", column = "password"),
   @result(property = "mobilenum", column = "phone_num")
 })
 @select("select * from t_user")
 list<user> listsample();
 
 /**
  * 延伸:無論什么方式,如果涉及多個(gè)參數(shù),則必須加上@param注解,否則無法使用el表達(dá)式獲取參數(shù)。
  */
 @select("select * from t_user where username like #{username} and password like #{password}")
 user get(@param("username") string username, @param("password") string password);
 
 @selectprovider(type = usersqlprovider.class, method = "getbaduser")
 user getbaduser(@param("username") string username, @param("password") string password);
 
}

3.2 usersqlprovider

添加usersqlprovider,用于生成sql的工具類 。

?
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
package com.hehe.mapper;
 
/**
 * 主要用途:根據(jù)復(fù)雜的業(yè)務(wù)需求來動(dòng)態(tài)生成sql.
 * <p>
 * 目標(biāo):使用java工具類來替代傳統(tǒng)的xml文件.(例如:usersqlprovider.java <-- usermapper.xml)
 */
public class usersqlprovider {
 /**
  * 方式1:在工具類的方法里,可以自己手工編寫sql。
  */
 public string listbyusername(string username) {
  return "select * from t_user where username =#{username}";
 }
 
 /**
  * 方式2:也可以根據(jù)官方提供的api來編寫動(dòng)態(tài)sql。
  */
 public string getbaduser(@param("username") string username, @param("password") string password) {
  return new sql() {{
   select("*");
   from("t_user");
   if (username != null && password != null) {
    where("username like #{username} and password like #{password}");
   } else {
    where("1=2");
   }
  }}.tostring();
 }
}

3.3 實(shí)體類user

添加實(shí)體類user

?
1
2
3
4
5
6
7
public class user {
 private string userid;
 private string username;
 private string password;
 private string mobilenum;
 //getters & setters
}

3.4 添加數(shù)據(jù)庫記錄

打開navicat 查詢窗口,然后只需下面這段腳本。

?
1
2
3
4
5
6
7
8
9
10
11
use `socks`;
drop table if exists `t_user`;
create table `t_user` (
 `user_id` varchar(50) ,
 `username` varchar(50) ,
 `password` varchar(50) ,
 `phone_num` varchar(15)
) ;
 
insert into `t_user` values ('1', 'admin', 'admin','15011791234');
insert into `t_user` values ('2', 'roots', 'roots','18812342017');

4. 編寫控制層代碼

?
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
package com.hehe.controller;
 
@restcontroller
@requestmapping("/user/*")
public class usercontroller {
 
 @suppresswarnings("all")
 @autowired
 usermapper usermapper;
 
 @getmapping("list")
 public list<user> list() {
  return usermapper.list();
 }
 
 @getmapping("list/{username}")
 public list<user> listbyusername(@pathvariable("username") string username) {
  return usermapper.listbyusername(username);
 }
 
 @getmapping("get/{username}/{password}")
 public user get(@pathvariable("username") string username, @pathvariable("password") string password) {
  return usermapper.get(username, password);
 }
 
 @getmapping("get/bad/{username}/{password}")
 public user getbaduser(@pathvariable("username") string username, @pathvariable("password") string password) {
  return usermapper.getbaduser(username, password);
 }
 
}

5. 啟動(dòng)和測試

啟動(dòng)工程后,訪問 http://localhost:8080/user/list 可以查看用戶列表如下:

詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

訪問 http://localhost:8080/user/list/admin 可以查詢用戶名為admin的信息:

詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

五. 文檔

官方文檔:mybatis3-中文手冊(cè)

關(guān)于mybatis注解的使用:

優(yōu)點(diǎn):無需xml,使用輕量級(jí)注解就可以編寫sql并返回查詢結(jié)果,功能強(qiáng)大且方便。

缺點(diǎn):mybatis使用注解最大的缺點(diǎn)是無法實(shí)現(xiàn)實(shí)體屬性和數(shù)據(jù)庫字段的映射關(guān)系,如果不滿足駝峰的話,每個(gè)查詢都要使用@results,會(huì)造成一定代碼冗余,官方承認(rèn)把這個(gè)重大缺陷甩給了java注解的限制,為了解決這個(gè)問題,接下來我們學(xué)習(xí)如何在項(xiàng)目中快速引入通用mapper,讓mapper接口通過泛型繼承就能獲取基于單個(gè)對(duì)象的增刪改查!!

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.jianshu.com/p/828d2bd12b2f

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲男人的天堂视频 | 国产精品美女久久久av超清 | 日韩成人影院 | 欧美日韩精品免费 | 久久亚洲精品中文字幕 | 久久精品国产亚洲一区二区三区 | 久久久久久久久久影院 | 欧美一区日韩一区 | 中文字幕三区 | 黄色小视频国产 | 欧美黄色小视频 | 国产免费黄色 | 日本少妇bbbb爽爽bbb美 | 99久久久 | 欧美日韩在线免费观看 | 成人欧美一区二区三区视频xxx | 国产99久久精品 | 久久一区 | 午夜免费 | 中文字幕国产日韩 | 不卡二区| 北条麻妃在线一区二区免费播放 | 久久久久久久久久久久一区二区 | 精品一区二区久久久久久久网站 | 欧美成人精品一区二区 | 青青久视频 | 国产伦精品一区二区三区照片91 | 视频一区二区三区中文字幕 | 欧美黄色www| 一级久久久 | 亚洲精品免费在线 | 国产精品午夜电影 | 在线一级片| 国产精品成人在线 | 午夜私人影院在线观看 | 国产精品久久久久久久久久免费看 | 黄色国产免费看 | 国产精品久久久久久久久久99 | 午夜久久久 | 久一在线 | 一级黄片毛片免费看 |