Springboot 整合mybatis详细教程

前言:

各位同学大家好,最近在学习springboot整合mybatis的知识点,正好放假有时间写了一个springboot整合mybatis的经典案例所以就分享大家,希望能帮助到同学对于springboot框架的学习,那么废话不多说我们正式开始

准备工作

1安装好idea 或者eclispe +sts开发环境
2安装maven 并配置环境

需要用到三方库

  <!--java -web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--数据库依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

建表语句

/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 5.7.17-log : Database - mybdtisdemo
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybdtisdemo` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;

USE `mybdtisdemo`;

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `password` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `age` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `sex` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

/*Data for the table `user` */

insert  into `user`(`id`,`name`,`password`,`age`,`sex`) values (2,'xuqing','xq9527','27','男');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

application.ymal 的配置 如下图:

server:
  port: 8090
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/mybdtisdemo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true
    username: root
    password: 123456
  #配置Mapper.xml映射文件
mybatis:
  mapper-locations: classpath*:mybatis/mapper/*.xml

准备按设置了utf-8编码和 serverTimezone=UTC 和时区 以及数据库账号和密码 jdbc 驱动 这些都配置好以后我们启动一下


QQ截图20200913193815.png

我们看到项目正常的启动了我们打开postman工具访问一下 测试的接口

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserService userservice;
    @RequestMapping("/index")
    public  Object index(){
        return  "部署成功";
    }
QQ截图20200913193929.png

我们看到有一个部署成功的字符串返回 项目整个算是正常启动成功我们需要加入一些业务逻辑代码来配合Sprigboot整合mybatis框架 来实现我们的业务需求

具体实现:

1创建bean类(数据模型)

package com.example.mybatis_demo.bean;
public class User {
    private int id;
    private String name;
    private String password;
    private String age;
    private String sex;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

bean类里面的属性我们最好要跟我们数据库对应表中的字段保持一致

2创建 Mapper类

package com.example.mybatis_demo.dao;
import com.example.mybatis_demo.bean.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UserDao {
    @Select("select * from  user")
   public List<User>getallUser();

    @Select("select * from  user  where  id= #{id}")
    public User getuserbyId(Integer id);

    @Insert("insert into user (name,password, age ,sex) values (#{name},#{password},#{age},#{sex})")
    int addUser(User user);

    @Select("select * from  user  where  name= #{name}")
    public User getuserbyname(String name);

    @Update("update  user set password =#{password}  where  name= #{name}")
    public  int  upDatePassword(@Param("name") String name,
                                @Param("password") String password);
    @Delete("delete from user WHERE id = #{id}")
    int  deleteUser(@Param("id")Integer id);
}

我们需要用到的sql语句我们都在 Mapper类中用注解来实现 我们就不需要在Contorller中写大量的sql语句了是不是使得代码可读性和管理也方便

3创建service 层

package com.example.mybatis_demo.service;
import com.example.mybatis_demo.bean.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import java.util.List;

public interface UserService {
     List<User> getallUser();
    User getuserbyId(Integer id);
    int addUser(User user);
    User getuserbyname(String name);
    String  upDatePassword(String name, String password, String newpsw);
    int  deleteUser(Integer id);
}

service 层的接口类定义的一些方法(包括增删改查的方法)是给controller 来调用的

4处理service 层 实现层 impl层

package com.example.mybatis_demo.service.impl;
import com.example.mybatis_demo.bean.User;
import com.example.mybatis_demo.dao.UserDao;
import com.example.mybatis_demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service(value = "userService")
public class UserServiceimpl implements UserService {
    @Autowired
    UserDao userDao;
    @Override
    public List<User> getallUser() {
        return userDao.getallUser();
    }
    /**
     * @param id
     * @return
     * 通过头id查询数据
     *
     *
     */
    @Override
    public User getuserbyId(Integer id) {
        return userDao.getuserbyId(id);
    }

    /**
     * @param user
     * @return
     * 添加数据
     */
    @Override
    public int addUser(User user) {
        return userDao.addUser(user);
    }

    //通过用户名查询数据
    @Override
    public User getuserbyname(String name) {
        return null;
    }
    /**
     * @param name
     * @param password
     * @return
     * 更新数据
     *
     */
    @Override
    public String upDatePassword(String name, String password, String newpsw) {
          User user=userDao.getuserbyname(name);
          if(user!=null){
            if(user.getPassword().equals(password)){
                  userDao.upDatePassword(name,newpsw);
                  return "success";
              }else{
                  return "defeated";
              }
          }else{
              return  "fail";
          }
    }
    @Override
    public int deleteUser(Integer id) {
        return userDao.deleteUser(id);
    }

}

这一层是真正的sercvie业务逻辑的实现我们需要用Autowired 这个注解来引入刚才的 Mapper类来处理对数据库里面的数据操作(增删改查)


QQ截图20200913195822.png

通常大家在使用的时候

 @Autowired
  UserDao userDao;

都会有红色报错提示 这个不用管 这是IDE的问题我们的代码可以正常运行的

5 controller 层具体业务逻辑实现:

1添加数据:

  @RequestMapping("/adduser")
    public  Object addUser(
                           @RequestParam (value = "name")String name,
                           @RequestParam (value = "password")String password,
                           @RequestParam (value = "age")String age,
                           @RequestParam (value = "sex")String sex){
        Map<String,Object>map=new HashMap<>();
        User user=new User();
        user.setName(name);
        user.setPassword(password);
        user.setAge(age);
        user.setSex(sex);
        int addcode=userservice.addUser(user);
        if(addcode==1){
            map.put("code",200);
            map.put("msg","添加数据成功");
        }else {
            map.put("code",100);
            map.put("msg","添加数据失败");
        }
        return map;
    }

我们打开postman测试一下


QQ截图20200913193902.png

接口给我们返回添加数据成功,我们打开数据库可视化工具查询下


QQ截图20200913200440.png

我们看到数据库里面已经插入一条数据了

2查询数据:

2.1查询所有数据
    @RequestMapping("/getalluser")
    public  Object getAllUser(){
        List<User>data=userservice.getallUser();
        Map<String,Object>map=new HashMap<>();
        if(data!=null&&data.size()>0){
            map.put("code",200);
            map.put("msg","获取数据成功");
            map.put("data",data);
        }else{
            map.put("code",100);
            map.put("msg","暂时没有数据");
        }
        return  map;
    }

我们打开postman测试请求一下


QQ截图20200913200708.png

我们看到获取到数据库中所有的数据,因为只有一条所以json数组中只有一条

2.2查询单条数据

这个时候我们需要传入数据库中user表的头id来进行查询我们看代码实现

   @RequestMapping("/getusetbyid")
    public  Object getUserById(@RequestParam (value = "id") Integer id){
        User user=userservice.getuserbyId(id);
        Map<String,Object>map=new HashMap<>();
        if(user!=null){
            map.put("code",200);
            map.put("msg","获取数据成功");
            map.put("user",user);
        }else{
            map.put("code",100);
            map.put("msg","暂时没有数据");
        }
        return  map;
    }

我们来测试一下


QQ截图20200913201125.png

我们可以看到通过接口我们把数据库user表中 id=2的数据查询到并且返回

3更新数据:

 @RequestMapping("/updatepassword")
    public  Object updatePassword(@RequestParam(value = "name") String  name,
                                  @RequestParam (value = "password")String password,
                               @RequestParam (value = "newpsw")String newpsw) {
        Map<String, Object> map = new HashMap<>();
        if (TextUtils.Isempty(name) || TextUtils.Isempty(password) || TextUtils.Isempty(newpsw)) {
            map.put("msg", "账号或者密码不能为空");
            map.put("code", 100);
            return map;
        } else {
            if (password.equals(newpsw)) {
                map.put("msg", "新密码和旧密码不能一样");
                map.put("code", 101);
                return map;
            } else {
                String infindpsw = userservice.upDatePassword(name, password, newpsw);
                if (infindpsw.equals("success")) {
                    map.put("msg", "修改密码成功");
                    map.put("code", 200);
                    return map;
                } else if (infindpsw.equals("defeated")) {
                    map.put("msg", "旧密码不对");
                    map.put("code", 102);
                    return map;
                } else if (infindpsw.equals("fail")) {
                    map.put("msg", "不存在该用户");
                    map.put("code", 103);
                    return map;
                } else {
                    map.put("msg", "服务器错误");
                    map.put("code", 104);
                    return map;
                }
            }
        }
    }

更新password 这个字段 我们需要前端传入 name password newpsw 3个字段来处理更新操作我们先空判,然后判断新密码个旧密码不一样 ,然后我们调用service 层的更新数据的方法即可

更新前数据库数据:
QQ截图20200913200440.png

我们用postman测试一下更新数据的接口


QQ截图20200913202313.png

我们再次查询数据库

更新后数据库数据:
QQ截图20200913202352.png

我们看到数据库中的数据已经更新过来了

4删除数据:

     @RequestMapping("/deleteuser")
    public  Object deleteUser(@RequestParam (value = "id")Integer id){
        Map<String,Object>map=new HashMap<>();
        User user=userservice.getuserbyId(id);
        if(user!=null){
            int deletecode=userservice.deleteUser(id);
            if(deletecode==1){
                map.put("code",200);
                map.put("msg","删除数据成功");
            }else {
                map.put("code",100);
                map.put("msg","删除数据失败");
            }
        }else{
            map.put("code",101);
            map.put("msg","不存在该条数据");
        }
        return map;

    }

删除数据我们需要传入user表的头id来处理删除拿一条数据,这边我们是先调用了查询的方法先查看数据库中是否存在该条数据如果不存在直接返回不存在该条数据,如果存在我再调用删除的方法删除数据库中对应id的数据

我们先查询数据库删除前的数据
QQ截图20200913202352.png

然后我们调用删除数据的接口,我们打开postman测试请求一下


QQ截图20200913202847.png

我们看到返回删除数据成功,我们再打开数据查询一下改条数据是否存在 (id=2的数据库)

删除后的数据:

QQ截图20200913203035.png

我们可以看到数据库中id=2的数据已经不存在,已经我们用接口请求删除了 。
到此整个springboot整合mybatis 的教程就讲完了

最后总结:

这篇文章纯属记录个人的学习经历 ,顺带分享给各位 希望能帮助到各位同学,如果觉得文章还不错麻烦动动你的小手指给我一个star 和转发谢谢

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