1. 程式人生 > >mybatis使用註解,多引數增刪改查

mybatis使用註解,多引數增刪改查

mybatis 註解方式,多引數增刪改查

最近要用springboot做一個專案,開始持久層使用的jpa,後來由於業務中涉及到很多不確定資料庫欄位,以及使用者新增的表,用jpa無法完成需求,再加上在更新資料時,jpa會把屬性為null的引數也更新,必須要再查一遍,然後拷貝屬性後再更新,感覺很影響效能,無奈又用起了mybatis,又不想寫mybatis的xml對映檔案,遂又開始學註解方式,最開始碰到多引數,查詢更新問題,網上查了很多資料寫的很繁瑣,而且又新增了很多配置檔案,最後找了個最接近原xml配置的方式,記錄如下:

一些準備工作

實體表,使用的是jpa的自動生成表,

 @Entity(name = "sys_unit")
  public class Unit extends Node {
  /**
   * (機構)部門名稱
   */
  private String unitName;
  /**
   * (機構)部門代號
   */
  private String unitCode;
  /**
   * 排序欄位
   */
  private Integer unitSequence;
  /**
   * 型別0:內建根節點(只有一個不能新增,刪除)1:公司,2:部門
   */
  @Column
(columnDefinition="enum('0','1','2') comment '型別'") private String nuitType; /** * 啟用狀態1:啟用,0:禁用,銷燬 */ @Column(columnDefinition="enum('1','0') comment '啟用狀態'") private String unitActive; /** * 全宗號 */ private String unitFonds; /** * 資料建立時間 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss"
) @Column(nullable=false,columnDefinition="timestamp not null DEFAULT CURRENT_TIMESTAMP comment '建立時間'") private LocalDateTime createTime; /** * 最後一次修改時間 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss" ) @Column(nullable=false,columnDefinition="timestamp not null DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '最後修改時間'") private LocalDateTime updateTime; }

因為我沒有指定列名,最後在資料庫中生成的欄位會自動加下劃線,如unit_name;所以在springbootd的application.yml配置檔案中需要開啟駝峰命名。
application.yml部分配置

mybatis:
  configuration:
    map-underscore-to-camel-case: true #開啟駝峰命名

mapper

mapper檔案是一個介面類,代替之前的xml對映檔案;
具體寫法如下

public interface UnitMapper {
	/**
	*增加部門
	*/
    @Insert("insert into sys_unit (" +
            "id," +
            "parent_id," +
            "nuit_type," +
            "unit_active," +
            "unit_code," +
            "unit_fonds," +
            "unit_name," +
            "unit_sequence)" +
            " values( #{unit.id}," +
            " #{unit.parentId},#{unit.nuitType},#{unit.unitActive}," +
            " #{unit.unitCode},#{unit.unitFonds},#{unit.unitName}," +
            " #{unit.unitSequence}) " )
    int add(@Param("unit") Unit unit);
	/**
	*多引數查詢部門資訊
	*/
    @Select(" <script> SELECT id," +
            "parent_id," +
            "nuit_type," +
            "unit_active," +
            "unit_code," +
            "unit_fonds," +
            "unit_name," +
            "unit_sequence"+
            " from sys_unit WHERE " +
            "1+1 "+
            " <if  test=\"unit.id != null  \"> and id = #{unit.id} </if> "+
            " <if  test=\"unit.parentId != null  \"> and parent_id = #{unit.parentId} </if> "+
            " <if test=\"unit.unitName != null \"> and unit_name like CONCAT('%',#{unit.unitName},'%') </if> </script>")
    List<Unit> query(@Param("unit") Unit unit);
    /**
	*更新
	*/
    @Update("<script> update sys_unit  " +
            "<trim prefix=\"set\" suffixOverrides=\",\">" +
            " <if  test=\"unit.parentId != null  \">  parent_id = #{unit.parentId} ,</if> "+
            " <if  test=\"unit.unitName != null  \">  unit_name = #{unit.unitName} ,</if> "+
            " <if  test=\"unit.nuitType != null  \">  nuit_type = #{unit.nuitType} ,</if> "+
            " <if  test=\"unit.unitFonds != null  \">  unit_fonds = #{unit.unitFonds} ,</if> "+
            " <if  test=\"unit.unitCode != null  \">  unit_code = #{unit.unitCode} ,</if> "+
            " </trim> "+
            " where id = #{unit.id} </script>")
    int updata(@Param("unit") Unit unit);
}

<trim></trim>標籤的用法和以前的xml配置檔案裡的寫法一致,

  1. 新增方法裡,@Param註解javaBean ,在sql語句裡用#{註解名字.屬性名進行引用}
  2. 在查詢方法裡,因為涉及到不確定的查詢條件,需要用到進行判斷,這裡需要注意的是sql語句需要用<script></script>包裹。
  3. 1+1這裡是湊一個條件,讓後面的條件都要寫and,不用再去條件判斷,當然你也可以用<trim></trim>標籤代替,參見更新方法
  4. 更新方法裡<trim prefix=“set” suffixOverrides=","></trim>標籤裡,prefix代表最開始加個set ; suffixOverrides代表去掉最後的逗號;當然也有在開始去掉,以及再最後增加字串的方法,這個需要請自行查閱相關資料,這裡不過多說明(其實是我也不知道,手動滑稽);
    算了還是要圖片滑稽採才夠正式。(`・ω・´)在這裡插入圖片描述

好了還有最後的一步,在springboot的啟動類上加入mapper介面所在包的路徑,

//掃描mybatis介面
//( ̄︶ ̄)↗(敲黑板),看這裡,在@MapperScan寫上你的介面檔案所在的包的路徑,springboot在啟動時就會自動掃描
@MapperScan("com.XXX.XXX.mapper")
@SpringBootApplication
public class SfmsApplication {

    public static void main(String[] args) {

        SpringApplication.run(SfmsApplication.class, args);

    }

}

好了大功告成,再寫個單元測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class UnitMapperTest {
    @Autowired
    private  UnitMapper unitMapper;
    /**
     * 根據ID,多條件更新測試
     */
    @Test
    public void updata(){
        Unit u = new Unit();
        u.setId("0006");
        u.setUnitName("測試06");

        unitMapper.add(u);
        Unit u1 = unitMapper.query(u).get(0);
        assertEquals(u1.getUnitName(),"測試06");
        u1.setUnitName("修改測試06");
        u1.setUnitCode("TEST06");
        unitMapper.updata(u1);
        Unit u2  =unitMapper.query(u1).get(0);
        assertEquals(u2.getUnitName(),"修改測試06");
        assertEquals(u2.getUnitCode(),"TEST06");

    }
}

首先建立個部門物件設定ID為0006,名稱為測試06,然後執行add新增這個物件到資料庫
,然後在根據這個物件為條件執行查詢,因為ID是唯一的,所以list裡只有一個,直接get(0)拿出來,斷言這個部門名稱為測試06,然後再修改這個物件的兩個屬性,執行更新方法,再根據修改後的物件去資料庫中查詢,斷言修改後的屬性。好了執行成功。
在這裡插入圖片描述