一. MP实现原理
- 对象与表一一对应@TableName("item")
- 对象的属性与表的字段一一对应@TableField("id") 如果字段名称与属性名称一致,则省略,包含驼峰规则 (@TableId(type = IdType.AUTO)主键自增)
- MP将常见的CURD的接口方法进行了封装,只需要Mapper层实现接口BaseMapper<Item>.
- MP根据自定的接口,动态的生成CURD的Sql,从此单表操作,程序员无需编辑Sql.
二. 具体配置流程:
三. 测试:
1) 增
对象不为null的属性自动插入表中对应字段中
/**
* 2.测试数据新增入库操作
* 核心: 以对象的方式操作数据库
*/
@Test
public void test02(){
Item item = new Item();
item.setTitle("商品标题信息")
.setSellPoint("卖点信息")
.setNum(100);
itemMapper.insert(item);
}
2) 删
3) 改
4) 查
①简单查询
// 查询所有数据
public void test01(){
//查询全部数据,不需要条件
List<Item> list = itemMapper.selectList(null);
}
// 查询id=1的数据
public void test03(){
Item item = itemMapper.selectById(1);
}
/**
* 查询: 只查询主键信息,
* 适用场景: 适用关联查询!!! 主键可以被其它的关联
*/
public void test10(){
List idList = itemMapper.selectObjs(null);
}
/**
* 4.根据title/sellPoint查询数据
* 查询titile="手机" and sellPoint="贵就好"
* 核心:
* 1.以对象的方式操作数据库.
* 2.根据对象中不为null的属性,充当条件
*/
public void test04(){
//对象的方式封装数据,只能实现and连接
Item item = new Item();
item.setTitle("手机").setSellPoint("贵就好");
//条件构造器: 动态拼接where条件的 set赋值解析之后变为 =号 默认使用and进行拼接
QueryWrapper<Item> queryWrapper = new QueryWrapper<>(item);
List<Item> list = itemMapper.selectList(queryWrapper);
}
/**
* 查询 价格大于500,小于200000
* 1.条件构造器的连接符:
* 1.等号 = eq
* 2.大于 > gt
* 3.小于 < lt
* 4.大于等于 >= ge
* 5.小于等于 <= le
* 6.不等于 != ne
* 2.条件间关联用法 默认使用and连接,
* 如果使用or,则写or方法
*/
public void test05(){
QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("price",500)
//.or()
.lt("price",200000);
List<Item> list = itemMapper.selectList(queryWrapper);
}
// 按照条件查询单条数据
public void test01(){
QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("price",500)
//.or()
.lt("price",200000);
Item item = itemMapper.selectOne(queryWrapper);
}
/**
* 查询: title中包含"华为"的数据
* Sql: select * from item where title like "%华为%"
* 知识点:
* 1. 以xxx开头 "xxx%" 右侧 LikeRight
* 2. 以xxx结尾 "%xxx" 左侧 likeLeft
* 3. xxx "%xxx%" like
*/
public void test07(){
QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
queryWrapper.like("title","华为");
List<Item> list = itemMapper.selectList(queryWrapper);
}
/**
* 查询: id为 1,2,3,4的数据
* 必须用引用类型的数组
* Sql: select * from item where id in (1,2,3,4)
*/
public void test08(){
Integer[] ids = {1,2,3,4}; // 不能使用基本类型int
QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
queryWrapper.in("id",ids);
List<Item> list = itemMapper.selectList(queryWrapper);
//2.API2 数组转化为集合
List idList = Arrays.asList(ids);
List<Item> list2 = itemMapper.selectBatchIds(idList);
}
②复杂查询
/**
* 查询价格大于600的商品,并且要求按照 价格降序排列.
* Sql:select * from item where price>600 order by price desc
*/
public void test06(){
QueryWrapper<Item> queryWrapper = new QueryWrapper();
queryWrapper.gt("price",600)
.orderByDesc("price");
List<Item> list = itemMapper.selectList(queryWrapper);
}
/**
* 查询: 根据对象中不为null的数据,查询数据库
* 核心知识点: 动态sql拼接
*/
public void test09(){
String title = "";
String sellPoint = "工艺好";
QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.hasLength(title),"title",title);
queryWrapper.eq(StringUtils.hasLength(sellPoint),"sell_point",sellPoint);
List<Item> list = itemMapper.selectList(queryWrapper);
}
③分页查询
/**
* 1.获取满足条件的记录总数
* 2.进行分页操作
* 原则:
* 1.手写Sql 业务层级简单,Sql高效直观.
* 2.利用MP实现 业务层复杂, Sql不写
* Sql: select * from item limit 起始位置,条数
* @param pageResult
* @return
*/
@Override
public PageResult getItemList(PageResult pageResult) {
QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
queryWrapper.like("title", pageResult.getQuery());
//2.完成分页操作
//2.1 准备一个分页对象,MP基于初始化条件,获取分页其它数据
IPage<Item> page = new Page<>(pageResult.getPageNum(),
pageResult.getPageSize());
page = itemMapper.selectPage(page,queryWrapper);
//2.2 获取总数,获取记录数
long total = page.getTotal();
List<Item> list = page.getRecords();
return pageResult.setTotal(total).setRows(list);
}