springboot集成通用mapper(tk mybatis)

项目结构

base:基础结构

modules:测试代码

集成

1. 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>mapper</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mapper</name>
    <description>Demo project for Spring Boot</description>

    <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--spring-boot mybatis依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!--Mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--添加tk-mapper依赖-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!--druid依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

2. application.yml

server:
  port: 9999

#数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: xxxxxx
    username: admin
    password: admin

mybatis:
  mapper-locations: classpath*:mapper/*Mapper.xml

# 打印sql日志
logging:
  level:
    com.example.mapper.modules.dao : debug

3. base包下的*Mapper接口

BaseMapper.java

package com.example.mapper.base;

/**
 * 基础通用mapper
 */
public interface BaseMapper<T> extends InsertMapper<T>,
        DeleteMapper<T>,
        UpdateMapper<T>,
        SelectMapper<T> {
}

DeleteMapper.java

package com.example.mapper.base;

import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.base.delete.DeleteByPrimaryKeyMapper;
import tk.mybatis.mapper.common.condition.DeleteByConditionMapper;
import tk.mybatis.mapper.common.ids.DeleteByIdsMapper;

/**
 * 基础删除功能mapper
 */
public interface DeleteMapper<T> extends Marker,
        tk.mybatis.mapper.common.base.delete.DeleteMapper<T>,
        DeleteByPrimaryKeyMapper<T>,
        DeleteByConditionMapper<T>,
        DeleteByIdsMapper<T> {
}

InsertMapper.java

package com.example.mapper.base;

import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.MySqlMapper;
import tk.mybatis.mapper.common.base.insert.InsertSelectiveMapper;

/**
 * 基础新增功能mapper
 */
public interface InsertMapper<T> extends Marker,
        tk.mybatis.mapper.common.base.BaseInsertMapper<T>,
        InsertSelectiveMapper<T>,
        MySqlMapper<T> {
}

SelectMapper.java

package com.example.mapper.base;

import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.base.select.*;
import tk.mybatis.mapper.common.condition.SelectByConditionMapper;
import tk.mybatis.mapper.common.condition.SelectCountByConditionMapper;
import tk.mybatis.mapper.common.example.SelectByExampleMapper;
import tk.mybatis.mapper.common.ids.SelectByIdsMapper;

/**
 * 基础查询功能mapper
 */
public interface SelectMapper<T> extends Marker,
        SelectOneMapper<T>,
        tk.mybatis.mapper.common.base.select.SelectMapper<T>,
        SelectAllMapper<T>,
        SelectCountMapper<T>,
        SelectByPrimaryKeyMapper<T>,
        ExistsWithPrimaryKeyMapper<T>,
        SelectByIdsMapper<T>,
        SelectByConditionMapper<T>,
        SelectCountByConditionMapper<T>,
        SelectByExampleMapper<T> {
}

UpdateMapper.java

package com.example.mapper.base;

import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.base.update.UpdateByPrimaryKeyMapper;
import tk.mybatis.mapper.common.base.update.UpdateByPrimaryKeySelectiveMapper;
import tk.mybatis.mapper.common.condition.UpdateByConditionMapper;
import tk.mybatis.mapper.common.condition.UpdateByConditionSelectiveMapper;
import tk.mybatis.mapper.common.example.UpdateByExampleSelectiveMapper;

/**
 * 基础修改功能mapper
 */
public interface UpdateMapper<T> extends Marker,
        UpdateByPrimaryKeyMapper<T>,
        UpdateByPrimaryKeySelectiveMapper<T>,
        UpdateByConditionMapper<T>,
        UpdateByConditionSelectiveMapper<T>,
        UpdateByExampleSelectiveMapper<T> {
}

测试

实体类:Teacher.java

package com.example.mapper.modules.entity;

import lombok.Data;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

/**
 * @Description 实体类属性类型不能是基本类型,如int要换成Integer
 */
@Data
@Table(name = "teacher")
public class Teacher implements Serializable {
    @Id
    private Integer id;
    private String name;
    private Integer age;
}

控制层:TeacherController.java

package com.example.mapper.modules.controller;

import com.example.mapper.modules.entity.Teacher;
import com.example.mapper.modules.service.ITeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/mapper")
public class TeacherController {
    @Autowired
    private ITeacherService iTeacherService;

    // 查询记录
    // http://localhost:9999/mapper/selectTeacher
    @GetMapping("/selectTeacher")
    List<Teacher> selectTeacher() {
        return iTeacherService.selectTeacher();
    }

    // 添加记录
    // http://localhost:9999/mapper/insertTeacher
    @GetMapping("/insertTeacher")
    int insertTeacher() {
        return iTeacherService.insertTeacher();
    }

