SpringBoot整合Mybatis通用Mapper

前言

SpringBoot整合MyBatis Generator可以帮助我们快速生成实体类、接口、mapper.xml文件,可以提高开发的效率,但是每次新增表都要执行一次Generator生成相应的代码,这样重复的操作生成增删查改重复的的代码,有没有一种通用的接口,不用生成mapper.xml文件,就可以调用通用接口的方法,实现单表的增删改查操作呢,这就是tk.mybatis.mapper 支持单表操作,不支持通用的多表联合查询。

创建SpringBoot mapper工程

File–>New–>Project–>Spring Initializr 选择JDK版本初始化URL–>Next
在这里插入图片描述
填写项目名称(这里用mapper)及其他信息
在这里插入图片描述
选择项目依赖web、mybatis、mysql
在这里插入图片描述
填写项目保存路径
在这里插入图片描述

添加通用Mapper依赖
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.2</version>
        </dependency>

注意:添加了mapper-spring-boot-starter就不用再添加mapper了

完整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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.xyz</groupId>
	<artifactId>mapper</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>mapper</name>
	<description>SpringBoot 整合 Mybatis 通用 Mapper</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.5.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<!--web依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
        <!--Mybatis依赖-->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>
		<!--mybatis通用mapper依赖-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.2</version>
        </dependency>
        <!--数据库连接依赖-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
        <!--单元测试依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

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


</project>

添加模块

添加controller、service、dao、baseDao、entity
在这里插入图片描述

创建公用接口继承通用Mapper和MySqlMapper
package com.xyz.mapper.baseDao;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * @Description: 公用Mapper接口
 * @Date: 2018/9/22 17:44
 * @Author: xyz
 */
public interface IBaseDao<T>  extends Mapper<T>,MySqlMapper<T> {
}

注意:公用接口IBaseDao要单独的存在另一个包和普通dao分开,以免启动类的@MapperScan扫描到会报错

application.yml的配置
#端口配置
server:
  port: 8088
#jdbc配置
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/video?useUnicode=true&characterEncoding=utf8
    username: xyz
    password: xyz
#mybatis配置
mybatis:
#实体类所在包名
  type-aliases-package: com.xyz.mapper.entity
#通用mapper配置
mapper:
#公用接口类路径
  mappers: com.xyz.mapper.baseDao.IBaseDao
  identity: MYSQL

注意:mybatis.mapper-locations=classpath:mapper/*.xml就不用配置了,因为不生成mapper.xml文件

创建实体类(模型)
package com.xyz.mapper.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Repository;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@Repository
@Table(name = "t_manager")//mybatis通用接口mapper依赖JPA实体类采用JPA
public class TManager implements Serializable {

    // 主键 自动递增
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    // 管理员编号
    @Column(name = "manguid")
    private String manguid;

    // 姓名
    @Column(name = "name")
    private String name;

    // 邮箱
    @Column(name = "email")
    private String email;

    // 密码
    @Column(name = "password")
    private String password;

    // 头像
    @Column(name = "avatar")
    private String avatar;

    // 国籍
    @Column(name = "country")
    private String country;

    // 省
    @Column(name = "province")
    private String province;

    // 市
    @Column(name = "city")
    private String city;

    // 注册时间 格式化
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Column(name = "regtime")
    private Date regtime;

    // 注册IP
    @Column(name = "regip")
    private String regip;

    // 状态
    @Column(name = "status")
    private Integer status;

    private static final long serialVersionUID = 1L;

    public Integer getId() {
        return id;
    }

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

    public String getManguid() {
        return manguid;
    }

    public void setManguid(String manguid) {
        this.manguid = manguid == null ? null : manguid.trim();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email == null ? null : email.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar == null ? null : avatar.trim();
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country == null ? null : country.trim();
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province == null ? null : province.trim();
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city == null ? null : city.trim();
    }

    public Date getRegtime() {
        return regtime;
    }

    public void setRegtime(Date regtime) {
        this.regtime = regtime;
    }

    public String getRegip() {
        return regip;
    }

    public void setRegip(String regip) {
        this.regip = regip == null ? null : regip.trim();
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", id=").append(id);
        sb.append(", manguid=").append(manguid);
        sb.append(", name=").append(name);
        sb.append(", email=").append(email);
        sb.append(", password=").append(password);
        sb.append(", avatar=").append(avatar);
        sb.append(", country=").append(country);
        sb.append(", province=").append(province);
        sb.append(", city=").append(city);
        sb.append(", regtime=").append(regtime);
        sb.append(", regip=").append(regip);
        sb.append(", status=").append(status);
        sb.append(", serialVersionUID=").append(serialVersionUID);
        sb.append("]");
        return sb.toString();
    }
}

注意:Mybatis通用接口mapper依赖JPA,所以实体类得用JPA建立对象和表的映射关系

创建普通dao
package com.xyz.mapper.dao;

import com.xyz.mapper.baseDao.IBaseDao;
import com.xyz.mapper.entity.TManager;

/**
 * @Description: 管理员通用接口继承公用接口,注意泛型
 * @Date: 2018/9/22 18:35
 * @Author: xyz
 */
