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的结构来安排的。
最后,笔者还是要说一下,自己的水平有限,有些理解可能还不到位,如果各位读者发现错误,还请谅解。