本篇主要在Spring Boot项目基础上整合Mybatis实现一个前后端分离开发的小案例,简单实现一些增删改查和条件查询,不涉及log日志、结果集、全局异常处理等操作,纯后台,只做数据处理,暂不涉及前台。不会搭建Spring Boot项目的小伙伴可以参考我的上一篇文章:30分钟快速上手从0搭建Spring boot项目https://blog.csdn.net/weixin_46214451/article/details/106657894
本篇的所有实现均在上篇所搭建的项目之上进行开发。
第一步 建表
CREATE TABLE employee
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
#添加数据
INSERT INTO employee (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');
第二步 根据JavaEE开发的三层架构(表现层、业务层、数据层)建立如下类、接口和映射文件
实体类没什么好说的这里略过
我们从底层往上写,先在Mapper接口写一个简单的查询方法
package com.example.mapper;
import com.example.entity.Employee;
import org.springframework.stereotype.Repository;
import java.util.List;
// @Repository注解表示该类是一个数据层的Bean并交给Spring的IOC容器托管
@Repository
public interface EmployeeMapper {
// 接口中的方法不需要用权限修饰,默认为public
List<Employee> selectEmp();
}
有了mapper接口就要有与之对应的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">
<mapper namespace="com.example.mapper.EmployeeMapper">
<!-- sql标签中的id值要与mapper接口中的方法名对应 -->
<select id="selectEmp" resultMap="Employee">
SELECT
*
FROM
employee
</select>
<!-- 在正常开发中我们的数据库字段和实体类中的属性名往往不一致(我这里写的是一致的),
resultMap的作用就是解决这一问题property代表我们的实体类属性column代表数据库字段
-->
<resultMap id="Employee" type="com.example.entity.Employee">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
<result property="email" column="email" />
</resultMap>
</mapper>
之后写业务层接口和业务层实现类,这里很多人不明白为什么要写接口不能直接写实现类,这就涉及到了Java设计原则中的依赖倒置原则,想深入了解设计原则的可以看我的《Java七大设计原则》https://blog.csdn.net/weixin_46214451/article/details/106680521
接口和Mapper接口差不多没有什么好说的
package com.example.service;
import com.example.entity.Employee;
import java.util.List;
public interface EmployeeService {
List<Employee> selectEmp();
}
然后是实现类
package com.example.service.impl;
import com.example.entity.Employee;
import com.example.mapper.EmployeeMapper;
import com.example.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
// @Service注解表示该类是一个业务层的Bean并交给Spring的IOC容器托管
@Service
public class EmployeeServiceImpl implements EmployeeService {
// @Autowired是Spring中的自动注入功能
@Autowired
private EmployeeMapper employeeMapper;
@Override
public List<Employee> selectEmp() {
// 在这里调用Mapper中的selectEmp方法
List<Employee> employees = employeeMapper.selectEmp();
return employees;
}
}
最后是表示层
package com.example.controller;
import com.example.entity.Employee;
import com.example.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
// @RestController注解表示该类是一个表示层的Bean并交给Spring的IOC容器托管
// 该注解是一个复合注解包括了@Controller和@RequestBody
// @RequestBody主要用来接收前端传递给后端的json字符串中的数据
// 简单理解就是@Controller会返回视图@RestController注解会返回数据
@RestController
// @RequestMapping这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上
// 它的method = RequestMethod.POST参数可以可以将我们的请求方式变为post请求
@RequestMapping("employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@RequestMapping(value = "select",method = RequestMethod.POST)
public List<Employee> selectEmp(){
List<Employee> employees = employeeService.selectEmp();
return employees;
}
}
到这里我们一个非常简单的查询操作就写完了,由于没有前台页面我们需要一个测试数据的工具——postman,没有的小伙伴可以百度自己下载
之后启动postman 更改请求为POST然后输入我们的url地址 请求参数改为json 点击Send发送请求就OK了
我们数据库里的所有数据就被查询出来了,我们只需要把接口交给前台就可以了具体页面是什么样的就跟我们没有关系了,前后端分离我们后台只关心数据处理就OK 了(这里的接口其实就是我们的url地址,并不是我们的Java接口)
写完了查询功能后边的增删改功能其实也是差不多的,这里我把代码放在下边感兴趣的可以自己研究一下
重点说一下容易踩坑的地方:
1.除了简单查询以外,其他功能需要输入参数我们用实体类来接受前台传过来的参数(@RequestBody Employee employee)这里的@RequestBody注解的主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的)。
2.模糊查询的Sql语句:name like ‘%${name}%’,中不能用#{}而是用${},因为Mybatis的底层是封装了JDBC, #{} 会把参数解析成一个占位符,而${}会把参数解析成字符串。
3.查询功能的Sql标签里需要resultMap结果映射,增删改功能的Sql标签里需要:parameterType 参数类型 这里的值写实体类类名
package com.example.controller;
import com.example.entity.Employee;
import com.example.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
// 简单查询
@RequestMapping(value = "select",method = RequestMethod.POST)
public List<Employee> selectEmp(){
List<Employee> employees = employeeService.selectEmp();
return employees;
}
// 条件查询
@RequestMapping(value = "conditionselect",method = RequestMethod.POST)
public List<Employee> conditionSelectEmp(@RequestBody Employee employee){
List<Employee> employees = employeeService.conditionSelectEmp(employee);
return employees;
}
// 添加
@RequestMapping(value = "insert",method = RequestMethod.POST)
public String insertEmp(@RequestBody Employee employee){
String insertEmp = employeeService.insertEmp(employee);
return insertEmp;
}
// 删除
@RequestMapping(value = "delete",method = RequestMethod.POST)
public String deleteEmp(@RequestBody Employee employee){
String insertEmp = employeeService.deleteEmp(employee);
return insertEmp;
}
// 修改
@RequestMapping(value = "update",method = RequestMethod.POST)
public String updateEmp(@RequestBody Employee employee){
String updateEmp = employeeService.updateEmp(employee);
return updateEmp;
}
}
package com.example.service;
import com.example.entity.Employee;
import java.util.List;
public interface EmployeeService {
// 查询
List<Employee> selectEmp();
// 条件查询
List<Employee> conditionSelectEmp(Employee employee);
// 增加
String insertEmp(Employee employee);
// 删除
String deleteEmp(Employee employee);
// 修改
String updateEmp(Employee employee);
}
package com.example.service.impl;
import com.example.entity.Employee;
import com.example.mapper.EmployeeMapper;
import com.example.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
@Override
public List<Employee> selectEmp() {
List<Employee> employees = employeeMapper.selectEmp();
return employees;
}
@Override
public List<Employee> conditionSelectEmp(Employee employee) {
List<Employee> employees = employeeMapper.conditionSelectEmp(employee);
return employees;
}
@Override
public String insertEmp(Employee employee) {
int insertEmp = employeeMapper.insertEmp(employee);
if(insertEmp != 0){
return "添加成功";
} else {
return "添加失败";
}
}
@Override
public String deleteEmp(Employee employee) {
int deleteEmp = employeeMapper.deleteEmp(employee);
if(deleteEmp != 0){
return "删除成功";
} else {
return "删除失败";
}
}
@Override
public String updateEmp(Employee employee) {
int updateEmp = employeeMapper.updateEmp(employee);
if(updateEmp != 0){
return "修改成功";
} else {
return "修改失败";
}
}
}
package com.example.mapper;
import com.example.entity.Employee;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface EmployeeMapper {
// 查询
List<Employee> selectEmp();
// 条件查询
List<Employee> conditionSelectEmp(Employee employee);
// 增加
int insertEmp(Employee employee);
// 删除
int deleteEmp(Employee employee);
// 修改
int updateEmp(Employee employee);
}
<?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.example.mapper.EmployeeMapper">
<select id="selectEmp" resultMap="Employee">
SELECT
*
FROM
employee
</select>
<select id="conditionSelectEmp" resultMap="Employee">
SELECT
*
FROM
employee
where
name like '%${name}%'
</select>
<insert id="insertEmp" parameterType="com.example.entity.Employee">
INSERT INTO employee (id, name, age, email)
VALUES
(#{id},#{name},#{age},#{email})
</insert>
<delete id="deleteEmp" parameterType="com.example.entity.Employee">
delete from employee where id = #{id}
</delete>
<update id="updateEmp" parameterType="com.example.entity.Employee">
UPDATE employee
SET
name=#{name},
age=#{age},
email=#{email}
WHERE id=#{id}
</update>
<resultMap id="Employee" type="com.example.entity.Employee">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
<result property="email" column="email" />
</resultMap>
</mapper>