簡述基于注解的裝配方式的基本用法,@column注解_SpringBoot 注解方式快速整合Mybatis

 2023-10-15 阅读 30 评论 0

摘要:點擊上方“Java研發軍團”,選擇“置頂公眾號”關鍵時刻,第一時間送達!閱讀本文需要5分鐘作者:yizhiwaziwww.jianshu.com/p/828d2bd12b2f簡述基于注解的裝配方式的基本用法。序言:使用MyBatis3提供的注解可以逐步取代XML,例如使用&

點擊上方“Java研發軍團”,選擇“置頂公眾號”

關鍵時刻,第一時間送達!

閱讀本文需要5分鐘

作者:yizhiwazi

www.jianshu.com/p/828d2bd12b2f

簡述基于注解的裝配方式的基本用法。序言:使用MyBatis3提供的注解可以逐步取代XML,例如使用@Select注解直接編寫SQL完成數據查詢,使用@SelectProvider高級注解還可以編寫動態SQL,以應對復雜的業務需求。

一. 基礎注解

MyBatis 主要提供了以下CRUD注解:

  • @Select

  • @Insert

  • @Update

  • @Delete

Springboot核心注解、增刪改查占據了絕大部分的業務操作,掌握這些基礎注解的使用還是很有必要的,例如下面這段代碼無需XML即可完成數據查詢:

@Mapper
public?interface?UserMapper?{
????@Select("select?*?from?t_user")
????List?list();
}

使用過Hibernate的同學可能會好奇,這里為什么沒有配置映射關系也能完成屬性注入?在傳統項目中使用過Mybatis的童鞋可能很快就反應過來,是因為在配置文件中開啟了全局駝峰映射,SpringBoot中同樣能夠做到,并且更為簡單快捷。

雖然開啟了全局駝峰映射,但你可能還會質疑,如果不符合下劃線轉駝峰規則的字段,拿查詢回來的實體對象屬性將獲取為null,比如上述User對象屬性mobileNum和對應的數據庫字段phoneNum,則查詢結果為:

[
??{
????"userId":?"1",
????"username":?"admin",
????"password":?"admin",
????"mobileNum":?null
??},
??{
????"userId":?"2",
????"username":?"roots",
????"password":?"roots",
????"mobileNum":?null
??}
]

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