public interface IManagerDao extends IBaseDao<TManager>{
}
创建服务层接口
package com.xyz.mapper.service;

import com.xyz.mapper.entity.TManager;

import java.util.List;

/**
 * @Description: 管理员服务层接口
 * @Date: 2018/9/22 18:39
 * @Author: xyz
 */
public interface IManagerService {

    int deleteByPrimaryKey(Integer id);

    int insert(TManager manager);

    TManager selectByPrimaryKey(Integer id);

    List<TManager> selectAll();

    int updateByPrimaryKey(TManager manager);
}

创建服务层接口实现类
package com.xyz.mapper.service.impl;

import com.xyz.mapper.dao.IManagerDao;
import com.xyz.mapper.entity.TManager;
import com.xyz.mapper.service.IManagerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Description: 管理员实现层
 * @Date: 2018/9/22 18:41
 * @Author: xyz
 */
@Service
public class ManagerServiceImpl implements IManagerService {
    @Autowired
    private IManagerDao managerDao;

    @Override
    public int deleteByPrimaryKey(Integer id) {
        int row = managerDao.deleteByPrimaryKey(id);
        return row;
    }

    @Override
    public int insert(TManager manager) {
        return managerDao.insert(manager);
    }

    @Override
    public TManager selectByPrimaryKey(Integer id) {
        return managerDao.selectByPrimaryKey(id);
    }

    @Override
    public List<TManager> selectAll() {
        return managerDao.selectAll();
    }

    @Override
    public int updateByPrimaryKey(TManager manager) {
        return managerDao.updateByPrimaryKey(manager);
    }
}

创建访问控制层
package com.xyz.mapper.controller;

import com.xyz.mapper.entity.TManager;
import com.xyz.mapper.service.IManagerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Description: 管理员访问控制层
 * @Date: 2018/9/22 18:46
 * @Author: xyz
 */
@RestController
public class ManagerController {

    @Autowired
    private IManagerService managerService;

    /**
     * @Description: 添加管理员,返回添加数量
     * @MethodName: insert
     * @param: manager
     * @ReturnType: int
     */
    @PostMapping(value = "/manager/insert")
    public int insert(TManager manager) {
        return managerService.insert(manager);
    }

    /**
     * @Description: 根据id删除管理员,返回删除数量
     * @MethodName: deleteByPrimaryKey
     * @param: id
     * @ReturnType: int
     */
    @PostMapping(value = "/manager/deleteByPrimaryKey")
    public int deleteByPrimaryKey(@RequestParam(value = "id", required = true) Integer id) {
        int row = managerService.deleteByPrimaryKey(id);
        return row;
    }

    /**
     * @Description: 根据id更改管理员信息, 返回更改数量
     * @MethodName: updateByPrimaryKey
     * @param: manager
     * @ReturnType: int
     */
    @PostMapping(value = "/manager/updateByPrimaryKey")
    public int updateByPrimaryKey(TManager manager) {
        return managerService.updateByPrimaryKey(manager);
    }

    /**
     * @Description: 查询单个管理员对象
     * @MethodName: selectByPrimaryKey
     * @param: id
     * @ReturnType: com.xyz.mapper.entity.TManager
     */
    @PostMapping(value = "/manager/selectByPrimaryKey")
    public TManager selectByPrimaryKey(Integer id) {
        return managerService.selectByPrimaryKey(id);
    }

    /**
     * @Description: 查询所有管理员不分页
     * @MethodName: selectAll
     * @param:
     * @ReturnType: java.util.List<com.xyz.mapper.entity.TManager>
     */
    @PostMapping(value = "/manager/selectAll")
    public List<TManager> selectAll() {
        List<TManager> managerList = managerService.selectAll();
        return managerList;
    }
}

主程序中添加@MapperScan
package com.xyz.mapper;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("com.xyz.mapper.dao")//注意MapperScan要导tk的包,不然会报NoSuchMethodException
public class MapperApplication {

	public static void main(String[] args) {
		SpringApplication.run(MapperApplication.class, args);
	}
}

整个项目目录结构如下

在这里插入图片描述

总结

Mybatis 通用接口Mapper虽然省去了手写SQL,但是Mapper依赖于JPA,需要手写模型用注解建立模型和表的映射关系,Mapper也局限于单表操作。

  • 12
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值