mybatis使用註解,多引數增刪改查
阿新 • • 發佈:2018-12-03
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配置檔案裡的寫法一致,
- 新增方法裡,@Param註解javaBean ,在sql語句裡用#{註解名字.屬性名進行引用}
- 在查詢方法裡,因為涉及到不確定的查詢條件,需要用到進行判斷,這裡需要注意的是sql語句需要用<script></script>包裹。
- 1+1這裡是湊一個條件,讓後面的條件都要寫and,不用再去條件判斷,當然你也可以用<trim></trim>標籤代替,參見更新方法
- 更新方法裡<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,然後再修改這個物件的兩個屬性,執行更新方法,再根據修改後的物件去資料庫中查詢,斷言修改後的屬性。好了執行成功。