????????本文是MyBatis注解開發的基礎篇,將通過實際場景,詳細介紹MyBatis注解式開發的使用,這是MyBatis很強大的一個特性,可以直接在接口方法上定義 SQL 語句,從而實現數據庫的增刪改查操作。
本文目錄
- 一、環境依賴
- 二、創建對應實體類
- 三、映射接口
- 四、復雜查詢與動態SQL
一、環境依賴
在開發之前,需要確保環境pom.xml
中添加了MyBatis相關依賴。
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>
同時,需要在 application.properties
中配置數據庫連接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/shop
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
二、創建對應實體類
使用Mybatis操作數據庫,是要創建數據表對應的實體類的,這也是其優點之一。
package com.example.ecommerce.entity;public class Product {private Long id;private String name;private double price;private int stock;public Product() {}public Product(String name, double price, int stock) {this.name = name;this.price = price;this.stock = stock;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getStock() {return stock;}public void setStock(int stock) {this.stock = stock;}@Overridepublic String toString() {return "Product{" +"id=" + id +", name='" + name + '\'' +", price=" + price +", stock=" + stock +'}';}
}
三、映射接口
創建一個映射接口,使用MyBatis注解來定義對應的增刪改查操作的SQL語句即可,這樣可以避免我們還要寫對應xml文件,同時也可以避免出現文件掃描不到的問題。
需要使用到如下注解:
@Mapper
:用于標記該接口為MyBatis的映射接口,讓Spring能夠自動掃描并注冊。
以下幾個注解,可以直接在接口方法上定義 SQL 語句,從而實現數據庫的增刪改查操作:
@Insert
:用于定義插入操作的SQL語句。@Options
注解用于指定是否使用自動生成的主鍵,并指定主鍵屬性。@Select
:用于定義查詢操作的SQL語句。@Results
:用于手動指定結果集的映射關系。@Result
注解用于指定實體類屬性和數據庫表列的對應關系,定義之后,會將查詢字段賦值到對應的類字段上。@Update
:用于定義更新操作的 SQL 語句。@Delete
:用于定義刪除操作的 SQL 語句。
package com.example.ecommerce.mapper;import com.example.ecommerce.entity.Product;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface ProductMapper {// 新增商品@Insert("INSERT INTO product (name, price, stock) VALUES (#{name}, #{price}, #{stock})")@Options(useGeneratedKeys = true, keyProperty = "id")int insertProduct(Product product);// 根據ID查詢商品@Select("SELECT * FROM product WHERE id = #{id}")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "price", column = "price"),@Result(property = "stock", column = "stock")})Product selectProductById(Long id);// 查詢所有商品@Select("SELECT * FROM product")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "price", column = "price"),@Result(property = "stock", column = "stock")})List<Product> selectAllProducts();// 更新商品信息@Update("UPDATE product SET name = #{name}, price = #{price}, stock = #{stock} WHERE id = #{id}")int updateProduct(Product product);// 根據ID刪除商品@Delete("DELETE FROM product WHERE id = #{id}")int deleteProductById(Long id);
}
如上,定義完成之后,就可以直接在對應的Service中調用了。
四、復雜查詢與動態SQL
上面的是比較基礎的增刪改查,當我們有復雜的動態SQL可以使用如下幾個注解@SelectProvider、@InsertProvider、@UpdateProvider 和 @DeleteProvider 來動態生成SQL語句。
使用 @SelectProvider
進行動態查詢示例:
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import java.util.List;@Mapper
public interface ProductMapper {@SelectProvider(type = ProductSqlProvider.class, method = "selectProductsByCondition")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "price", column = "price"),@Result(property = "stock", column = "stock")})List<Product> selectProductsByCondition(@Param("name") String name, @Param("minPrice") Double minPrice, @Param("maxPrice") Double maxPrice);
}class ProductSqlProvider {public String selectProductsByCondition(String name, Double minPrice, Double maxPrice) {StringBuilder sql = new StringBuilder("SELECT * FROM product WHERE 1 = 1");if (name != null && !name.isEmpty()) {sql.append(" AND name LIKE CONCAT('%', #{name}, '%')");}if (minPrice != null) {sql.append(" AND price >= #{minPrice}");}if (maxPrice != null) {sql.append(" AND price <= #{maxPrice}");}return sql.toString();}
}
← 上一篇 Java進階——常用類及常用方法詳解 | 記得點贊、關注、收藏哦! | 下一篇 Java進階——數組超詳細整理 → |