二. 映射注解

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

  • @Results 用于填寫結果集的多個字段的映射關系.

  • json.parsearray(string?@Result 用于填寫結果集的單個字段的映射關系.

  • @ResultMap 根據ID關聯XML里面

例如上面的list方法,我們可以在查詢SQL的基礎上,指定返回的結果集的映射關系,其中property表示實體對象的屬性名,column表示對應的數據庫字段名。

????@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?list();

查詢結果如下:

[
??{
????"userId":?"1",
????"username":?"admin",
????"password":?"admin",
????"mobileNum":?"15011791234"
??},
??{
????"userId":?"2",
????"username":?"roots",
????"password":?"roots",
????"mobileNum":?"18812342017"
??}
]

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

??/**
?????*?1.用于獲取結果集的映射關系
?????*/
????public?static?String?getResultsStr(Class?origin)?{
????????StringBuilder?stringBuilder?=?new?StringBuilder();
????????stringBuilder.append("@Results({\n");
????????for?(Field?field?:?origin.getDeclaredFields())?{
????????????String?property?=?field.getName();
????????????//映射關系:對象屬性(駝峰)->數據庫字段(下劃線)
????????????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();
????}

在當前Main方法執行效果如下:然后我們將控制臺這段打印信息復制到接口方法上即可。

class)。7f83029878c6a510e8d5bd4b5f3cc26c.png

三. 高級注解

MyBatis-3 主要提供了以下CRUD的高級注解:

  • @SelectProvider

  • @InsertProvider

  • @UpdateProvider

  • @DeleteProvider

innodb_buffer_pool_instances、見名知意,這些高級注解主要用于動態SQL,這里以@SelectProvider 為例,主要包含兩個注解屬性,其中type表示工具類,method 表示工具類的某個方法,用于返回具體的SQL。

@Mapper
public?interface?UserMapper?{
????@SelectProvider(type?=?UserSqlProvider.class,?method?=?"list222")
????List?list2();
}

工具類代碼如下:

public?class?UserSqlProvider?{
????public?String?list222()?{
????????return?"select?*?from?t_user?;
????}

四. 詳細教程

對上述注解有所了解之后,我們以具體項目案例來進一步鞏固這些注解的實際使用。

具體步驟

1. 引入依賴

為了方便演示,首選搭建Web環境,另外數據庫選擇Mysql 5.5+。

????<dependencies>
????????<dependency>?
????????????<groupId>org.springframework.bootgroupId>
????????????<artifactId>spring-boot-starter-webartifactId>
????????dependency>
????????<dependency>?
????????????<groupId>org.mybatis.spring.bootgroupId>
????????????<artifactId>mybatis-spring-boot-starterartifactId>
????????????<version>1.3.1version>
????????dependency>
????????<dependency>
????????????<groupId>mysqlgroupId>
????????????<artifactId>mysql-connector-javaartifactId>
????????????<scope>runtimescope>
????????dependency>
????????<dependency>
????????????<groupId>org.springframework.bootgroupId>
????????????<artifactId>spring-boot-starter-testartifactId>
????????????<scope>testscope>
????????dependency>
????dependencies>

2. 添加配置

這里主要是添加數據源,配置駝峰映射和開啟SQL日志的控制臺打印。在項目的資源目錄中,添加 application.yml 配置如下:

spring:
??datasource:
????#連接MySQL
????url:?jdbc:mysql://localhost:3306/socks?useSSL=false
????username:?root
????password:?root
????driver-class-name:?com.mysql.jdbc.Driver

mybatis:
??configuration:
???#配置項:開啟下劃線到駝峰的自動轉換. 作用:將數據庫字段根據駝峰規則自動注入到對象屬性。
???map-underscore-to-camel-case:?true

logging:
??level:
???#打印SQL信息
???com.hehe.mapper:?debug

3. 編寫數據層代碼

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

MySQL substring?3.1 UserMapper

添加UserMapper接口用于數據查詢:

package?com.hehe.mapper;
@Mapper
public?interface?UserMapper?{
????/**
?????*?方式1:使用注解編寫SQL。
?????*/
????@Select("select?*?from?t_user")
????List?list();/**
?????*?方式2:使用注解指定某個工具類的方法來動態編寫SQL.
?????*/@SelectProvider(type?=?UserSqlProvider.class,?method?=?"listByUsername")
????List?listByUsername(String?username);/**
?????*?延伸:上述兩種方式都可以附加@Results注解來指定結果集的映射關系.
?????*
?????* PS:如果符合下劃線轉駝峰的匹配項可以直接省略不寫。
?????*/@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?listSample();/**
?????*?延伸:無論什么方式,如果涉及多個參數,則必須加上@Param注解,否則無法使用EL表達式獲取參數。
?????*/@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的工具類 。

package?com.hehe.mapper;

/**
?*?主要用途:根據復雜的業務需求來動態生成SQL.
?*?


?*?目標:使用Java工具類來替代傳統的XML文件.(例如:UserSqlProvider.java ?*/


public?class?UserSqlProvider?{
????/**
?????*?方式1:在工具類的方法里,可以自己手工編寫SQL。
?????*/
????public?String?listByUsername(String?username)?{
????????return?"select?*?from?t_user?where?username?=#{username}";
????}

????/**
?????*?方式2:也可以根據官方提供的API來編寫動態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 實體類User

注解和注釋、添加實體類User

public?class?User?{
????private?String?userId;
????private?String?username;
????private?String?password;
????private?String?mobileNum;
????//Getters?&?Setters
}

3.4 添加數據庫記錄

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

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. 編寫控制層代碼

package?com.hehe.controller;

@RestController
@RequestMapping("/user/*")
public?class?UserController?{

????@SuppressWarnings("all")
????@Autowired
????UserMapper?userMapper;

????@GetMapping("list")
????public?List?list()?{return?userMapper.list();
????}@GetMapping("list/{username}")public?List?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. 啟動和測試

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

35f432d2cc64d689d75d4d7523036beb.png

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

常用注解,7c50b8731600195cc65c0c29ccea5a1a.png

五. 源碼和文檔

源碼地址:SpringBoot-MyBatis-Annotation 歡迎各位Star,予以支持 。

https://github.com/yizhiwazi/springboot-socks

官方文檔:Mybatis3-中文手冊

http://www.mybatis.org/mybatis-3/zh/java-api.html

專題閱讀:《SpringBoot 布道系列》

Mybatis框架。https://www.jianshu.com/p/964370d9374e

END

其它優質文章請見后臺公眾號菜單

【191101】Java第一期資源

【191110】Java第二期資源

【191117】Java第三期資源

【191124】Java第四期資源

【191201】Java第五期資源

【191228】Java第六期資源

9319097526c45406cc8581c52c1bd57b.png

13c2a23744707a334d784a71199763ec.png

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/137944.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息