mybatis_plus
常用注解:
-
@TableName : 当表名跟实体类名字不一样时, 可以指定映射数据库那张表, 默认跟类名一致
-
@TableField : 映射表的列名, 也可以在合并sql的时候会自动扫描实体类的字段, 而当需求需要在实体类中创建一些表列名对应不上的字段时, 可以使用, TableField 有个exist属性, 指是否映射表列 false 不映射
-
@TableId : 主键注解, 一般使用type属性, AUTO 数据库ID自增
@TableName(value = "t_employee") //当表名跟实体类名字不一样时 @TableField(exist = false) @TableId(type = IdType.AUTO)
日志
//推荐用这种 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
条件构造器
根据输入的条件生成sql的where条件(但不适用于多表查询, 多表查询还是用xml.写)
有4个类
-
UpdateWrapper
-
LambdaUpdateWrapper
见名知意, 这两个都是用于跟新操作
-
QueryWrapper
-
LambdaQueryWrapper
两个普通两个Lambda 他们用法基本相同, 普通的条件需要手写, 有手误的可能, Lambda 采用字段, 手误的可能很少
里面的方法 eq = 等于 alleq = 都等于 ne != 不等于 gt > 大于 lt < 小于 ge >= 大于等于 le <= 小于等于 between 值1 and 值2 notBetween not值1 and 值2 like %值% likeLeft : LIKE '%值' likeRight : LIKE '值%' or 可以用于拼接, 可以用于嵌套 and 默认用and连接, 可以用于嵌套 notLike not%值% isNull 为NUll isNotNull 不为空 in 值在里面 notIn 值不在里面 inSql 写intsql notInsql 写notInSql groupBy 分组 orderByAsc 正序 orderByDesc 降序 having 设置条件 //UpdateWrapper 和 LambdaUpdateWrapper //更新name=dafei员工年龄为20岁 @Test public void update2(){ /*UpdateWrapper<Employee> wrapper = new UpdateWrapper<>();*/ /*wrapper.eq("name","dafei").set("age",20);*/ LambdaUpdateWrapper<Employee> wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(Employee::getName,"dafei").set(Employee::getAge,20); employeeMapper.update(null,wrapper); } //QueryWrapper 和 LambdaQueryWrapper //查询name=dafei, age=18的用户 @Test public void queryWrapper(){ /*QueryWrapper<Employee> wrapper = new QueryWrapper<>(); wrapper.eq("name","dafei") .eq("age",18); employeeMapper.selectList(wrapper);*/ /*HashMap<String, Object> map = new HashMap<>(); map.put("name","dafei"); map.put("age",18); employeeMapper.selectByMap(map);*/ LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Employee::getName,"dafei") .eq(Employee::getAge,18); employeeMapper.selectList(wrapper); }
//书写顺序: • select->distinct->from->join->on->where->group by->having->order by->limit • 必须字段:select、from • 可选字段:distinct、join、on、where、group by、having、sum、count、max、avg、order by、limit //执行顺序 • from->on->join->where->group by(开始使用select中的别名,后面的语句中都可以使用别名)->sum、count、max、avg->having->select->distinct->order by->limit
高级查询
列投影 可以指定返回查询后的列 /*QueryWrapper<Employee> wrapper = new QueryWrapper<>(); wrapper.select("name","age");*/ LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>(); wrapper.select(Employee::getName,Employee::getAge); /*QueryWrapper<Employee> wrapper = new QueryWrapper<>();*/ LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>(); wrapper.select(Employee.class,m->m.getProperty().startsWith("a")); 正序 orderByAsc /*QueryWrapper<Employee> wrapper = new QueryWrapper<>(); wrapper.orderByAsc("age").orderByAsc("id");*/ LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>(); wrapper.orderByAsc(Employee::getAge).orderByAsc(Employee::getId); 分组groupBy QueryWrapper<Employee> wrapper = new QueryWrapper<>(); wrapper.groupBy("dept_id") .select("dept_id,count(*) count") .having("count > 3"); or嵌套 QueryWrapper<Employee> wrapper = new QueryWrapper<>(); wrapper.like("name", "fei") .or(wr -> wr.le("age", 30).ge("age", 18)); and嵌套 QueryWrapper<Employee> wrapper = new QueryWrapper<>(); wrapper.like("name", "fei") .and(wr -> wr.le("age", 30) .or() .ge("age", 18));
MP多表查询
还是使用mapper.xml的方式, 清晰明了
Service接口
常用方法: getBaseMapper() : 返回引用mapper对象 getOne(wrapper) : 按指定条件查询一个, 注意如果数据库有超过一个数据报错 list(wrapper) : 返回list集合 page(page, wrapper) : 分页 业务层接口继承 IService接口 public interface IEmployeeService extends IService<Employee> { } 而业务层实现类 实现ServiceImpl这个类 这个类要传两个参数一个是mapper接口, 一个是对应的实体类 public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements IEmployeeService { } 分页 public IPage<Employee> queryPage(EmployeeQueryObject qo) { IPage<Employee> page = new Page<>(qo.getCurrentPage(),qo.getPageSize()); QueryWrapper<Employee> wrapper = new QueryWrapper<>(); //判断是否有传参数 wrapper.like(StringUtils.hasLength(qo.getKeyword()),"name",qo.getKeyword()); //调用父类 return super.page(page,wrapper); } 事务还是用以前贴注解的方式 @Transactional
不多废话,觉得有用点点赞三连