1.用My语法来查询数据库
1.1查询数据库(单)
@Test public void selectById(){ int id=231; //模拟用户参数 User user=userMapper.selectById(id);//对象 System.out.println(user); }
1.2MyBatis语法查询指定name,sex等数据
@Test
public void test001(){
//条件构造器,根据对象不为null充当where条件
//通过对象进行封装数据
User user=new User();
user.setName("小乔").setSex("女");
//where name="" and sex=""
QueryWrapper<User> queryWrapper=new QueryWrapper(user);
//根据条件构造器,实现查询(唯一用select,多个用selectList)
List<User> userList=userMapper.selectList(queryWrapper);
System.out.println(userList);
}
1.3查询有标识符( = eq, >gt, <lt, >=ge, <=le, !=ne)
//查询有< =等标识符 @Test public void select03(){ //mybatis写法 //List<User> userList = userMapper.findList(18,"女"); //System.out.println(userList);(需要通过xml写SQL数据库) //mp写法 QueryWrapper<User> queryWrapper=new QueryWrapper<>(); queryWrapper.lt("age", 18) .eq("sex", "女"); List<User> userList2=userMapper.selectList(queryWrapper); System.out.println(userList2); }
1.4查询name包含"君"的
//查询name包含“君”的(以君开头:以like“君%” // 以君结尾:liek “%君”) @Test public void select04(){ QueryWrapper queryWrapper =new QueryWrapper(); queryWrapper.like("name", "君"); List<User> userList = userMapper.selectList(queryWrapper); System.out.println(userList); }
1.5查询结果,按照排序
//查询 sex=女,按照年龄来排序 @Test public void select05(){ QueryWrapper<User> queryWrapper=new QueryWrapper<>(); queryWrapper.eq("sex", "女") .orderByDesc("age"); List<User> userList=userMapper.selectList(queryWrapper); System.out.println(userList); }
1.6查询结果不为null(指定结果)
/根据name/age查询不为null的 //动态数据查询,如果数据有值,则平街where条件 //如果数据为null,则不拼接where条件 @Test public void select06(){ String name= "貂蝉"; int age = 18; boolean nameFlag=name ==null ? false : true; boolean ageFlag= age == 0 ? false : true; QueryWrapper<User> queryWrapper=new QueryWrapper<>(); queryWrapper.eq(nameFlag, "name", name) .eq(ageFlag, "age", age); List<User> userList=userMapper.selectList(queryWrapper); System.out.println(userList); }
1.7批量查询
//批量查询,id=1,4,5,6,...的数据 public void selectIn(){ QueryWrapper<User> queryWrapper=new QueryWrapper<>(); queryWrapper.in("id", 1,4,5,6); queryWrapper.in("id", "1,4,5,6"); List<User> userList=userMapper.selectList(queryWrapper); System.out.println(userList);
//批量查询,利用数组转集合的方式 Integer[] array=new Integer[]{1,4,5,6}; //数组转集合 List<Integer> ids= Arrays.asList(array); List<User> userList2=userMapper.selectBatchIds(ids); System.out.println(userList2);
}
1.8只查询性别为男的用户,但只要id字段
//查询性别为男性的用户,只查询ID字段 @Test public void selectObjs(){ QueryWrapper<User> queryWrapper=new QueryWrapper<>(); queryWrapper.eq("sex", "男"); List<Object> ids=userMapper.selectObjs(queryWrapper); System.out.println(ids); }
2.查询总结
MP核心:以对象的方式操作数据库
条件构造器:new QueryWrapper<>(); 动态拼接where条件
拼接规则:根据对象中部位null的属性充当where条件
特殊字符: = eq ,>gt , <lt ,>=ge ,<=le ,!=ne
xml文件万能的转义字符:<![CDATA[SQL语句]]>
关键字:like order by in
动态SQL语法:
conditi:true 拼接where条件
false 不拼接where条件
3进阶---按级查询
循环查询,多次遍历,数据过多,导致数据库查询次数过多,效率极低
@Override
public List<ItemCat> findItemCatList(Integer leve){
//查询一级商品分类
QuerWrapper<ItemCat> querWrapper = new QuerWrapper<>();
querWrapper.eq("parent_id",0);
List<ItemCat> oneList = itemCatMapper.selectList(querWrapper);
//查询二级商品(需要处理一级商品)
for(ItemCat oneItemCat: oneList){
//为了复用条件构造器,要清空数据
querWrapper.clear();
//查询二级数据 parent_id = 一级id
querWrapper.eq("parent_id",oneLtemCat.getId());
List<ItemCat> twoList = itemCatMapper.selectList(querWrapper);
//遍历耳机列表,查询三级数据,封装
oneletemCat.setChildren(twoList);
}
return oneList;
}
4进阶----按级分配优化
规则:就是遍历数据,如果该类父级不存在,准备list集合,将自己作为第一个元素,
如果该类数据存在,获取list集合,将自己追加到其中。
1.遍历数据for(){}
for(ItemCat in=temCat:list){
int parentId=itemCat.getParentId();
if(map.containsKey(parentId)){
map.get(parentId).add(itemCat);
}else{
//key不存在时,定义list集合,将自己作为第一个元素
List<ItemCat> chilrenList = new ArrayList<>();
childrenList.add(itemCat);
map.put(parentId,childrenList);
}
}
@Voerride