1. pom中引入MyBatis
到Maven倉(cāng)庫(kù), 搜索spring boot mybatis, 復(fù)制最新的maven到pom.xml
文件中
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
2. 創(chuàng)建Mapper
引入了statrer之后,我們不需要做其他額外的配置和依賴(lài)抬探,直接創(chuàng)建Mapper, 這里創(chuàng)建一個(gè)ShopAccountMapper
@Mapper
@Component
public interface ShopAccountMapper {
}
這里使用注解@Mapper
來(lái)表示這是一個(gè)Mybatis的Mapper類(lèi)弧可,也可以直接在啟動(dòng)文件中指定mapper類(lèi)所在的包,這樣就可以避免在每個(gè)Mapper類(lèi)上加入@Mapper
注解
@MapperScan(basePackages = "shop.leshare.mapper")
簡(jiǎn)單查詢(xún)
在Sql中引用參數(shù)需要用#{}
來(lái)表示, 我們?cè)趨?shù)中用@Param
來(lái)指定參數(shù)名稱(chēng)候引,否則Mybatis默認(rèn)會(huì)以arg0
, arg1
, param0
, param1
這樣的名字來(lái)命名
對(duì)于返回結(jié)果的處理耀销,如果存在實(shí)體屬性和數(shù)據(jù)庫(kù)字段不一致時(shí)淹接,需要用@Result
注解指定, 其中property
是表示java實(shí)體屬性, column
表示數(shù)據(jù)庫(kù)字段
@Select("select * from shop_account where shop_id=#{shopId} and sub_shop_id=#{subShopId}")
@Results({
@Result(property = "shopId", column = "shop_id"),
@Result(property = "shopName", column = "shop_name"),
@Result(property = "subShopId", column = "sub_shop_id"),
@Result(property = "subShopName", column = "sub_shop_name"),
@Result(property = "createTime", column = "create_time"),
@Result(property = "updateTime", column = "update_time"),
@Result(property = "recvAccountType", column = "recv_account_type"),
@Result(property = "recvValue", column = "recv_value"),
@Result(property = "recvValue2", column = "recv_value2"),
@Result(property = "checkName", column = "check_name")
})
List<ShopAccount> findAccounts(@Param("shopId") int shopId, @Param("subShopId") int subShopId);
條件查詢(xún)
有時(shí)候我們需要根據(jù)不同的參數(shù)條件進(jìn)行sql拼接,比如這里限佩,僅當(dāng)subShopId
大于0的時(shí)候葵诈,才納入查詢(xún)條件,這時(shí)候就要用到@SelectProvider
注解犀暑,type
指定一個(gè)類(lèi)驯击,method
指定該類(lèi)的方法.
Provider
中方法返回的是一個(gè)String, 也就是說(shuō)耐亏,在方法里根據(jù)給定的參數(shù)進(jìn)行判斷徊都,返回sql語(yǔ)句即可。當(dāng)Mapper中參數(shù)大于等于2個(gè)時(shí), Provider中方法接收的參數(shù)為Map<String, Object>
, Key就是在@Param
中指定的名稱(chēng)
注意广辰,當(dāng)Provider參數(shù)包含對(duì)象時(shí)暇矫,要取對(duì)象中的某一個(gè)屬性,可以直接用A.B的方式择吊,比如取User中的name, 直接#{user.name}, 如果是多參數(shù), 這個(gè)user要先從map中取出
@SelectProvider(type = ShopAccountProvider.class, method = "findList")
@Results({
@Result(property = "shopId", column = "shop_id"),
@Result(property = "shopName", column = "shop_name"),
@Result(property = "subShopId", column = "sub_shop_id"),
@Result(property = "subShopName", column = "sub_shop_name"),
@Result(property = "createTime", column = "create_time"),
@Result(property = "updateTime", column = "update_time"),
@Result(property = "recvAccountType", column = "recv_account_type"),
@Result(property = "recvValue", column = "recv_value"),
@Result(property = "recvValue2", column = "recv_value2"),
@Result(property = "checkName", column = "check_name")
})
List<ShopAccount> findAccounts(@Param("shopId") int shopId, @Param("subShopId") int subShopId);
public class ShopAccountProvider {
public String findList(Map<String, Object> param){
int subShopId = (int)param.get("subShopId");
String sql = "select * from shop_account where shop_id=#{shopId}\n";
if(subShopId > 0){
sql += "and sub_shop_id=#{subShopId}";
}
return sql;
}
}
新增
用@Insert
注解進(jìn)行新增操作, 如果需要自動(dòng)賦值自增長(zhǎng)的ID, 需要用到@Options
注解
@Insert("insert into shop_account (\n" +
" shop_id,\n" +
" shop_name,\n" +
" sub_shop_id,\n" +
" sub_shop_name,\n" +
" balance,\n" +
" returns,\n" +
" create_time,\n" +
" update_time,\n" +
" recv_account_type,\n" +
" recv_value,\n" +
" recv_value2,\n" +
" check_name\n" +
") value (\n" +
" #{shopId},\n" +
" #{shopName},\n" +
" #{subShopId},\n" +
" #{subShopName},\n" +
" #{balance},\n" +
" #{returns},\n" +
" now(),\n" +
" now(),\n" +
" #{recvAccountType},\n" +
" #{recvValue},\n" +
" #{recvValue2},\n" +
" #{checkName}\n" +
")")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
void addAccount(ShopAccount account);
其他如更新用@Update
注解, 刪除用@Delete
注解李根,使用方式同@Insert
當(dāng)Mapper創(chuàng)建完成之后,直接在需要使用的Service中引入即可
@Autowired
private ShopAccountMapper shopAccountMapper;