點擊上方“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)。
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?;
????}
對上述注解有所了解之后,我們以具體項目案例來進一步鞏固這些注解的實際使用。
為了方便演示,首選搭建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>
這里主要是添加數據源,配置駝峰映射和開啟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
這里以我們熟悉的用戶信息為例,編寫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');
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);
????}
}
啟動工程后,訪問 http://localhost:8080/user/list 可以查看用戶列表如下:
訪問 http://localhost:8080/user/list/admin 可以查詢用戶名為admin的信息:
常用注解,
源碼地址: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第六期資源
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态