MyBatis-Plus(第一篇开山篇)

导读:本篇文章讲解 MyBatis-Plus(第一篇开山篇),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

MyBatis-Plus(第一篇开山篇)

官网:
https://baomidou.com/

是基于mybatis的一个框架

特点:在项目启动的时候,帮我们生成指定数据库表对应的service层以及mapper层的crud功能

注意:mybatis plus不能实现连表查询

结论:

1.项目中单表的所有crud交给mybatis plus完成
2.复杂的连表查询功能自己实现

使用mybatis plus步骤

1.导包
2.整合
3.使用

1.导包

说明: MP的jar包与Mybatis的jar包冲突. 只能添加一个

<!--        <dependency>-->
<!--            <groupId>org.mybatis</groupId>-->
<!--            <artifactId>mybatis-spring</artifactId>-->
<!--            <version>2.0.4</version>-->
<!--        </dependency>-->

<!--        <dependency>-->
<!--            <groupId>org.mybatis</groupId>-->
<!--            <artifactId>mybatis</artifactId>-->
<!--            <version>3.5.6</version>-->
<!--        </dependency>-->

        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.5.1</version>
        </dependency>

2.整合(修改spring-dao配置文件)

spring-dao.xml

修改为mybatis-plus提供的SqlSessionFactoryBean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">


   
	...
    <!--    修改为mybatis-plus提供的SqlSessionFactoryBean-->
    <bean class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean" id="factoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis.xml"/>
    </bean>

</beans>

3.使用

3.1 javaBean

点击DataSource->点击“+”
在这里插入图片描述
点击DataSource->点击MySQL
在这里插入图片描述
驱动选择MySQL for 5.1
输入主机IP、端口号、数据库的用户名和密码->点击Test Connection
在这里插入图片描述
点击Download Driver Files
在这里插入图片描述
测试成功->点击OK
在这里插入图片描述
点击1 of 6 选择数据库
在这里插入图片描述
使用MybatisX插件,详细可参考我的另一篇博客——《MybatisX插件 逆向工程》https://huanghaoheng.blog.csdn.net/article/details/127955285
选择你想要逆向生成的表->右击->点击MybatisX-Generator

在这里插入图片描述

在这里插入图片描述
annotation 选择 Mybatis-Plus 3
options 勾选 Lombok
template 选择 mybatis-plus
在这里插入图片描述
//声明当前Javabean对应的数据库表的名称
@TableName(value =“数据库表名”)
//TableId注解声明当前属性对应的数据库表中的字段为主键
@TableId(type = IdType.AUTO)
//TableField 声明当前属性对应的数据库表中的字段为普通字段
//exist = false 声明告诉mybatis-plus 这个属性在对应的数据库表中没有匹配的字段
@TableField(exist = false)

package com.bjpowernode.mybatisPlusDemo.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 
 * @TableName course
 */
//声明当前Javabean对应的数据库表的名称
@TableName(value ="course")
@Data
@Accessors(chain = true)
public class Course implements Serializable {
    /**
     * id
     */
    //TableId注解声明当前属性对应的数据库表中的字段为主键
    @TableId(type = IdType.AUTO)
    private Integer id;

    /**
     * 课程名
     */
    private String courseName;

    /**
     * 课程一句话简介
     */
    private String brief;

    /**
     * 原价
     */
    private Double price;

    /**
     * 原价标签
     */
    private String priceTag;

    /**
     * 优惠价
     */
    private Double discounts;

    /**
     * 优惠标签
     */
    private String discountsTag;

    /**
     * 描述markdown
     */
    private String courseDescriptionMarkDown;

    /**
     * 课程描述
     */
    private String courseDescription;

    /**
     * 课程分享图片url
     */
    private String courseImgUrl;

    /**
     * 是否新品
     */
    private Boolean isNew;

    /**
     * 广告语
     */
    private String isNewDes;

    /**
     * 最后操作者
     */
    private Integer lastOperatorId;

    /**
     * 自动上架时间
     */
    private Date autoOnlineTime;

