mybatis 之 tk.mybatis讓操作mybatis單表增刪改查更容易


mybatis  之 tk.mybatis讓操作mybatis單表增刪改查更容易

 

官網: https://gitee.com/free/Mapper/wikis/Home

https://mybatis.io/

大家日常mybatis開發的時候,有沒有發現好多操作基本都差不多,比如通過id進行select、update、delete等等操作,雖然差不多,但是xml文件和mapper接口中也得寫這一堆一模一樣的代碼。那我們有什么工具可以幫我完成這些重復性的代碼工作呢?別着急下面就來給大家一一詳解

1.基本步驟

  • 1. 引入TkMybatis的Maven依賴
  • 2. 實體類的相關配置,@Id,@Table
  • 3. Mapper繼承tkMabatis的Mapper接口
  • 4. 啟動類Application或自定義Mybatis配置類上使用@MapperScan注解掃描Mapper接口
  • 5. 在application.properties配置文件中,配置mapper.xml文件指定的位置[可選]
  • 6. 如有需要,實現mapper.xml自定義sql語句
  • PS :
  • 1. TkMybatis默認使用繼承Mapper接口中傳入的實體類對象去數據庫尋找對應的表,因此如果表名與實體類名不滿足對應規則時,會報錯,這時使用@Table為實體類指定表。(這種對應規則為駝峰命名規則)
  • 2. 使用TkMybatis可以無xml文件實現數據庫操作,只需要繼承tkMybatis的Mapper接口即可。
  • 3. 如果有自定義特殊的需求,可以添加mapper.xml進行自定義sql書寫,但路徑必須與步驟4對應。

2.Java 實體類

考慮到基本數據類型在Java 類中都有默認值,會導致MyBatis 在執行相關操作時很難判斷當前字段是否為null,所以在MyBatis 環境下使用Java 實體類時盡量不
要使用基本數據類型,都使用對應的包裝類型。

TkMybatis默認使用繼承Mapper接口中傳入的實體類對象去數據庫尋找對應的表,因此如果表名與實體類名不滿足對應規則時,會報錯,這時使用@Table為實體類指定表。(這種對應規則為駝峰命名規則)
下面以一個實體類Custoemr為例:
// @Table指定該實體類對應的表名,如表名為base_customer,類名為BaseCustomer可以不需要此注解
@Table(name = "t_base_customer")
public class Customer {

    // @Id表示該字段對應數據庫表的主鍵id
    // @GeneratedValue中strategy表示使用數據庫自帶的主鍵生成策略.
    // @GeneratedValue中generator配置為"JDBC",在數據插入完畢之后,會自動將主鍵id填充到實體類中.類似普通mapper.xml中配置的selectKey標簽
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY,generator = "JDBC")
    private Long id;

    private String name;

    private String code;

    private String status;

    private Date createDate;

    private Date lastUpdate;
}

 

3、pom文件中加入tk.mybatis依賴

<!--tk.mybatis依賴-->
 <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.0.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.3</version>
        </dependency>

 

4、Mapper繼承tkMabatis的Mapper接口

import tk.mybatis.mapper.common.Mapper; public interface CustomerMapper extends Mapper<Customer> { }

 

5.啟動類Application或自定義Mybatis配置類上使用@MapperScan注解掃描Mapper接口

@MapperScan("cn.base.mapper") public class MiddlewareApplication extends SpringBootServletInitializer { }

 

6.application.properties配置mapper.xml配置文件的掃描路徑

mybatis.mapperLocations=classpath*:cn/base/mapper/*.xml

 

7.常用注解

@Table 注解

  • 作用:建立實體類和數據庫表之間的對應關系。
  • 默認規則:實體類類名首字母小寫作為表名。Employee 類→employee 表。
  • 用法:在@Table 注解的name 屬性中指定目標數據庫表的表名

@Column 注解

  • 作用:建立實體類字段和數據庫表字段之間的對應關系。
  • 默認規則:
  • 實體類字段:駝峰式命名
  • 數據庫表字段:使用“_”區分各個單詞
  • 用法:在@Column 注解的name 屬性中指定目標字段的字段名

@Id 注解

  • 通用Mapper 在執行xxxByPrimaryKey(key)方法時,有兩種情況。
  • 情況1:沒有使用@Id 注解明確指定主鍵字段
  • 之所以會生成上面這樣的WHERE 子句是因為通用Mapper 將實體類中的所有
  • 字段都拿來放在一起作為聯合主鍵。
  • 情況2:使用@Id 主鍵明確標記和數據庫表中主鍵字段對應的實體類字段。
SELECT emp_id,emp_name,emp_salary_apple,emp_age FROM tabple_emp WHERE emp_id = ? AND emp_name = ? AND emp_salary_apple = ? AND emp_age = ?

@GeneratedValue 注解

  • 作用:讓通用Mapper 在執行insert 操作之后將數據庫自動生成的主鍵值回寫到實體類對象中。

@Transient 

  • 用於標記不與數據庫表字段對應的實體類字段。
@Transient private String otherThings; //非數據庫表中字段

 

8.常用方法

1.selectOne 方法
通用Mapper 替我們自動生成的SQL 語句情況
實體類封裝查詢條件生成WHERE 子句的規則
使用非空的值生成WHERE 子句
在條件表達式中使用“=”進行比較
要求必須返回一個實體類結果,如果有多個,則會拋出異常

2.xxxByPrimaryKey 方法
需要使用@Id 主鍵明確標記和數據庫表主鍵字段對應的實體類字段,否則通用
Mapper 會將所有實體類字段作為聯合主鍵。

3.xxxSelective 方法
非主鍵字段如果為null 值,則不加入到SQL 語句中。

4.QBC 查詢
Query By Criteria
Criteria 是Criterion 的復數形式。意思是:規則、標准、准則。在SQL 語句中相當
於查詢條件。
QBC 查詢是將查詢條件通過Java 對象進行模塊化封裝。

5.  示例代碼:

//目標:WHERE (emp_salary>? AND emp_age<?) OR (emp_salary<? AND emp_age>?) //1.創建Example 對象
Example example = new Example(Employee.class); //*********************** //i.設置排序信息
example.orderBy("empSalary").asc().orderBy("empAge").desc(); //ii.設置“去重”
example.setDistinct(true); //iii.設置select 字段
example.selectProperties("empName","empSalary"); //*********************** //2.通過Example 對象創建Criteria 對象
Criteria criteria01 = example.createCriteria(); Criteria criteria02 = example.createCriteria(); //3.在兩個Criteria 對象中分別設置查詢條件 //property 參數:實體類的屬性名 //value 參數:實體類的屬性值
criteria01.andGreaterThan("empSalary", 3000) .andLessThan("empAge", 25); criteria02.andLessThan("empSalary", 5000) .andGreaterThan("empAge", 30); //4.使用OR 關鍵詞組裝兩個Criteria 對象
example.or(criteria02); //5.執行查詢
List<Employee> empList = employeeService.getEmpListByExample(example); for (Employee employee : empList) { System.out.println(employee); }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM