使用springBoot整合mybatis plus,并且用postman向本地数据库查询出一条数据

1.首先,准备阶段,用ideal创建一个springBoot的web项目,并且能够向浏览器端输出hello world,
这里我之前文章有讲述,这里就不在叙述。
2.向已准备好的web项目的pom.xml文件添加以下依赖:

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>${mybatisplus.version}</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatisplus-spring-boot-starter</artifactId>
            <version>${mybatisplus.spring.boot.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>

我个人的完整pom.xml文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tefei</groupId>
    <artifactId>isak</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>isak</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <mybatisplus.version>2.1.9</mybatisplus.version>
        <mybatisplus.spring.boot.version>1.0.5</mybatisplus.spring.boot.version>
        <druid.version>1.1.10</druid.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <!--以下是连接mysql数据库的驱动依赖和mybatis plus相关所需依赖-->
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>${mybatisplus.version}</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatisplus-spring-boot-starter</artifactId>
            <version>${mybatisplus.spring.boot.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.13</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

在以上依赖中,注意,我的mysql驱动依赖版本是8.0.19(因为我本地的mysql版本是8.0,我网上搜了一下对应的驱动版本,发现8.0对应的驱动版本为8.0.19,版本不一,可能还有其它对应的版本,自行对自己的本地mysql的版本添加对应的驱动即可)

3.添加完依赖后,运行项目,发现项目会报一个与url相关的错误,意思大概是你没有配置数据库连接路径,错误如下:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

要解决该错误,向项目的配置文件添加以下代码即可:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      url: jdbc:mysql://localhost:3306/yz_server?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT
      username: root
      password: 1234

以上代码的url要换成自己本地的数据库连接,还有username和password要填写正确。
我个人完整的配置文件如下:

server:
  port: 8081
  servlet:
    context-path: /isak
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      url: jdbc:mysql://localhost:3306/yz_server?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT
      username: root
      password: 1234
#mybatis
mybatis-plus:
  mapper-locations: classpath:mapper/**/*.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.tefei.*.entity
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 0
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 1
    #驼峰下划线转换
    db-column-underline: true
    #刷新mapper 调试神器
    refresh-mapper: true
    #数据库大写下划线转换
    #capital-mode: true
    # Sequence序列接口实现类配置
    #key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
    #逻辑删除配置
    logic-delete-value: -1
    logic-not-delete-value: 0
    #自定义填充策略接口实现
    #meta-object-handler: com.baomidou.springboot.xxx
    #自定义SQL注入器
    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    call-setters-on-nulls: true
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在以上配置都准备完后(项目能够正常运行),就可以开始编写dao、entity、service、mapper和controller了。
个人entity层代码如下:

package com.tefei.isak.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;

/**
 * @author isak
 * @date 2020-03-14 20:16
 */
@TableName("user_detail")
@ApiModel(value = "用户对象")
public class UserDetailEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     *
     */
    @TableId
    private Long id;
    /**
     *
     */
    private String openid;
    /**
     *
     */
    @ApiModelProperty(value = "用户头像")
    private String headimg;
    /**
     *
     */
    @ApiModelProperty(value = "用户昵称")
    private String name;

    /**
     * 性别
     */
    private boolean gender;

    /**
     *
     */
    private String city;
    /**
     *
     */
    private String province;

    private String region;

    /**
     *
     */
    private String address;
    /**
     *
     */
    private String remark;


    private String userCode;
    /**
     *
     */
    private String lgpoint;
    private String phone;
    private String trueName;
    @ApiModelProperty(value = "个人介绍")
    private String introduce;
    /**
     *
     */
    private Date createTime;
    /**
     *
     */
    private Date updateTime;


    @TableField(exist = false)
    private long countOrder;
    @TableField(exist = false)
    private Double sumEarnings;


    private boolean isVip;
    @TableField(exist = false)
    private Long inviteCount;

    private Long level;


    /**
     * 设置:
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * 获取:
     */
    public Long getId() {
        return id;
    }

    /**
     * 设置:
     */
    public void setOpenid(String openid) {
        this.openid = openid;
    }

    /**
     * 获取:
     */
    public String getOpenid() {
        return openid;
    }

    /**
     * 设置:
     */
    public void setHeadimg(String headimg) {
        this.headimg = headimg;
    }

    /**
     * 获取:
     */
    public String getHeadimg() {
        return headimg;
    }

    /**
     * 设置:
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取:
     */
    public String getName() {
        return name;
    }

    /**
     * 设置:
     */
    public void setAddress(String address) {
        this.address = address;
    }

    /**
     * 获取:
     */
    public String getAddress() {
        return address;
    }

    /**
     * 设置:
     */
    public void setRemark(String remark) {
        this.remark = remark;
    }

    /**
     * 获取:
     */
    public String getRemark() {
        return remark;
    }

    /**
     * 设置:
     */
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /**
     * 获取:
     */
    public Date getCreateTime() {
        return createTime;
    }

    /**
     * 设置:
     */
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    /**
     * 获取:
     */
    public Date getUpdateTime() {
        return updateTime;
    }

    public String getUserCode() {
        return userCode;
    }

    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }

    public String getLgpoint() {
        return lgpoint;
    }

    public void setLgpoint(String lgpoint) {
        this.lgpoint = lgpoint;
    }


    public boolean isGender() {
        return gender;
    }

    public void setGender(boolean gender) {
        this.gender = gender;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getTrueName() {
        return trueName;
    }

    public void setTrueName(String trueName) {
        this.trueName = trueName;
    }

    public long getCountOrder() {
        return countOrder;
    }

    public void setCountOrder(long countOrder) {
        this.countOrder = countOrder;
    }

    public Double getSumEarnings() {
        return sumEarnings;
    }

    public void setSumEarnings(Double sumEarnings) {
        this.sumEarnings = sumEarnings;
    }

    public boolean isVip() {
        return isVip;
    }

    public void setVip(boolean vip) {
        isVip = vip;
    }

    public Long getInviteCount() {
        return inviteCount;
    }

    public void setInviteCount(Long inviteCount) {
        this.inviteCount = inviteCount;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public String getIntroduce() {
        return introduce;
    }

    public void setIntroduce(String introduce) {
        this.introduce = introduce;
    }

    public Long getLevel() {
        return level;
    }

    public void setLevel(Long level) {
        this.level = level;
    }
}

以上实体的属性和本地数据库里面的user_detail表的字段相对应。
然后是:dao层代码如下:

package com.tefei.isak.dao;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.tefei.isak.entity.UserDetailEntity;
/**
 * @author isak
 * @date 2020-03-14 20:16
 */
public interface UserDetailDao extends BaseMapper<UserDetailEntity> {

}

该层代码比较简单,只要继承了mybatisplus的BaseMapper即可。
再然后,是书写mapper,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.tefei.isak.dao.UserDetailDao">

    <!-- 可根据自己的需求,是否要使用 -->
    <resultMap type="com.tefei.isak.entity.UserDetailEntity" id="userDetailMap">
        <result property="id" column="id"/>
        <result property="openid" column="openid"/>
        <result property="userCode" column="user_code"/>
        <result property="lgpoint" column="lgpoint"/>
        <result property="name" column="name"/>
        <result property="province" column="province"/>
        <result property="city" column="city"/>
        <result property="region" column="region"/>
        <result property="headimg" column="headimg"/>
        <result property="gender" column="gender"/>
        <result property="address" column="address"/>
        <result property="remark" column="remark"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="phone" column="phone"/>
        <result property="trueName" column="true_name"/>
        <result property="introduce" column="introduce"/>
        <result property="isVip" column="is_vip"/>
        <result property="level" column="level"/>
    </resultMap>

    <select id="queryMaxId" resultType="Long">
        select Max(id) from user_detail
    </select>
    <select id="queryInviteTop" resultType="com.tefei.isak.entity.UserDetailEntity">
        SELECT
        t.total AS inviteCount,
        ud.*
        FROM
        user_detail AS ud
        JOIN
        (SELECT
        COUNT(*) AS total,
        invite_user_id
        FROM
        invite_user
        GROUP BY invite_user_id) AS t
        ON ud.id = t.invite_user_id
        order by total limit #{start},#{end}
    </select>
</mapper>

编写mapper的时候要注意:namespace和type必须对应上面的dao和entity,另外,如果自己书写了sql查询语句的话,resultType也必须和指定entity对应。
接下来就是service和controller了
关于service和serviceImp的代码如下:

package com.tefei.isak.service;

import com.baomidou.mybatisplus.service.IService;
import com.tefei.isak.entity.UserDetailEntity;

/**
 * @author isak
 * @date 2020-03-14 20:16
 */
public interface UserDetailService extends IService<UserDetailEntity> {

}
package com.tefei.isak.service.serviceImp;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.tefei.isak.dao.UserDetailDao;
import com.tefei.isak.entity.UserDetailEntity;
import com.tefei.isak.service.UserDetailService;
import org.springframework.stereotype.Service;



@Service("userDetailService")
public class UserDetailServiceImpl extends ServiceImpl<UserDetailDao, UserDetailEntity> implements UserDetailService {

}

最后,再编写一个controller来调用service的服务就好了,这里说明一下,mybats plus 已经为我们封装好了基本的CRUD了,我们可以直接进行基本的增删改查啦。
controller层代码如下:

package com.tefei.isak.controller;

import com.tefei.isak.common.R;
import com.tefei.isak.entity.UserDetailEntity;
import com.tefei.isak.service.UserDetailService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;




/**
 * @author isak
 * @date 2020-03-14 20:16
 */
@RestController
@RequestMapping("userdetail")
@Api(tags = "用户接口")
public class UserDetailController {

    @Autowired
    private UserDetailService userDetailService;
    @RequestMapping("/info/{id}")
    public R queryById(@PathVariable("id") Long id){
        UserDetailEntity userDetailEntity = userDetailService.selectById(id);
        if(userDetailEntity!=null){
            return R.ok().put("userDetailEntity",userDetailEntity);
        }else{
         return R.error("查詢错误");
        }
    }

}

上面的selectById方法就是mybatis plus为我们封装好的方法(通过主键id查询数据)。
还有就是这个controller层的R对象你可能有不理解的地方。其实这个R对象就是对这个方法的返回数据进行封装,先看返回的数据效果吧,我用postman对controller的接口进行请求,效果如下:


1.PNG

返回的数据格式:

{
    "msg": "success",
    "code": 0,
    "userDetailEntity": {
        "id": 13,
        "openid": "oI1hhw07KPweExgvGo9f713GOzgc",
        "headimg": "http://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLxxZWshOd9XZBjRYnwgLTjAkmHnDyJN08RA2OIG4qicd5DScXdsyzfFb0QCLQhktK0ug791ryEjUg/132",
        "name": "Xiongfan",
        "gender": true,
        "city": "九江",
        "province": "江西",
        "region": null,
        "address": null,
        "remark": null,
        "userCode": "10013",
        "lgpoint": null,
        "phone": null,
        "trueName": "Xiongfan",
        "introduce": null,
        "createTime": "2019-12-06T12:05:15.000+0000",
        "updateTime": "2019-12-06T12:05:15.000+0000",
        "countOrder": 0,
        "sumEarnings": null,
        "inviteCount": null,
        "level": 1,
        "vip": false
    }
}

如果你不熟悉这个R对象的话,我们对controller进行改进:改进的代码如下(修改方法返回对象)

package com.tefei.isak.controller;

import com.tefei.isak.common.R;
import com.tefei.isak.entity.UserDetailEntity;
import com.tefei.isak.service.UserDetailService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;




/**
 * @author isak
 * @date 2020-03-14 20:16
 */
@RestController
@RequestMapping("userdetail")
@Api(tags = "用户接口")
public class UserDetailController {

    @Autowired
    private UserDetailService userDetailService;
    @RequestMapping("/info/{id}")
    public UserDetailEntity queryById(@PathVariable("id") Long id){
        UserDetailEntity userDetailEntity = userDetailService.selectById(id);
        if(userDetailEntity!=null){
            return userDetailEntity;
        }else{
         return null;
        }
    }

}

然后再用postman进行模拟,效果如下:


1.PNG

返回的数据格式

{
    "id": 13,
    "openid": "oI1hhw07KPweExgvGo9f713GOzgc",
    "headimg": "http://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLxxZWshOd9XZBjRYnwgLTjAkmHnDyJN08RA2OIG4qicd5DScXdsyzfFb0QCLQhktK0ug791ryEjUg/132",
    "name": "Xiongfan",
    "gender": true,
    "city": "九江",
    "province": "江西",
    "region": null,
    "address": null,
    "remark": null,
    "userCode": "10013",
    "lgpoint": null,
    "phone": null,
    "trueName": "Xiongfan",
    "introduce": null,
    "createTime": "2019-12-06T12:05:15.000+0000",
    "updateTime": "2019-12-06T12:05:15.000+0000",
    "countOrder": 0,
    "sumEarnings": null,
    "inviteCount": null,
    "level": 1,
    "vip": false
}

由此可见,关于这个R对象,只是把请求的数据以不同形式进行返回。
自此,一个关于springBoot的web项目简单整合mybatis plus就完毕啦。
补充:
所查询的数据在数据库中如下图所示:


1.PNG

ps:加上俺的项目目录结构截图,方便理解


1.PNG

(天啦撸,这个整合我弄了好几次,一直失败,这次终于成功了,赶紧写个简书总结一下,万一哪天忘了 = _ =)
每天进步一点点,学习很重要,但感觉总结更重要啊!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,578评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,701评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,691评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,974评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,694评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,026评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,015评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,193评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,719评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,442评论 3 360
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,668评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,151评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,846评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,255评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,592评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,394评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,635评论 2 380