    /**
     * 记录创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 是否删除
     */
    private Boolean isDel;

    /**
     * 总时长(分钟)
     */
    private Integer totalDuration;

    /**
     * 课程列表展示图片
     */
    private String courseListImg;

    /**
     * 课程状态,0-草稿,1-上架
     */
    private Integer status;

    /**
     * 课程排序,用于后台保存草稿时用到
     */
    private Integer sortNum;

    /**
     * 课程预览第一个字段
     */
    private String previewFirstField;

    /**
     * 课程预览第二个字段
     */
    private String previewSecondField;

    /**
     * 销量
     */
    private Integer sales;

    //TableField 声明当前属性对应的数据库表中的字段为普通字段
    //exist = false 声明告诉mybatis-plus 这个属性在对应的数据库表中没有匹配的字段
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

3.2 mapper层

package com.bjpowernode.mybatisPlusDemo.mapper;

import com.bjpowernode.mybatisPlusDemo.domain.Course;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * @Entity com.bjpowernode.mybatisPlusDemo.domain.Course
 * mybatis plus的dao接口  继承另一个接口:BaseMapper
 * 这个接口中帮我们定义好了dao层的基本的crud的所有的抽象方法
 * 我们启动项目的时候,会生成CourseMapper接口的实现类对象,mybatis-plus会帮我们将该实现对象实现此接口的所有方法
 */
public interface CourseMapper extends BaseMapper<Course> {

3.3 service层

3.3.1 service接口
package com.bjpowernode.mybatisPlusDemo.service;

import com.bjpowernode.mybatisPlusDemo.domain.Course;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * mybais-plus的servici接口
 * 继承了另一个接口:IService
 * 此接口帮我们将业务层的curd方法都声明好了
 */
public interface CourseService extends IService<Course> {

}
3.3.2 service实现类
package com.bjpowernode.mybatisPlusDemo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjpowernode.mybatisPlusDemo.domain.Course;
import com.bjpowernode.mybatisPlusDemo.service.CourseService;
import com.bjpowernode.mybatisPlusDemo.mapper.CourseMapper;
import org.springframework.stereotype.Service;

/**
 * mybatis-plus的service层的实现类
 * 继承了另一个类ServiceImpl
 * 这个类自动的帮我们依赖了对应的mapper实现,然后通过调用该mapper实现的方式实现了service接口的每一个抽象方法
 */
@Service
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
    implements CourseService{

}

3.4 测试类

package com.bjpowernode.TestMybatisPlus;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bjpowernode.mybatisPlusDemo.domain.Course;
import com.bjpowernode.mybatisPlusDemo.service.CourseService;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;
import java.util.function.Consumer;

public class MyTest {

    private CourseService courseService = null;

    /*
    *执行任何一个@Test方法之前 都一定会先执行当前被@Before标注的方法
    */
    @Before
    public void before(){
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-service.xml");
        courseService = context.getBean("courseServiceImpl", CourseService.class);
    }

    @Test
    public void testAdd(){
        Course course = new Course();
        course.setCourseName("haha");
        courseService.save(course);
    }

    @Test
    public void testDelete(){
        courseService.removeById(33);
    }

    @Test
    public void testDelete2(){
        courseService.removeById(37);
    }

    @Test
    public void testUpdate(){
        Course course = new Course();
        course.setId(32).setCourseName("动力节点Java培训班");
        courseService.updateById(course);

    }

    @Test
    public void testFindOne(){
        Course course = courseService.getById(31);
        System.out.println("course = " + course);
    }

    @Test
    public void testFindAll(){
        List<Course> courseList = courseService.list();
        System.out.println("courseList = " + courseList);
    }

    /**
     *测试自定义查询条件
     * 1.创建条件装饰器
     * 2.调用查询的方法 将条件装饰器作为参数
     */
    @Test
    public void testFindByQueryWrapperEq() {
        //1.创建条件装饰器
        QueryWrapper<Course> qw = new QueryWrapper<>();
        /*封装自定义的条件
         * eq:表示条件 是 判断是否相等
         * status:参与判断的字段名称
         * 1:判断是否相等的具体的值
         *
         * 最终的效果:where course_name = '大数据'
         * */
        qw.eq("status", 1);
        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);

