Mybatis、SpringBoot入门实战(微型项目) -- Mysql增删查改、写接口、测试接口

Mybatis入门实战(微型项目) – Mysql增删查改、写接口、测试接口

开发环境:
1.Window10 v1909
2.idea 2019
3.jdk 1.8
4.mybatis 3.5.5
5.mysql-connector-java 8.0.11
6.tomcat 8.5
7.Mysql5.6
测试软件:
谷歌浏览器64位

一、创建一个spring boot项目

1.创建Spring Initializr。其余默认。
在这里插入图片描述
2.自定义项目包名、项目名,Java选1.8版本(即Java8)。
注意:为使后面代码直接复制就能运行,请保持和图片中填写一致,免去不停修改包名!
在这里插入图片描述
3.选择SpringBootDevTools、SpringWeb。之后一直next,直到finish。
在这里插入图片描述

二、配置目录结构

1.在src/main/java/包.项目名/下建立四个文件夹:dao、service、controller、vo。

说明:建立依据是MVC层的结构 model-view-controller。
dao:与数据库对应的bean
service:提供具体的逻辑设计
controller:提供大概的流程
vo:与前端对应的bean和一些前端的设计
(bean: 简单来说。是一种变量全private,只提供getter和setter等方法的类)

在这里插入图片描述
2.导入mybatis3.5.5.jar和mysqk-connector-java 8.0.11.jar。并且配置pom.xml文件如下。(就在当前工程的根目录下)
(1)导入。
   -> File
   -> ProjectStructure
   -> Modules
   -> 右边Dependencies
   -> 点击+号
   -> Jars or directories
   -> 选择自己的包导入
   -> 导入后记得 打勾
在这里插入图片描述
(2)配置pom.xml文件。在 “ dependencies”标签下加入下列依赖。

 <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
</dependency>       

然后在build标签下加入(用于实现在java目录下可以编译xml文件)。之后点击右侧的maven刷新。

<resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include> **/*.xml</include>
                </includes>
            </resource>
</resources>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
3.创建数据库(本文以Mysql自带的图形界面演示)。
在数据库中执行下列代码

CREATE SCHEMA `tjh` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
use tjh;
CREATE TABLE `student` (
  `id` INT NOT NULL,
  `name` VARCHAR(25) NOT NULL,
  `age` VARCHAR(25) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_bin;
INSERT INTO `student` (`id`, `name`, `age`) VALUES ('10001', '唐一', '21');
INSERT INTO `student` (`id`, `name`, `age`) VALUES ('10002', '胡二', '22');
INSERT INTO `student` (`id`, `name`, `age`) VALUES ('10003', '张三', '23');
INSERT INTO `student` (`id`, `name`, `age`) VALUES ('10004', '李四', '24');
INSERT INTO `student` (`id`, `name`, `age`) VALUES ('10005', '王五', '25');

(1)建数据库 tjh。(编码 utf8、utf8_bin)
(2)建表 student。(编码utf8、utf8_bin)
  id varchar(25) not null primary key
  name varchar(25) not null
  age int not null
(3)添加测试数据
在这里插入图片描述
4.开始配置数据库连接文件。此处我们选择使用yml文件来配置,比较直观。(除此之外,还有两种配置方式,以后单独开一个文章介绍)
  在src/main/resources文件夹下,删除application.properties文件,新建application.yml。
将下列代码复制进去。(程序执行时会自动读取)
  到此,所有配置均完成。

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tjh?serverTimezone=GMT%2B8&characterEncoding=utf-8
    password: root
    username: root
  jpa:
    database: MySQL
    show-sql: true
    generate-ddl: true
server:
  port: 80
  context-path: /

在这里插入图片描述

三、dao层

  从此步开始,便是本演示项目的核心部分了。作者将完整的演示一个数据库取出数据,通过dao层进行增删查改,再到service层提供具体服务,随之controller层提供接口给前端使用。
  dao层:负责与数据库的一一映射。简洁易读,便于即时修改。
1.在src/main/java/com.xx.xx/dao下建立:
(1)Student.java (一个bean类)
(2)StudentMapper.java(与数据库的接口)
(3)StudentMapper.xml(接口映射文件)
2.分别复制下列代码进去:
(1)Student.java:

package com.tjh.demo.dao;

import org.apache.ibatis.annotations.Mapper;

public class Student {
    private String sid;
    private String sname;
    private int sage;

    public void setSid(String id){this.sid = id;}
    public void setSname(String name){this.sname = name;}
    public void setSage(int age){this.sage = age;}
    public String getSid(){return this.sid;}
    public String getSname(){return this.sname;}
    public int getSage(){return this.sage;}
}

(2)StudentMapper.java

package com.tjh.demo.dao;

import com.tjh.demo.dao.Student;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface StudentMapper {
    /**
     * 通过id查找学生。
     * @Param()里面的内容用来在Mapper.xml中代替id进行比较的
     */
    Student getStudentById(@Param("queryId")String id);

    /**
     * 添加一个学生对象
     * @param stu
     * @return 是否添加成功
     */
    void addStudent(Student stu);

    /**
     * 删除学生对象
     * @param id
     * @return 是否删除成功
     */
    void deleteStudentById(@Param("queryId")String id);

    /**
     * 修改学生对象
     * @return 返回修改后的对象
     */
    void modifyStudentById(Student stu);
}

