MyBatis-Plus 内置通用 Mapper,我们仅需要继承 BaseMapper,通过少量配置即可实现单表大部分 CRUD 操作,同时其更有强大的条件构造器,满足各类使用需求。
CREATE TABLE `user_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) DEFAULT NULL,
`pass_word` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf-8;
@Data
public class UserInfo {
@TableId(type = IdType.AUTO)
private Integer id;
private String userName;
private String passWord;
private Integer age;
}
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}
@RestController
public class HelloController {
@Autowired
UserInfoMapper userInfoMapper;
@RequestMapping("/test")
public void test(){
// 根据id查询数据
UserInfo user = userInfoMapper.selectById(2);
System.out.println(user);
}
}
注意:是数据库中符合传入条件的记录有多条,那就不能用这个方法,会报错。
// 查询条件:名字中包含'ha'并且年龄小于40
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.like("user_name","ha").lt("age",40);
// 开始查询
UserInfo user = userInfoMapper.selectOne(queryWrapper);
System.out.println(user);
提示:lambda 条件构造器好处是由于它是通过调用实体类中的方法,如果方法名称写错,会直接报错,从而提前纠错。不像 QueryWrapper 是通过自己写表中相应的属性来构造 where 条件,容易发生拼写错误,等到运行时才发现
// 查询条件:名字中包含'ha'并且年龄小于40
LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40);
// 开始查询
UserInfo user = userInfoMapper.selectOne(queryWrapper);
System.out.println(user);
LambdaQueryWrapper<UserInfo> lqw1 = new QueryWrapper<UserInfo>().lambda();
LambdaQueryWrapper<UserInfo> lqw2= new LambdaQueryWrapper<>();
LambdaQueryWrapper<UserInfo> lqw3 = Wrappers.lambdaQuery();
UserInfo userInfo = new LambdaQueryChainWrapper<>(userInfoMapper)
.like(UserInfo::getUserName,"ha")
.lt(UserInfo::getAge,40)
.one();
// 查询条件:名字为'hangge'并且年龄为22
UserInfo userInfo = new UserInfo();
userInfo.setUserName("hangge");
userInfo.setAge(22);
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(userInfo);
// 开始查询
UserInfo user = userInfoMapper.selectOne(queryWrapper);
System.out.println(user);
-- 不推荐这种做法
@Data
public class UserInfo {
private Integer id;
@TableField(condition = SqlCondition.LIKE)
private String userName;
private String passWord;
private Integer age;
}
// 查询条件:名字包含为'ha'
UserInfo userInfo = new UserInfo();
userInfo.setUserName("ha");
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(userInfo);
// 开始查询
UserInfo user = userInfoMapper.selectOne(queryWrapper);
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
List<UserInfo> users = userInfoMapper.selectBatchIds(ids);
System.out.println(users);
注意:map 写的是数据表中的列名,而非实体类的属性名。比如属性名为 userName,数据表中字段为 user_name,这里应该写的是 user_name。
Map<String,Object> columnMap = new HashMap<>();
columnMap.put("user_name", "hangge");
columnMap.put("age", 22);
List<UserInfo> users = userInfoMapper.selectByMap(columnMap);
System.out.println(users);
注意:selectList 使用与 selectOne 类似,不同的是当数据库中符合传入的条件的记录有多条,使用 selectOne 会报错。这时就要使用 selectList。
// 查询条件:名字中包含'ha'并且年龄小于40
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.like("user_name","ha").lt("age",40);
// 开始查询
List<UserInfo> users = userInfoMapper.selectList(queryWrapper);
System.out.println(user);
// 查询条件:名字中包含'ha'并且年龄小于40
LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40);
// 开始查询
List<UserInfo> users = userInfoMapper.selectList(queryWrapper);
System.out.println(users);
而且也同样如上拥有四种方式创建lambda,第四种函数式编程方式:
LambdaQueryWrapper<UserInfo> lqw1 = new QueryWrapper<UserInfo>().lambda();
LambdaQueryWrapper<UserInfo> lqw2= new LambdaQueryWrapper<>();
LambdaQueryWrapper<UserInfo> lqw3 = Wrappers.lambdaQuery();
List<UserInfo> userInfos = new LambdaQueryChainWrapper<>(userInfoMapper)
.like(UserInfo::getUserName,"ha")
.lt(UserInfo::getAge,40)
.list();
// 查询条件:名字为'hangge'并且年龄为22
UserInfo userInfo = new UserInfo();
userInfo.setUserName("hangge");
userInfo.setAge(22);
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(userInfo);
// 开始查询
List<UserInfo> users = userInfoMapper.selectList(queryWrapper);
System.out.println(users);
@Data
public class UserInfo {
private Integer id;
@TableField(condition = SqlCondition.LIKE)
private String userName;
private String passWord;
private Integer age;
}
// 查询条件:名字包含'ha'
UserInfo userInfo = new UserInfo();
userInfo.setUserName("ha");
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(userInfo);
// 开始查询
List<UserInfo> users = userInfoMapper.selectList(queryWrapper);
selectMaps 的用法和上面的 selectList 很像,都是传入一个查询构造器进行查询,然后返回一个 List。不同在于 selectMaps 返回的 List 里面是 Map:
注意: Map 里的 key 为表字段名,而不是对应实体类的属性名。
UserInfo userInfo = new UserInfo();
userInfo.setUserName("ha");
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(userInfo);
// 开始查询
List<Map<String, Object>> users = userInfoMapper.selectMaps(queryWrapper);
System.out.println(users);
selectObjs 的用法和前面的 selectList 很像,都是传入一个查询构造器进行查询,然后返回一个 List。不同在于 selectObjs 返回的 List 里面只有返回的第一个字段值:
UserInfo userInfo = new UserInfo();
userInfo.setAge(22);
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(userInfo);
// 开始查询
List<Object> users = userInfoMapper.selectObjs(queryWrapper);
System.out.println(users);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aGNatyZS-1595310678997)(.\img\5.jpg)]
selectCount 的用法和前面的 selectList 很像,都是传入一个查询构造器进行查询,不同的是 selectCount 返回的是一个 Integer 值(符合条件的记录数):
UserInfo userInfo = new UserInfo();
userInfo.setAge(22);
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(userInfo);
// 开始查询
Integer count = userInfoMapper.selectCount(queryWrapper);
System.out.println(count);
如果觉得默认提供的 CRUD 接口不能满足需求,我们可以添加自己的 SQL 语句,具体有如下两种方案。
我们可以直接在自定义方法上使用 @Select 设置对应的 sql 语句:
public interface UserInfoMapper extends BaseMapper<UserInfo> {
@Select("select * from user_info WHERE age > #{age}")
List<UserInfo> getAll(Integer age);
}
首先在mapper.java 中添加相应的接口方法
public interface UserInfoMapper extends BaseMapper<UserInfo> {
List<UserInfo> getAll(Integer age);
}
然后在 mapper.xml 中添加自定义的 sql 语句
<mapper namespace="com.example.demo.mapper.UserInfoMapper">
<select id="getAll" resultType="com.example.demo.model.UserInfo">
SELECT * FROM user_info WHERE age > #{age}
select>
mapper>
点击跳转至原文地址
--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------
--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------