    // 删除记录
    // http://localhost:9999/mapper/deleteTeacher
    @GetMapping("/deleteTeacher")
    int deleteTeacher() {
        return iTeacherService.deleteTeacher();
    }

    // 修改记录
    // http://localhost:9999/mapper/updateTeacher
    @GetMapping("/updateTeacher")
    int updateTeacher() {
        return iTeacherService.updateTeacher();
    }
}

Service:ITeacherService.java

package com.example.mapper.modules.service;

import com.example.mapper.modules.entity.Teacher;

import java.util.List;

public interface ITeacherService {
    List<Teacher> selectTeacher();
    int insertTeacher();
    int deleteTeacher();
    int updateTeacher();
}

ServiceImpl:TeacherServiceImpl.java

测试了通用mapper的大部分使用方法,能满足一般需求

package com.example.mapper.modules.service;

import com.example.mapper.modules.dao.TeacherDao;
import com.example.mapper.modules.entity.Teacher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Condition;
import tk.mybatis.mapper.entity.Example;

import java.util.ArrayList;
import java.util.List;

@Service
public class TeacherServiceImpl implements ITeacherService {
    @Autowired
    private TeacherDao teacherDao;

    /**
     * @Description 查询
     *
     */
    @Override
    public List<Teacher> selectTeacher() {
        Teacher t = new Teacher();
        t.setId(1);
        t.setName("gaobo");

        /*select() 根据实体中的属性值进行查询*/
        // ==>  Preparing: SELECT id,name,age FROM teacher WHERE id = ? AND name = ?
        // ==> Parameters: 1(Integer), gaobo(String)
        List<Teacher> select = teacherDao.select(t);

        /*selectByPrimaryKey() 按照带有@id注解的字段作为条件,根据主键字段进行查询*/
        // ==>  Preparing: SELECT id,name,age FROM teacher WHERE id = ?
        // ==> Parameters: 1(Integer)
        Teacher teacher = teacherDao.selectByPrimaryKey(1);

        /*selectAll() 查询所有记录*/
        // ==>  Preparing: SELECT id,name,age FROM teacher
        List<Teacher> selectAll = teacherDao.selectAll();

        /*selectByExample() 根据Example条件进行查询*/
        Example example = new Example(Teacher.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("name","xxx");
        //==> Preparing: SELECT id,name,age FROM teacher WHERE ( name = ? )
        //==> Parameters: xxx(String)
        List<Teacher> selectByExample = teacherDao.selectByExample(example);

        /*selectCount() 根据实体中的属性查询总数*/
        // ==>  Preparing: SELECT COUNT(id) FROM teacher WHERE id = ? AND name = ?
        // ==> Parameters: 1(Integer), gaobo(String)
        int selectCount = teacherDao.selectCount(t);

        /*selectOne() 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常*/
        // ==>  Preparing: SELECT id,name,age FROM teacher WHERE id = ? AND name = ?
        // ==> Parameters: 1(Integer), gaobo(String)
        Teacher selectOne = teacherDao.selectOne(t);

        /*根据主键字符串进行查询,类中只有存在一个带有@Id注解的字段*/
        // ==>  Preparing: SELECT id,name,age FROM teacher where id in (1,2)
        List<Teacher> selectByIds = teacherDao.selectByIds("1,2");

        /**
         * Condition 和Example的使用方法一模一样,即和selectByExample方法一样的
         * Condition 的出现是为了替代Example,因为Example有歧义
         */
        Condition condition = new Condition(Teacher.class);
        Condition.Criteria criteria2 = condition.createCriteria();
        criteria2.andEqualTo("name","xxx");
        List<Teacher> selectByCondition = teacherDao.selectByCondition(condition);


        return selectAll;

    }

    /**
     * @Description 添加
     *
     */
    @Override
    public int insertTeacher() {
        Teacher t = new Teacher();
        t.setId(4);
        t.setName("zhang");

        Teacher t2 = new Teacher();
        t2.setId(5);
        t2.setName("wang");

        /*
        *
        * 保存一个实体,null的属性也会保存,不会使用数据库默认值
        * ==>  Preparing: INSERT INTO teacher ( id,name,age ) VALUES( ?,?,? )
        * ==> Parameters: 4(Integer), zhang(String), null
        * */
        int insert = teacherDao.insert(t);

        List<Teacher> list = new ArrayList<>();
        list.add(t);
        list.add(t2);
        /*
         * 批量添加功能,实体必须包含`id`属性并且必须为自增列,id字段不需赋值
         * 想要测试的话,可以先暂时把id改成自增
         * 如果不是自增列不是id,见insertList源码,有解释
         * ==>  Preparing: INSERT INTO teacher ( name,age ) VALUES ( ?,? ) , ( ?,? )
         * ==> Parameters: zhang(String), null, wang(String), null
         * */
        int insertList = teacherDao.insertList(list);
        /*
         * 保存一个实体,null的属性不会保存,会使用数据库默认值
         * ==>  Preparing: INSERT INTO teacher ( id,name ) VALUES( ?,? )
         * ==> Parameters: 5(Integer), wang(String)
         * */
        int insertSelective = teacherDao.insertSelective(t2);
        /*
         * 限制为实体包含`id`属性并且必须为自增列,实体配置的主键策略无效
         * ==>  Preparing: INSERT INTO teacher ( name,age ) VALUES ( ?,? )
         * ==> Parameters: wang(String), null
         * */
        int insertUseGeneratedKeys = teacherDao.insertUseGeneratedKeys(t2);

        return 0;
    }

    @Override
    public int deleteTeacher() {
        Teacher t = new Teacher();
        t.setId(1);
        t.setName("zhang");

        /**
         * 根据实体属性作为条件进行删除
         * ==>  Preparing: DELETE FROM teacher WHERE id = ? AND name = ?
         * ==> Parameters: 1(Integer), zhang(String)
         */
        int delete = teacherDao.delete(t);

        // 参考selectByIds ==>  Preparing: DELETE FROM teacher where id in (1,2)
        int deleteByIds = teacherDao.deleteByIds("1,2");

        // 根据主键字段进行删除,即有@Id注解的字段 ==>  Preparing: DELETE FROM teacher WHERE id = ?
        int deleteByPrimaryKey = teacherDao.deleteByPrimaryKey(1);

        // 按条件删除,参考selectByCondition()
        // ==>  Preparing: DELETE FROM teacher WHERE ( name = ? )
        // ==> Parameters: xxx(String)
        Condition condition = new Condition(Teacher.class);
        Condition.Criteria criteria = condition.createCriteria();
        criteria.andEqualTo("name","xxx");
        int deleteByCondition = teacherDao.deleteByCondition(condition);

        return 0;
    }

    @Override
    public int updateTeacher() {
        Teacher t = new Teacher();
        t.setId(1);
        //t.setName("zhang");
        t.setAge(76);
        /**
         * 根据主键更新实体全部字段,null值会被更新
         * ==>  Preparing: UPDATE teacher SET id = id,name = ?,age = ? WHERE id = ?
         *  ==> Parameters: null, 76(Integer), 1(Integer)
         */
        int updateByPrimaryKey = teacherDao.updateByPrimaryKey(t);

        /**
         * 根据主键更新属性不为null的值
         * ==>  Preparing: UPDATE teacher SET id = id,age = ? WHERE id = ?
         * ==> Parameters: 76(Integer), 1(Integer)
         */
        int updateByPrimaryKeySelective = teacherDao.updateByPrimaryKeySelective(t);

        /**
         * 根据Condition条件更新实体`record`包含的全部属性,null值会被更新
         * ==>  Preparing: UPDATE teacher SET id = id,name = ?,age = ? WHERE ( name = ? )
         * ==> Parameters: null, 76(Integer), xxx(String)
         */
        Condition condition = new Condition(Teacher.class);
        Condition.Criteria criteria = condition.createCriteria();
        criteria.andEqualTo("name","xxx");
        teacherDao.updateByCondition(t,condition);

        /**
         * 根据Condition条件更新实体`record`包含的不是null的属性值
         * ==>  Preparing: UPDATE teacher SET id = id,age = ? WHERE ( name = ? )
         * ==> Parameters: 76(Integer), xxx(String)
         */
        teacherDao.updateByConditionSelective(t,condition);

        return 0;
    }
}

Dao:TeacherDao.java

package com.example.mapper.modules.dao;

import com.example.mapper.base.BaseMapper;
import com.example.mapper.modules.entity.Teacher;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

/**
 * @Description 正常的mybatis使用mapper.xml的方式编写sql语句
 *
 */
@Mapper
@Repository
public interface TeacherDao extends BaseMapper<Teacher> {

}

sql

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `id` int(9) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(3) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, 'gb', 76);

SET FOREIGN_KEY_CHECKS = 1;

 

注意

Condition condition = new Condition(UserEntity.class);
Condition.Criteria criteria = condition.createCriteria();
criteria.andEqualTo("key","123");

Condition相关的条件字段对应的是UserEntity实体类的属性,不是数据库中的字段名称,如:

key是UserEntity中的属性名,而数据库字段为KEY。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值