java第三阶段第十三天--CureGuy

 1、myatis-plus的新用法

新建一个项目MP用来测试mybatis-plus

把pom.xml里原来的mybatis依赖换成plus版的


        <!--mybatis依赖包-->
        <!-- <dependency>
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter</artifactId>
             <version>2.2.0</version>
         </dependency>
 -->
        <!--MP内部已经加载了mybatis,所以无需再次添加jar包-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

编辑yml文件

#语法: 1.key:(空格)value结构
#     2.注意层级缩进
server:
  port: 8090

#整合1.数据源
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root
    #关于密码0 开头的说明
    #password: "0123456"

#SpringBoot整合mybatisPlus
mybatis-plus:
  #指定别名包
  type-aliases-package: com.jt.pojo
  #加载指定的xml映射文件
  mapper-locations: classpath:/mybatis/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

#Sql日志文件打印
logging:
  level:
    com.jt.mapper: debug


编辑测试类

package com.jt;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.StringUtils;

import java.util.List;

//效果:只要@Test测试方法执行,则整个Spring容器启动,可以根据自身的需要实现依赖注入
//注意事项:  该注解只能在测试类中使用.
//         测试类的包路径必须在主启动类的同包及子包中编辑.
@SpringBootTest
class MpApplicationTests {


    @Autowired
    private UserMapper userMapper;
@Test
    public void findAll(){
        List<User>all=userMapper.findAll();
        System.out.println(all);
    }
    /**
     * MP入门案例
     */
    @Test
    public void insertUser() {
        User user = new User();
        user.setId(null).setName("MybatisPlus")
                .setAge(10).setSex("男");
        userMapper.insert(user);
    }

    /**
     * 学习技巧: MP设计思想!!!!  对象
     * 查询Id=1的用户
     */
    @Test
    public void selectById() {
        int id = 1;
        User user = userMapper.selectById(id);
        System.out.println(user);
    }

    /**
     * 查询name="大乔",sex="女"的用户
     * 语法:
     *      1.根据对象中不为null的属性进行业务操作
     *      2.QueryWrapper条件构造器 动态拼接where条件
     *      3.默认的关系连接符 and
     * 例子:
     *      select * from demo_user where xx=xx and xx=xx
     */
    @Test
    public void selectByNS() {
        User user = new User();
        user.setName("大乔").setSex("女");
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        List<User> list = userMapper.selectList(queryWrapper);
        System.out.println(list);
    }

    /**
     * 查询name="大乔",sex="女"的用户
     * 方式2: 利用条件构造器,构建条件
     * 说明:
     *     1. eq =    2. gt >
     *     3. lt <    4. ge >=
     *     5. le <=   6. ne <>
     */
    @Test
    public void selectByNS2() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name","大乔")
                .eq("sex","女");
        List<User> list = userMapper.selectList(queryWrapper);
        System.out.println(list);
    }

    /**
     * 需求: 查询age>18岁的用户,并且sex=男.
     */
    @Test
    public void selectByAS() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("age",18)
                .eq("sex","男");
        List<User> list = userMapper.selectList(queryWrapper);
        System.out.println(list);
    }

    /**
     * 需求: 查询name中包含"君",性别="女"
     * Sql:  where name like "%君%"
     * 需求2: 查询name中以"君"结尾的,性别="女"  like "%君"
     * 语法说明:  likeLeft %  左侧的数据
     */
    @Test
    public void selectLike() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //queryWrapper.like("name","君")   //"%君%"
        queryWrapper.likeLeft("name","君") //"%君"
                .eq("sex","女");
        List<User> list = userMapper.selectList(queryWrapper);
        System.out.println(list);
    }

    /**
     * 需求: 查询id=1,3,4,5的数据 并且按照年龄降序排列
     * 规则: 基本类型有没有方法? 所以使用包装类型
     *      面向对象开发
     */
    @Test
    public void selectIds() {
        Integer[] ids = {1,3,4,5};
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id",ids)
                .orderByDesc("age");
        List<User> list = userMapper.selectList(queryWrapper);
        System.out.println(list);
    }

    /**
     * 需求:
     *  只想获取第一列数据(主键),sex="女"
     * 用法: .selectObjs(queryWrapper);
     * 实际用途: 做关联查询时可以使用
     */
    @Test
    public void selectObjs() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sex","女");
        List list = userMapper.selectObjs(queryWrapper);
        System.out.println(list);
    }

    /**
     * 说明: 根据不为null的属性当做where 动态sql实现
     * 需求: 查询age>18岁,sex=女的用户
     * 参数说明:
     *  1. boolean condition, true时,当前的条件才会成立
     *                        false  该条件不拼接.
     *  2.R column 字段信息
     *  3.Object val 值
     * 判断字符串API:
     *      Spring提供的API StringUtils.hasLength(sex);
     */
    @Test
    public void selectList2() {
        Integer age = null;
        String  sex = "女";
        //判断字符串是否为null
        //boolean flag = sex !=null && "".equals(sex);
        boolean flag = StringUtils.hasLength(sex);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt(age!=null, "age",age )
                .eq(flag,"sex",sex);
        List<User> list = userMapper.selectList(queryWrapper);
        System.out.println(list);
    }
}