        /*
        *eq: 是否相等 -
        * like:模糊查询 -
        * likeleft:模糊查询以指点值结尾 -
        * likeRight:模糊查询以指点值开头 -
        * gt:是否大于
        * ge:是否大于等于
        * lt:是否小于
        * le:是否小于等于
        */
    }

    @Test
    public void testQueryWrapperGt(){
        QueryWrapper<Course> qw = new QueryWrapper<>();
        qw.gt("id",14);
        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);
    }

    @Test
    public void testQueryWrapperGe(){
        QueryWrapper<Course> qw = new QueryWrapper<>();
        qw.ge("id",14);
        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);
    }

    @Test
    public void testQueryWrapperLt(){
        QueryWrapper<Course> qw = new QueryWrapper<>();
        qw.lt("id",14);
        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);
    }

    @Test
    public void testQueryWrapperLe(){
        QueryWrapper<Course> qw = new QueryWrapper<>();
        qw.le("id",14);
        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);
    }



    /*
     * likeleft:like %"XXX" 模糊查询以指点值"XXX"结尾
     */
    @Test
    public void testQueryWrapperLikeLeft(){
        QueryWrapper<Course> qw = new QueryWrapper<>();
        qw.likeLeft("course_name", "工程师");
        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);
    }

    /*
     * likeRight:like "xxx"% 模糊查询以指点值"XXX"开头
     */
    @Test
    public void testQueryWrapperLikeRight(){
        QueryWrapper<Course> qw = new QueryWrapper<>();
        qw.likeRight("course_name", "Vue");
        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);
    }

    /**
     *测试自定义查询条件
     * 1.创建条件装饰器
     * 2.调用查询的方法 将条件装饰器作为参数
     */
    @Test
    public void testFindByQueryWrapperLike() {
        QueryWrapper<Course> qw = new QueryWrapper<>();
        /*
        * 相当于 where course_name like "%全栈%"
        */
        qw.like("course_name","全栈");
        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);
    }

    /**
     *测试自定义查询条件
     * 1.创建条件装饰器
     * 2.调用查询的方法 将条件装饰器作为参数
     */
    @Test
    public void testFindByQueryWrapperLikeAndEq() {
        QueryWrapper<Course> qw = new QueryWrapper<>();

        /*
        *相当于在查询的sql语句后面拼接了条件:AND course_name like "%全栈%"
        */
//        qw.like("course_name","全栈");
//        qw.eq("status",0);

//        qw.like("course_name","全栈").eq("status",0);

//        qw.like("course_name","全栈").and(new Consumer<QueryWrapper<Course>>() {
//            @Override
//            public void accept(QueryWrapper<Course> courseQueryWrapper) {
//                courseQueryWrapper.eq("status",0);
//            }
//        });

        qw.like("course_name","全栈").and((x)->{
            x.eq("status",0);
        });

        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);
    }

    @Test
    public void testFindByQueryWrapperLikeOrEq(){
        QueryWrapper<Course> qw = new QueryWrapper<>();

//        qw.like("course_name","全栈工程师");
//        qw.or();
//        qw.eq("course_name","秒杀11");

//        qw.like("course_name","全栈工程师").or().eq("course_name","秒杀11");

//        qw.like("course_name","全栈工程师").or(new Consumer<QueryWrapper<Course>>() {
//            @Override
//            public void accept(QueryWrapper<Course> courseQueryWrapper) {
//                courseQueryWrapper.eq("course_name","秒杀11");
//            }
//        });

        qw.like("course_name","全栈工程师").or(x->{
            x.eq("course_name","秒杀11");
        });

        List<Course> courseList = courseService.list(qw);
        System.out.println("courseList = " + courseList);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/85529.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!