1. 注解使用
? ? ? ? mybatis-plus提供了 ·@TableName·, @TableId, @TableField,?@TableLogic 四種注解,其含義分別為:
?@TableName
? ? ? ? ?@TableName("SPF_Require_Vehicle")? ? 用于聲明當(dāng)前class所對應(yīng)數(shù)據(jù)庫中的表,如果class的名字和表的名字完全相同,則不需要添加該注解,如果不一樣,則需要用該注解進(jìn)行聲明。
?@TableId
????????@TableId(value = "SPF_UID", type = IdType.AUTO)? ? ?用于聲明主鍵, value指定數(shù)據(jù)庫中主鍵的名稱,type為主鍵的生成類型,支持 Assign(雪花算法,java字段需要是Long)、Auto(數(shù)據(jù)庫字段需要聲明為auto_increment), uuid
? @TableField
? ? ? ??@TableField("SPF_Name")? 用于聲明當(dāng)前字段對應(yīng)的表中的字段
? @TableLogic
? ? ? ? @TableLogic(value = "0", delval = "1")? ?用于軟刪除,value是默認(rèn)值,delval表示軟刪除后的值。
@TableName("SPF_Require_Vehicle")
@Data
public class Employee {
/**
* 指定主鍵名稱為SPF_uid, 類型為自增,即數(shù)據(jù)庫的字段必須是auto_increment
*/
@TableId(value = "SPF_UID", type = IdType.AUTO)
private Long id;
/**
* 指定數(shù)據(jù)庫中對應(yīng)的字段是 Part_PartSap
*/
@TableField("Part_PartSap")
private String partSap;
@TableField("Part_PlateSap")
private String plateSap;
@TableField("SPF_Name")
private String name;
/**
* 邏輯刪除
*/
@TableLogic(value = "0", delval = "1")
@TableField("IsActvie")
private Boolean active;
}
@EnumValue
? ? ? ? 代碼簡潔性考慮:許多時候需要用到Enum,例如0表示男1表示女、0表示關(guān)閉1表示打開,and so on
- ? ? ? ? ?在數(shù)據(jù)庫表中增加字段gender: 0表示男,1表示女
- ? ? ? ? ? 定義枚舉類, @EnumValue注解表示該字段是向數(shù)據(jù)庫中插入的值,@JsonValue表示讀取的時候?qū)ν庹故镜闹????????
@Getter
public enum SexEnum {
SEX_MALE(0, "男"),
SEX_FEMALE(1, "女");
/**
* 表示當(dāng)前字段是執(zhí)行insert時向數(shù)據(jù)庫中插入的字段
*/
@EnumValue
private int sexVal;
/**
* 表示從數(shù)據(jù)庫讀取的時候?qū)ν怙@示的值
*/
@JsonValue
private String sexName;
SexEnum(int sexVal, String sexName) {
this.sexVal = sexVal;
this.sexName = sexName;
}
/**
* 配合 @JsonValue使用
* @return 返回展示的值
*/
@Override
public String toString() {
return this.sexName;
}
}
? ? ? ? 3.? 使用處
?????????????????
????????????????
? ? ? ? ?插入的值為枚舉注釋的值
? ? ? ? 讀取的是 @JsonValue注釋的值
?????????
2. IService使用
2.1 批量插入
boolean saveBatch(Collection<T> entityList, int batchSize);
@Test
public void baseBatchInsertTest() {
List<Employee> list = new ArrayList<>();
for (int i = 20; i < 30; i++) {
Employee employee = new Employee();
employee.setName("zhagnsan" + i);
employee.setPartSap("123425-" + i);
employee.setPlateSap("312342-" + i);
list.add(employee);
}
// 批量插入,service提供了兩個函數(shù),可以帶第二個參數(shù),也可以不帶,不帶的情況下默認(rèn)是1000
// 批量插入實際也是一條一條的插入,不同的是底層啟動了同一個session,插入完成后關(guān)閉,不需要每次都開啟關(guān)閉
this.service.saveBatch(list, 10);
}
2.2 批量插入修改
? ? ? ? 如果主鍵Id已經(jīng)在表中存在則修改,如果不存在則插入一條新數(shù)據(jù)
?// 第二個參數(shù)選填,默認(rèn)是1000
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
@Test
public void testBatchInsertOrUpdate() {
List<Employee> list = new ArrayList<>();
Employee e1 = new Employee();
// 1L已經(jīng)存在,會指定update
e1.setId(1L);
// 只添加了一個字段,也就是只修改一個字段
e1.setName("車轱轆");
Employee e2 = new Employee();
// id在表中不存在,則新增
e2.setId(50L);
e2.setName("車頂");
e2.setPartSap("123142314-00");
e2.setPlateSap("423414-09");
list.add(e1);
list.add(e2);
this.service.saveOrUpdateBatch(list,2);
}
2.2 單個插入修改
? ? ? ?// 如果id存在則修改,否則插入
boolean saveOrUpdate(T entity);
2.3 單個刪除
default boolean removeById(Serializable id)
default boolean removeById(T entity)
@Test
public void testRemoveSingle01() {
/**
* id如果存在則刪除,返回ture,否則返回false
*/
boolean b = this.service.removeById(9);
System.out.println("b:" + b);
}
/*
* 有的時候,前端傳過來的是一個類,此時可以直接調(diào)用該函數(shù)刪除
*/
@Test
public void testRemoveSignle02() {
Employee employee = new Employee();
employee.setId(8L);
this.service.removeById(employee);
}
2.4 有條件刪除?
? ? ? ? 實際中很多情況并不是根據(jù)Id進(jìn)行刪除而是根據(jù)實際需要進(jìn)行刪除, service也提供了該功能
removeByMap
default boolean removeByMap(Map<String, Object> columnMap)
????????
/*
* 下面代碼執(zhí)行的語句如下
* UPDATE SPF_Require_Vehicle SET IsActvie=1 WHERE Part_PlateSap = ? AND Part_PartSap = ? AND IsActvie=0
*/
@Test
public void testRemoveByMap() {
Map<String, Object> map = new HashMap<>();
map.put("Part_PartSap", "123425-0");
map.put("Part_PlateSap", "312342-0");
this.service.removeByMap(map);
}
remove(可根據(jù)條件批量刪除)
?也可以根據(jù)wrapper進(jìn)行刪除,刪除的時候使用的是QueryWrapper, Wrapper的用法有很多種,此處只展示in的用法,其他用法下文進(jìn)行介紹
default boolean remove(Wrapper<T> queryWrapper)
@Test
public void testRemove03() {
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
List<Long> list = new ArrayList<>();
list.add(2L);
list.add(3L);
list.add(4L);
wrapper.in(list != null && !list.isEmpty(), "SPF_UID", list);
/**
* UPDATE SPF_Require_Vehicle SET IsActvie=1 WHERE IsActvie=0 AND (SPF_UID IN (?,?,?))
*/
this.service.remove(wrapper);
}
2.5 批量刪除
根據(jù)主鍵批量刪除
removeByIds
default boolean removeByIds(Collection<?> list)
@Test
public void testRemoveByIds() {
List<Long> list = new ArrayList<>();
list.add(2L);
list.add(3L);
list.add(5L);
/**
* 根據(jù)Ids批量刪除
* UPDATE SPF_Require_Vehicle SET IsActvie=1 WHERE SPF_UID IN ( ? , ? , ? ) AND IsActvie=0
*/
this.service.removeByIds(list);
}
removeBatchByIds
采用jdbc批量刪除,底層使用for循環(huán)逐個刪除,這點是和上面函數(shù)的區(qū)別
default boolean removeBatchByIds(Collection<?> list, int batchSize)
@Test
public void testremoveBatchByIds() {
List<Long> list = new ArrayList<>();
list.add(2L);
list.add(3L);
list.add(5L);
/**
* UPDATE SPF_Require_Vehicle SET IsActvie=1 WHERE SPF_UID=? AND IsActvie=0
*/
this.service.removeBatchByIds(list, list.size());
}
2.6 單個修改:根據(jù)Id修改
default boolean updateById(T entity)
@Test
public void testupdateById() {
Employee employee = new Employee();
employee.setId(8L);
employee.setName("doris");
/**
* UPDATE SPF_Require_Vehicle SET SPF_Name=? WHERE SPF_UID=? AND IsActvie=0
*/
this.service.updateById(employee);
}
2.7 有條件修改:根據(jù)wrapper修改
default boolean update(Wrapper<T> updateWrapper)
@Test
public void testupdate() {
Integer minId = 9;
Integer maxId = 14;
String name = "doris";
String nName = "wangshun";
LambdaUpdateWrapper<Employee> wrapper = new LambdaUpdateWrapper<>();
wrapper.gt(minId != null, Employee::getId, minId)
.lt(maxId != null, Employee::getId, maxId)
.or()
.like(name != null && !name.isEmpty(), Employee::getName, name);
wrapper.set(nName != null && !nName.isEmpty(), Employee::getName, nName);
/**
* UPDATE SPF_Require_Vehicle SET SPF_Name=? WHERE IsActvie=0 AND (SPF_UID > ? AND SPF_UID < ? OR SPF_Name LIKE ?)
*/
this.service.update(wrapper);
}
2.8 批量修改:根據(jù)Id修改
這個方法很使用,實際工作中,都是根據(jù)前端傳過來的結(jié)構(gòu)體進(jìn)行修改
boolean updateBatchById(Collection<T> entityList, int batchSize)
@Test
public void testupdateBatchById() {
List<Employee> list = new ArrayList<>();
Employee e1 = new Employee();
e1.setId(1L);
e1.setName("wangwu");
Employee e2 = new Employee();
e2.setId(2L);
e2.setName("wangbaochuan");
list.add(e1);
list.add(e2);
/**
* UPDATE SPF_Require_Vehicle SET SPF_Name=? WHERE SPF_UID=? AND IsActvie=0
*/
this.service.updateBatchById(list, list.size());
}
2.9 單個查詢
? ? ? ? 根據(jù)Id單個查詢
????????getById
@Test
public void testgetById() {
/**
* SELECT SPF_UID AS id,Part_PartSap AS partSap,Part_PlateSap AS plateSap,SPF_Name AS name,IsActvie AS active FROM SPF_Require_Vehicle WHERE SPF_UID=? AND IsActvie=0
*/
Employee byId = this.service.getById(1);
System.out.println(byId);
}
????????getOne
? ? ? ? ? // 根據(jù)條件查找時:如果有多個則會拋出異常
????????default T getOne(Wrapper<T> queryWrapper)
????????
@Test
public void testgetOne() {
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
String plateSap = "312342-6";
wrapper.eq(plateSap != null && !plateSap.isEmpty(), Employee::getPlateSap, plateSap);
/**
* SELECT SPF_UID AS id,Part_PartSap AS partSap,Part_PlateSap AS plateSap,SPF_Name AS name,IsActvie AS active
* FROM SPF_Require_Vehicle WHERE IsActvie=0 AND (Part_PlateSap = ?)
*/
Employee one = this.service.getOne(wrapper);
System.out.println(one);
}
????????
2.10 批量查詢
????????listByIds
????????
@Test
public void testlistByIds() {
List<Long> list = new ArrayList<>();
list.add(1L);
list.add(2L);
list.add(3L);
List<Employee> employees = this.service.listByIds(list);
/**
* SELECT SPF_UID AS id,Part_PartSap AS partSap,Part_PlateSap AS plateSap,SPF_Name AS name,IsActvie AS active FROM SPF_Require_Vehicle WHERE SPF_UID IN ( ? , ? , ? ) AND IsActvie=0
*/
employees.forEach(System.out::println);
}
list
?????????
@Test
public void testList() {
List<Employee> list = this.service.list();
/**
* SELECT SPF_UID AS id,Part_PartSap AS partSap,Part_PlateSap AS plateSap,SPF_Name AS name,IsActvie AS active
* FROM SPF_Require_Vehicle WHERE IsActvie=0
*/
list.forEach(System.out::println);
}
2.11 有條件批量查詢
????????listByMap
????????default List<T> listByMap(Map<String, Object> columnMap)
@Test
public void testlistByMap() {
Map<String, Object> map = new HashMap<>();
map.put("SPF_Name", "wangshun");
map.put("Part_PlateSap", "312342-20");
/**
* SELECT SPF_UID AS id,Part_PartSap AS partSap,Part_PlateSap AS plateSap,SPF_Name AS name,IsActvie AS active
* FROM SPF_Require_Vehicle WHERE Part_PlateSap = ? AND SPF_Name = ? AND IsActvie=0
*/
List<Employee> employees = this.service.listByMap(map);
employees.forEach(System.out::println);
}
list
default List<T> list(Wrapper<T> queryWrapper)
@Test
public void testList() {
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
wrapper.like(Employee::getName, "wangshun");
List<Employee> list = this.service.list(wrapper);
/**
* SELECT SPF_UID AS id,Part_PartSap AS partSap,Part_PlateSap AS plateSap,SPF_Name AS name,IsActvie AS active
* FROM SPF_Require_Vehicle WHERE IsActvie=0 AND (SPF_Name LIKE ?)
*/
list.forEach(System.out::println);
}
2.12?查詢指定列
getmap
? ? ? ? // 如果查詢出過個,則只取第一個
Map<String, Object> getMap(Wrapper<T> queryWrapper);
@Test
public void testSelectMap() {
String name = "wangshun";
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
wrapper.like(!name.isEmpty(), Employee::getName, name);
/**
* 只查詢這兩列,如果同時查詢出多行,則只取第一行
* SELECT Part_PlateSap AS plateSap,Part_PartSap AS partSap FROM SPF_Require_Vehicle WHERE IsActvie=0 AND (SPF_Name LIKE ?)
*/
wrapper.select(Employee::getPlateSap, Employee::getPartSap);
Map<String, Object> map = this.service.getMap(wrapper);
System.out.println(map);
}
listMap
? ? ? ? 可查詢多行
@Test
public void testlistMaps() {
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
wrapper.like(Employee::getName, "wangshun");
/**
* 只顯示這三列
*/
wrapper.select(Employee::getPartSap, Employee::getPlateSap, Employee::getName);
List<Map<String, Object>> maps = this.service.listMaps(wrapper);
for (Map<String, Object> map : maps) {
System.out.println(map);
}
}
????????
default List<Map<String, Object>> listMaps() 如果不見條件則查詢所有的行
2.13 個數(shù)查詢? ? ??
// 查詢表中國有效的總行數(shù) default long count()
// 根據(jù)條件查詢行數(shù) default long count(Wrapper<T> queryWrapper)
2.14 分頁查詢
? ? ? ? 分頁查詢需要首先注冊mybatis-plus的攔截器,配置如下
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor getIntercepter() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
}
@Test
public void testPage01() {
Page<Employee> page = new Page<>(2, 4);
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
wrapper.like(Employee::getName, "wangshun");
this.service.page(page, wrapper);
System.out.println(page);
// 查詢到的內(nèi)容
System.out.println("records: " + page.getRecords());
// 總頁數(shù)
System.out.println("pages: " + page.getPages());
// 當(dāng)前頁數(shù)
System.out.println("current: " + page.getCurrent());
// 總條目數(shù)
System.out.println("total: " + page.getTotal());
}
2.15 SQL分頁查詢
? ? ? ? 許多時候需要手寫語句實現(xiàn)分頁查詢,例如同時從多張表中查詢數(shù)據(jù),這個時候需要自己寫條件。
01. 在 application.yml中指定mybatis-plus的相關(guān)配置,尤其要指定xml的路徑,默認(rèn)在mapper下,本人仍習(xí)慣指明位置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 指定mapper.xml所在的位置
mapper-locations: classpath:/mapper/*.xml
02. 在Mapper中增加聲明
/**
* 手寫語句實現(xiàn)分頁查詢
* @param page 攔截器使用,當(dāng)前sql中不需要
* @param employee 查詢對象
* @return 查詢結(jié)果
*/
Page<Employee> getEmployeeInfoByPage(@Param("page") Page<Employee> page, @Param("employee") Employee employee);
03. 添加Mapper對應(yīng)的xml文件并增加對應(yīng)的函數(shù)文章來源:http://www.zghlxwxcb.cn/news/detail-728319.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ssm01.mapper.EmployeeMapper">
<resultMap id="baseResultMap" type="com.ssm01.pojo.Employee">
<result column="SPF_UID" property="id"/>
<result column="Part_PartSap" property="partSap"/>
<result column="Part_PlateSap" property="plateSap"/>
<result column="SPF_Name" property="name"/>
</resultMap>
<select id="getEmployeeInfoByPage" resultMap="baseResultMap">
select * from SPF_Require_Vehicle where SPF_Name = #{employee.name} and IsActvie = 0
</select>
</mapper>
04. 在自己的service中增加相應(yīng)的方法,調(diào)用mapper中的函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-728319.html
到了這里,關(guān)于Mybatis-plus 使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!