MP的动态SQL查询

1. 用户调用接口方法 userMapper.insert(User)方法.
2. 根据UserMapper的接口找到父级接口BaseMapper<T>.
3. 根据父级接口动态获取当前接口的泛型对象T.
4. 根据泛型T 获取指定的注解@TableName("demo_user"),之后获取表名demo_user.
5. 根据泛型对象T,获取其中的属性,之后再找到属性的注解@TableField("id"),之后再次获取注解的值, 即字段名称.
6. 根据字段名称,获取对应属性的值.
7. 根据Sql拼接 形成最终的可以执行的Sql.
8. MP将生成的Sql交给Mybatis执行入库操作.

2、 商品列表的crud

2.1、 编辑service 

package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jt.mapper.ItemMapper;
import com.jt.pojo.Item;
import com.jt.pojo.User;
import com.jt.vo.PageResult;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;

@Service
@Data
public class ItemServiceImpl implements ItemService {

    @Autowired
    private ItemMapper itemMapper;

    @Override
    public PageResult getItemList(PageResult pageResult) {
        QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
        //判断条件: 用户传递query 则添加where条件
        //不用if用Boolean,因为queryWrapper.like(boolean condition, R column, Object val)中的第一个参数是Boolean类型
        String query = pageResult.getQuery();
        boolean flag = StringUtils.hasLength(query);
        queryWrapper.like(flag,"title",query);
        //page接口原来只有2个,经过分页查询之后,有四个结果
        //页数 条数 总数 记录
        IPage<Item> page = new Page<>(pageResult.getPageNum(),pageResult.getPageSize());
        page = itemMapper.selectPage(page,queryWrapper);//分页参数,条件
        //获取总数
        long total = page.getTotal();
        //获取记录数
        List<Item> rows = page.getRecords();
        //返回分页对象
        return pageResult.setTotal(total).setRows(rows);

//        //1.获取总记录数  Integer--long 自动转化
//        long total = itemMapper.findTotal();
//        //2.获取分页结果
//        int size = pageResult.getPageSize();//条数
//        int start = (pageResult.getPageNum() - 1) * size;//起始位置
//        String query=pageResult.getQuery();//查询条件
//        List<User> itemList =
//                itemMapper.getItemListByPage(start,size,query);
//        return  pageResult.setTotal(total).setRows(itemList);//返回分页对象
   }

    @Override
    public void updateItemStatus(Item item) {
        itemMapper.updateById(item);
    }

    @Override
    public void deleteItem(Integer id) {
        itemMapper.deleteById(id);
    }

    @Override
    public void updateItem(Item item) {
        itemMapper.updateById(item);
    }


//    @Override
//    public void addItem(Item item) {
//        item.setStatus(true);
//        itemMapper.insert(item);
//    }
//



}

 2.2、 编辑controller类

@RestController
@CrossOrigin
@RequestMapping("/item")
public class ItemController {
    @Autowired
    private ItemService itemService;

    //请求路径: /item/getItemList?query=&pageNum=1&pageSize=10
    //请求类型: get
    //请求参数: 使用pageResult对象接收
    @GetMapping("/getItemList")
    public SysResult getItemList(PageResult pageResult){
        pageResult=itemService.getItemList(pageResult);
        return SysResult.success(pageResult);

    }
    //请求路径: /item/updateItemStatus
    //请求类型: put
    @PutMapping("/updateItemStatus")
    public SysResult updateItemStatus(@RequestBody Item item){
        itemService.updateItemStatus(item);
        return SysResult.success();
    }
    //请求路径: /item/deleteItemById
    //请求类型: delete

    @DeleteMapping("/deleteItemById")
    public SysResult deleteItemById(@PathVariable Integer id){
        itemService.deleteItemById(id);
        return SysResult.success();
    }

2.3、 页面展示 

2.4 、分页的处理

2.4.1、 设置一个配置类

package com.jt.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//这是一个配置类  相当于早期的xml文件作用
public class MybatisPlusConfig {
/*
js-钩子函数-生命周期函数
MP内部的生命周期方法:
    调用了 itemMapper.selectPage>>会自动调用MybatisPlusInterceptor对象
    @Bean作用:将方法的返回值交给spring容器
*/
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor =new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(
                new PaginationInnerInterceptor(DbType.MARIADB));
    return interceptor;
    }
}

2.4.2、 图文解释

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值