BaseMapper 接口方法介绍
BaseMapper 中提供了 CRUD 方法,具体方法如下:
// 插入一条记录
int insert(T entity);
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 whereEntity 条件,更新记录
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page,
@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
插入数据
insert 方法
//插入一条记录
int insert (T entity);
在 MybatisPlusTests.java 测试类中增加 testInsert 测试方法,如下:
@Test
@DisplayName("insert 方法插入数据")
public void testInsert() {
Employee employee=new Employee();
employee.setEmpId(100000);
employee.setName("刘龙");
employee.setEmpGender("男");
employee.setAge(25);
employee.setEmail("[email protected]");
employeeMapper.insert(employee);
}
执行 testInsert 测试方法插入数据,结果如下:
==> Preparing: INSERT INTO employee ( emp_id, name, emp_gender, age, email ) VALUES ( ?, ?, ?, ?, ? )
==> Parameters: 100000(Long), 刘龙(String), 男(String), 25(Integer), [email protected](String)
<== Updates: 1
插入成功,测试OK~
由于数据库表中主键字段设置为自增ID,应该不需要employee.setEmpId(100000)
设置 empId
,所以将其注释,如下:
@Test
@DisplayName("insert 方法插入数据")
public void testInsert() {
Employee employee=new Employee();
//employee.setEmpId(100000);
employee.setName("刘龙");
employee.setEmpGender("男");
employee.setAge(25);
employee.setEmail("[email protected]");
employeeMapper.insert(employee);
}
再次执行 testInsert 测试方法插入数据,结果如下:
插入失败,异常信息是说 empId
属性没有设置默认值,这是怎么回事呀,数据库表中不是已经设置了自增主键,为何这里还报错呀?
原因是我们的定义的 Employee
数据模型类并不知道数据表的主键字段是自增主键,所以需要告诉它一下。怎么告诉,使用 @TableId 注解
@TableId注解
描述:主键注解
IdType 属性
值 描述 Auto 数据库ID自增 None 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于Input) Input Insert前自行set主键值 ASSIGN_ID 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator 的方法 nextId (默认实现类为DefaultIdentifierGenerator 雪花算法) ASSIGN_UUI 分配UUID,主键类型为String(since 3.3.0),使用接口 IdentifierGenerator 的方法 nextUUID (默认default方法)
修改 Employee.java 如下:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
@TableId(type = IdType.AUTO) //设置自增主键
private Long empId;
private String name;
private String empGender;
private Integer age;
private String email;
}
再次执行 testInsert 测试方法插入数据,结果如下:
==> Preparing: INSERT INTO employee ( name, emp_gender, age, email ) VALUES ( ?, ?, ?, ? )
==> Parameters: 刘龙(String), 男(String), 25(Integer), [email protected](String)
<== Updates: 1
插入成功,测试OK~
更新数据
updateById 方法
根据 id 进行记录更新,如果对象属性未传值,则不会更新该字段,保持数据库表原来字段值
@Test
@DisplayName("updateById 方法更新数据")
public void testUpdateById() {
Employee employee=new Employee();
employee.setEmpId(1367717669156028419L);
employee.setName("刘龙");
employee.setEmpGender("女");
employee.setAge(23);
employee.setEmail("[email protected]");
employeeMapper.updateById(employee);
}
执行 testUpdateById 测试方法更新数据,结果如下:
==> Preparing: UPDATE employee SET name=?, emp_gender=?, age=?, email=? WHERE emp_id=?
==> Parameters: 刘龙(String), 女(String), 23(Integer), [email protected](String), 1367717669156028419(Long)
<== Updates: 1
update(entity,wrapper)方法
根据数据模型的属性进行记录更新,如果对象属性未传值,则不会更新该字段,保持数据库表原来字段值
@Test
@DisplayName("update 方法更新数据")
public void testUpdate(){
//根据员工的名字,更新
Employee employee = new Employee();
employee.setEmpGender("男");
employee.setAge(18);
employee.setEmail("[email protected]");
employeeMapper.update(employee2,new UpdateWrapper<Employee>().eq("name","刘龙"));
}
注意:UpdateWrapper 类用于设置更新条件
执行 testUpdate 测试方法更新数据,结果如下:
==> Preparing: UPDATE employee SET emp_gender=?, age=?, email=? WHERE (name = ?)
==> Parameters: 男(String), 18(Integer), [email protected](String), 刘龙(String)
<== Updates: 1
查询数据
selectById 方法
根据 id 查询指定记录
@Test
@DisplayName("selectById 方法根据ID查询数据")
public void testSelectById() {
Employee employee=employeeMapper.selectById(1367717669156028419L);
System.out.println(employee);
}
执行 testSelectById测试方法更新数据,结果如下:
==> Preparing: SELECT emp_id,name,emp_gender,age,email FROM employee WHERE emp_id=?
==> Parameters: 1367717669156028419(Long)
<== Columns: emp_id, name, emp_gender, age, email
<== Row: 1367717669156028419, 刘龙, 男, 18, [email protected]
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3bb8aabc]
Employee(empId=1367717669156028419, name=刘龙, empGender=男, age=18, [email protected])
selectBatchIds方法
批量查询指多个id的记录集合
@Test
@DisplayName("selectBatchIds 方法根据批量 ID 查询数据")
public void testSelectBatchIds() {
List list= Arrays.asList(1367717669156028419L,1367717669156028418L);
List<Employee> employeeList = employeeMapper.selectBatchIds(list);
employeeList.forEach(System.out::println);
}
执行 testSelectBatchIds 测试方法更新数据,结果如下:
Preparing: SELECT emp_id,name,emp_gender,age,email FROM employee WHERE emp_id IN ( ? , ? )
==> Parameters: 1367717669156028419(Long), 1367717669156028418(Long)
<== Columns: emp_id, name, emp_gender, age, email
<== Row: 1367717669156028418, 何雨柱, 男, 23, [email protected]
<== Row: 1367717669156028419, 刘龙, 男, 18, [email protected]
<== Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@29a4f594]
Employee(empId=1367717669156028418, name=何雨柱, empGender=男, age=23, [email protected])
Employee(empId=1367717669156028419, name=刘龙, empGender=男, age=18, [email protected])
selectByMap方法
根据Map集合中传入的条件进行查询,每个条件都是and关系
@Test
@DisplayName("selectByMap 方法多条件查询数据")
public void testSelectByMap() {
Map<String,Object> map=new HashMap<>();
map.put("emp_gender","男");
map.put("age",23);
List<Employee> employeeList = employeeMapper.selectByMap(map);
employeeList.forEach(System.out::println);
}
注意:map 结构用于存放多个查询条件,key 对应的是数据库字段名(不是数据模型属性名),value 对应查询条件
执行 selectByMap 测试方法更新数据,结果如下:
==> Preparing: SELECT emp_id,name,emp_gender,age,email FROM employee WHERE (emp_gender = ? AND age = ?)
==> Parameters: 男(String), 23(Integer)
<== Columns: emp_id, name, emp_gender, age, email
<== Row: 1367717669156028418, 何雨柱, 男, 23, [email protected]
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7c3ebc6b]
Employee(empId=1367717669156028418, name=何雨柱, empGender=男, age=23, [email protected])
删除数据
deleteById方法
根据 id 删除记录
@Test
@DisplayName("deleteById 根据ID删除数据")
public void testDeleteById(){
int rows = employeeMapper.deleteById(1367717669156028419L);
System.out.println("受影响的行数:"+rows);
}
执行 testDeleteById 测试方法更新数据,结果如下:
==> Preparing: DELETE FROM employee WHERE emp_id=?
==> Parameters: 1367717669156028419(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@58294867]
受影响的行数:1
deleteByMap方法
根据 Map 中的条件进行删除,map中的条件在sql语句中是and关系
@Test
@DisplayName("deleteByMap 方法多条件删除数据")
public void testDeleteByMap(){
Map<String,Object> map=new HashMap<>();
map.put("emp_gender","男");
map.put("name","何雨柱");
int rows = employeeMapper.deleteByMap(map);
System.out.println("受影响的行数:"+rows);
}
执行 deleteByMap 测试方法更新数据,结果如下:
==> Preparing: DELETE FROM employee WHERE (name = ? AND emp_gender = ?)
==> Parameters: 何雨柱(String), 男(String)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7c3ebc6b]
受影响的行数:1
@TableName注解:表名注解
作用:当表名跟实体类类名不一致时,要使用@TableName
注解进行映射
举例如下:
@NoArgsConstructor
@AllArgsConstructor
@Data
@TableName(value = "tb_employee")
public class Employee {
@TableId(type=IdType.AUTO)
private Long empId;
private String empName;
private String empGender;
private Integer age;
private String email;
}
@TableField 字段注解(非主键)
作用:当表字段名跟实体类属性名不一致时,要使用 @TableField
注解进行映射
举例如下:
@NoArgsConstructor
@AllArgsConstructor
@Data
@TableName(value = "tb_employee")
public class Employee {
@TableId(type=IdType.AUTO)
private Long empId;
//当表中的列与实体类属性不一致时,使用TableField指定数据库中的列名
@TableField(value = "emp_name")
private String name;
private String empGender;
private Integer age;
private String email;
//当表中没有remark时,使用TableField的exist=false属性忽略该字段
@TableField(exist = false)
private String remark;
}
标签:MyBatisPlus,String,数据库,private,Employee,CURD,emp,employee,Param
From: https://www.cnblogs.com/binbingg/p/18293469