(3)StudentMapper.xml

<?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">
<!-- namespace是用来表示StudentMapper的名称 -->
<mapper namespace="com.tjh.demo.dao.StudentMapper">
    <!-- resultMap是用来存储数据库字段与dao中的bean字段一一映射的-->
    <resultMap id="baseResultMap" type="com.tjh.demo.dao.Student">
        <id column="id" property="sid" jdbcType="VARCHAR"/>
        <result column="name" property="sname" jdbcType="VARCHAR"/>
        <result column="age" property="sage" jdbcType="INTEGER"/>
    </resultMap>

    <!-- 查找一个 -->
    <select id="getStudentById" resultMap="baseResultMap" parameterType="string">
        select *
        from student
        where id=#{queryId}
    </select>

    <!-- 添加一个 -->

    <insert id="addStudent" parameterType="com.tjh.demo.dao.Student">
        insert into student
        (`id`,`name`,`age`)
        values
        (#{sid},#{sname},#{sage})
    </insert>

    <!-- 删除一个 -->
    <delete id="deleteStudentById"  parameterType="string">
        delete
        from student
        where id=#{queryId}
    </delete>

    <!-- 修改一个 -->
    <update id="modifyStudentById" parameterType="com.tjh.demo.dao.Student">
        update student
        set
        `id`= #{sid},
        `name`=#{sname},
        `age`=#{sage}
        where id = #{sid}
    </update>

</mapper>

3.说明:
(1)Student.java。是一个bean文件,里面的字段与数据库表字段一一对应。
(2)StudentMapper.java。是提供服务的接口,注意在类名上加@Mapper,使得系统自动扫描到,并且和StudentMapper.xml产生关联。(需要mybatis包的支持才能用@Mapper,前面我们已经安装)
(3)StudentMapper.xml。里面写的是sql语句读取数据库,可以去看下mybatis的官方教程很简单的。
在这里插入图片描述

四、vo 层

  先把vo层拿到前面来,是因为待会再service层会用到。
1.创建StudentVo,复制以下代码进去:

package com.tjh.demo.vo;

// 与前端对应的字段
public class StudentVo {
    private String vid;
    private String vname;
    private int vage;

    public void setVid(String id){this.vid = id;}
    public void setVname(String name){this.vname = name;}
    public void setVage(int age){this.vage = age;}
    public String getVid(){return this.vid;}
    public String getVname(){return this.vname;}
    public int getVage(){return this.vage;}
}

2.说明:
  与前端一一对应的字段。你测试的时候就是设置这些字段
在这里插入图片描述

五、service 层

  service是提供具体服务设计的,对dao层提供的底层接口加以封装。使得controller层可以直接调用service层的接口,而不用做任何检查,简单明了的制作api。

1.在src/main/java/com.xx.xx/servcie下 创建文件ChangeStudentVo.java与StudentService.java
2.创建包impl
->impl包下创建:StudentServiceImpl.java
3.复制下列代码:
(1)ChangeStudentVo.java

package com.tjh.demo.service;

import com.tjh.demo.dao.Student;
import com.tjh.demo.vo.StudentVo;

public class ChangeStudentVo {
    // Student bean 转换成 StudentVo bean
    public static StudentVo changeVo(Student stu){
        StudentVo stuV = new StudentVo();
        if(stu == null){
            stuV.setVid(null);
            stuV.setVname(null);
            stuV.setVage(0);
        }else{
            stuV.setVid(stu.getSid());
            stuV.setVname(stu.getSname());
            stuV.setVage(stu.getSage());
        }
        return stuV;
    }

    // StudentVo bean 转换成 Student bean
    public static Student change(StudentVo stuV){
        Student stu = new Student();
        if(stuV.getVid() == null || stuV.getVid().equals("")){
            stu.setSid(null);
            stu.setSname(null);
            stu.setSage(0);
        }else{
            stu.setSid(stuV.getVid());
            stu.setSname(stuV.getVname());
            stu.setSage(stuV.getVage());
        }
        return stu;
    }
}

(2)StudentService.java

package com.tjh.demo.service;

import com.tjh.demo.dao.Student;
import com.tjh.demo.vo.StudentVo;

public interface StudentService {
    /**
     * 查询学生信息
     * @param id
     * @return
     */
    StudentVo query(String id);

    /**
     * 添加一个学生,返回添加的学生信息。如果原学生存在,返回null
     * @param studentVo
     * @return
     */
    StudentVo add(StudentVo studentVo);

    /**
     * 删除一个学生,删除成功返回true
     */
    boolean delete(String id);

    /**
     * 修改一个学生,修改成功返回修改后信息,否则返回null
     */
    StudentVo modify(StudentVo studentVo);
}

(3)StudentServiceImpl.java

package com.tjh.demo.service.impl;

import com.tjh.demo.dao.Student;
import com.tjh.demo.dao.StudentMapper;
import com.tjh.demo.service.ChangeStudentVo;
import com.tjh.demo.service.StudentService;
import com.tjh.demo.vo.StudentVo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class StudentServiceImpl implements StudentService {

    @Resource
    private StudentMapper studentMapper;

    @Override
    public StudentVo query(String id) {
        // 如果查询id为空,查询失败
        if(id == null || id.equals("")){
            return ChangeStudentVo.changeVo(null);
        }
        Student student = studentMapper.getStudentById(id);
        return ChangeStudentVo.changeVo(student);
    }

    @Override
    public StudentVo add(StudentVo studentVo) {
        System.out.println("add");
        // 如果数据库存在数据或者id为空,则插入失败
        if(studentVo.getVid()==null||studentVo.getVid().equals("")||query(studentVo.getVid()).getVid()!=null){
            return ChangeStudentVo.changeVo(null);
        }
        Student student = ChangeStudentVo.change(studentVo);
        studentMapper.addStudent(student);
        return studentVo;
    }

    @Override
    public boolean delete(String id) {
        if(id == "" || id.equals("")||query(id)==null)
            return false;
        studentMapper.deleteStudentById(id);
        return true;
    }

    @Override
    public StudentVo modify(StudentVo studentVo) {
        // 如果id为空或者查询不到,则修改失败
        if(query(studentVo.getVid())==null || studentVo.getVid()==null||studentVo.getVid().equals("")){
            return ChangeStudentVo.changeVo(null);
        }
        Student student = ChangeStudentVo.change(studentVo);
        studentMapper.modifyStudentById(student);
        return studentVo;
    }
}

4.说明:
(1)ChangeStudentVo.java。用于Student和StudentVo之间的互相转换。
(2)StudentService.java。提供学生服务(增删查改)的接口
(3)StudentServiceImpl.java。提供学生服务(增删查改)的具体实现,其中拥有数据格式验证。(注意:需要在类名上加@Service,便于被系统扫描到,表示是一个接口实现类,关于“注解”可百度)
在这里插入图片描述

六、controller 层

  用于调用Service层的接口,创建API。
1.在src/main/java/com.xx.xx/controller/下创建MainController.java。
2.复制下列代码:

package com.tjh.demo.controller;
import com.tjh.demo.dao.Student;
import com.tjh.demo.dao.StudentMapper;
import com.tjh.demo.service.StudentService;
import com.tjh.demo.vo.StudentVo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;

@Controller
@RequestMapping("/")
public class MainController {
    @Resource
    private StudentService studentService;

    @GetMapping("api/query")
    @ResponseBody
    public StudentVo query(@RequestParam("vid")String id){
        return studentService.query(id);
    }

    @GetMapping("api/delete")
    @ResponseBody
    public Boolean delete(@RequestParam("vid")String id){
        return studentService.delete(id);
    }

    @GetMapping("api/modify")
    @ResponseBody
    public StudentVo modify(StudentVo studentVo){
        return studentService.modify(studentVo);
    }

    @GetMapping("api/add")
    @ResponseBody
    public StudentVo add(StudentVo studentVo){
        return studentService.add(studentVo);
    }
}

3.说明:
(1)类名上加@Controller,表示这是一个控制器。
(2)类名上加@RequestMapping("/"),表示根目录为http://localhost/
(3)方法上使用@GetMapping(“api/modify”),表示方法该方法的路径为:
http://localhost/api/modify。
(4)方法上加@ResponseBody,表示返回json类型数据或字符串。如果不加,则返回一个网页视图,在本文没有写网页所以不需要。(@Controller+@ResponseBody=@RestController,也就是说,可以去掉@Controller、@ResponseBody,在类名上加@RestController)
在这里插入图片描述

七、 测试

  现在我们在src/main/java/com.xx.xx/下,选择DemoApplication.java,鼠标右键"Run ‘DemoApplication.java’ ".

1.先来浏览器测试一下查询吧,打开浏览器。
访问网址:localhost/api/query?vid=10001,
查询vid为10001的数据,返回结果如下:

在这里插入图片描述
2.测试其他功能
增加:localhost/api/add?vid=10099&vname=aaa&vage=99
修改:localhost/api/modify?vid=10099&vname=bbb&vage=88
删除:localhost/api/delete?vid=10099

注意:每一步在浏览器访问后,及时在查看数据库变化。
(作者使用的使NavicatPremium15软件查看的,读者可以使用mysql自带的workbench查看,不影响。)
参考图片(依次为:原始数据、增加后、修改后、删除后)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、 总结

  至此,一个简易的Mybatis项目就完成了,其包含了MVC的三大结构:model、view、controller,一般的SpringBoot公司项目也是往这边靠的。公司的模块划分的很清晰,内容也特别多,不过主体还是MVC的结构来安排的。
  最后,笔者还是要说一下,自己的水平有限,有些理解可能还不到位,如果各位读者发现错误,还请谅解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值