目录

一、快速认识tkMapper:

二、tkMapper整合

2.1基于springboot整合mybatis

2.2 添加tkMapper依赖

三、tkMapper的使用: 

3.1tkMapper常用方法之增删改

3.2tkMapper常用方法之查询

3.3tkMapper关联查询实现

四、tkMapper逆向工程

一、快速认识tkMapper:

        基于mybatis提供了很多第三方插件,这些插件通常可以完成数据操作方法的封装、数据库逆向工程工作(根据数据表生成实体类、映射文件)

        tkMapper就是一个Mybatis插件,是在Mybatis的基础上提供了许多工具,让开发变得简单,提高开发效率

  • 提供了针对表通用的数据库操作方法
  • 逆向工程(根据数据表生成实体类、dao接口、映射文件)

二、tkMapper整合

 2.1基于springboot整合mybatis

        创建springboot工程,创建工程时,添加常用注解的添加(例如:springweb、mybatis、数据驱动文件、lombok)此处略~~

2.2 添加tkMapper依赖

        使用tkMapper必须要导入它的依赖项,根据循序渐进和需要我们会添加所有的相关依赖,在这里我们首先需要添加tkmapper的依赖

  <!--整合tkmapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

        添加启动类配置文件:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/fmmall
spring.datasource.username=root
spring.datasource.password=990501

mybatis.type-aliases-package=com.xgsm.beans
mybatis.mapper-locations=classpath:mappers/*Mapper

        添加完依赖和启动类配置文件之后,我们需要修改一下@MapperScan注解的包为:import tk.mybatis.spring.annotation.MapperScan;(很重要!!)

三、tkMapper的使用:

        在对tkMapper的使用之前呢,我们需要做一些准备工作。

(1)、创建数据表

users表:

CREATE TABLE `users` (
  `user_id` int NOT NULL AUTO_INCREMENT COMMENT '主键id 用户id',
  `username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名 用户名',
  `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码 密码',
  `nickname` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '昵称 昵称',
  `realname` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '真实姓名 真实姓名',
  `user_img` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '头像 头像',
  `user_mobile` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号 手机号',
  `user_email` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮箱地址 邮箱地址',
  `user_sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '性别 M(男) or F(女)',
  `user_birth` date DEFAULT NULL COMMENT '生日 生日',
  `user_regtime` datetime NOT NULL COMMENT '注册时间 创建时间',
  `user_modtime` datetime NOT NULL COMMENT '更新时间 更新时间',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT COMMENT='用户 ';

/*Data for the table `users` */

insert  into `users`(`user_id`,`username`,`password`,`nickname`,`realname`,`user_img`,`user_mobile`,`user_email`,`user_sex`,`user_birth`,`user_regtime`,`user_modtime`) values (1,'zhangsan','f379eaf3c831b04de153469d1bec345e',NULL,NULL,'img/default.png',NULL,NULL,NULL,NULL,'2021-04-15 16:10:53','2021-04-15 16:10:53'),(2,'aaaa','1111',NULL,NULL,'img/default.png',NULL,NULL,NULL,NULL,'2021-04-16 11:10:01','2021-04-16 11:10:01'),(3,'wahaha','4297f44b13955235245b2497399d7a93',NULL,NULL,'img/default.png',NULL,NULL,NULL,NULL,'2021-04-16 15:36:52','2021-04-16 15:36:52'),(4,'heihei','4297f44b13955235245b2497399d7a93','二狗',NULL,'img/default.png',NULL,NULL,NULL,NULL,'2021-04-16 15:38:49','2021-04-16 15:38:49'),(5,'Tony','4297f44b13955235245b2497399d7a93','托尼',NULL,'img/default.png',NULL,NULL,NULL,NULL,'2021-04-23 10:25:04','2021-04-23 10:25:04'),(6,'hanmeimei','f379eaf3c831b04de153469d1bec345e',NULL,NULL,'img/default.png',NULL,NULL,NULL,NULL,'2021-04-23 10:30:52','2021-04-23 10:30:52'),(7,'lilei123','4297f44b13955235245b2497399d7a93',NULL,NULL,'img/default.png',NULL,NULL,NULL,NULL,'2021-04-23 10:33:03','2021-04-23 10:33:03'),(8,'tom123123','4297f44b13955235245b2497399d7a93',NULL,NULL,'img/default.png',NULL,NULL,NULL,NULL,'2021-04-23 10:34:49','2021-04-23 10:34:49');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

user_addr表: 

/*
SQLyog Ultimate v10.00 Beta1
MySQL - 8.0.26 : Database - fmmall
*********************************************************************
*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`fmmall` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `fmmall`;

/*Table structure for table `user_addr` */

DROP TABLE IF EXISTS `user_addr`;

CREATE TABLE `user_addr` (
  `addr_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '地址主键id',
  `user_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户ID',
  `receiver_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收件人姓名',
  `receiver_mobile` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收件人手机号',
  `province` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '省份',
  `city` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '城市',
  `area` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '区县',
  `addr` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '详细地址',
  `post_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮编',
  `status` int DEFAULT NULL COMMENT '状态,1正常,0无效',
  `common_addr` int DEFAULT NULL COMMENT '是否默认地址 1是 1:是  0:否',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`addr_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT COMMENT='用户地址 ';

/*Data for the table `user_addr` */

insert  into `user_addr`(`addr_id`,`user_id`,`receiver_name`,`receiver_mobile`,`province`,`city`,`area`,`addr`,`post_code`,`status`,`common_addr`,`create_time`,`update_time`) values ('1','1','张三','13030303300','湖北','武汉','江夏区','光谷大道77号','421000',1,1,'2021-04-30 09:33:30','2021-04-28 09:33:37'),('2','1','小丽','13131313311','湖北','宜昌','夷陵区','巴拉巴拉','410000',1,0,'2021-04-30 09:34:41','2021-04-30 09:34:44'),('3','6','韩梅梅','13232323322','湖南','长沙','岳麓区','淅沥淅沥','430000',1,1,'2021-04-30 09:35:49','2021-04-30 09:35:53');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

(2)、创建实体类

 Users:

package com.xgsm.beans;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;
import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Users implements Serializable{
    /** 主键id;用户id */
    private Integer userId ;
    /** 用户名;用户名 */
    private String username ;
    /** 密码;密码 */
    private String password ;
    /** 昵称;昵称 */
    private String nickname ;
    /** 真实姓名;真实姓名 */
    private String realname ;
    /** 头像;头像 */
    private String userImg ;
    /** 手机号;手机号 */
    private String userMobile ;
    /** 邮箱地址;邮箱地址 */
    private String userEmail ;
    /** 性别;M(男) or F(女) */
    private char userSex ;
    /** 生日;生日 */
    private Date userBirth ;
    /** 注册时间;创建时间 */
    private Date userRegtime ;
    /** 更新时间;更新时间 */
    private Date userModtime ;


}

 UserAddr:

package com.xgsm.beans;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.Date;;


/**
 * 用户地址;
 * @author : http://www.chiner.pro
 * @date : 2022-7-24
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserAddr{
    /** 地址主键id */
    private String addrId ;
    /** 用户ID */
    private String userId ;
    /** 收件人姓名 */
    private String receiverName ;
    /** 收件人手机号 */
    private String receiverMobile ;
    /** 省份 */
    private String province ;
    /** 城市 */
    private String city ;
    /** 区县 */
    private String area ;
    /** 详细地址 */
    private String addr ;
    /** 邮编 */
    private String postCode ;
    /** 状态;1正常,0无效 */
    private Integer status ;
    /** 是否默认地址;1是 1:是  0:否 */  0:否")
    private Integer commonAddr ;
    /** 创建时间 */
    private Date createTime ;
    /** 更新时间 */
    private Date updateTime ;

}

(3)、创建dao接口

        tkMapper已经完成了对单表的通用操作的封装,主要封装在Mapper接口和MysqlMapper接口中,因此我们如果要完成对单表的操作,只需要自定义dao接口继承这两个接口即可 。

package com.xgsm.dao;

import com.xgsm.beans.Users;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

public interface UserDao  extends Mapper<Users>, MySqlMapper<Users> {
}

(4)、测试接口

        导入junit和springboot-test依赖

   <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>4.13.2</scope>
        </dependency>
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

         使用junit生成测试文件

package com.xgsm.dao;

import com.xgsm.beans.Users;
import com.xgsm.tkmapperdemo.TkmapperApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;

import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TkmapperApplication.class)
public class UserDaoTest {
@Autowired
    private UserDao userDao;
@Test
public void test(){
    System.out.println(userDao);
    Users users = new Users();
    users.setUsername("aaa");
    users.setPassword("daddd");
    users.setUserImg("njh.png");
    users.setUserModtime(new Date());
    users.setUserRegtime(new Date());
    userDao.insert(users);
}
}

         避坑由于我们使用的是tkMapper,所以在映射的时候,所以实体类名要与数据库表名保持一致(实体类名为表名首字母大写、带有下划线‘_’的名字,省去下划线,下划线后的第一个首字母大写)如果表名和实体类名不对应会报错,一共有两种解决方式:

  1. 修改实体类名,与表名对应
  2. 使用@Table()注解指定表名

        在测试类的时候userdao会报错,提示“找不到userdao”,这里可以忽略(因为是可以获取到的),如果看着不舒服可以在接口中使用@Repository注解

测试结果:

3.1tkMapper常用方法之增删改

3.1.1增加:

        增加方法在准备工作中已经完成,如果想了解此部分内容,可以向上进行查看,此处主要是添加功能的另一种实现------------主键回填

package com.xgsm.dao;

import com.xgsm.beans.Users;
import com.xgsm.tkmapperdemo.TkmapperApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;

import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TkmapperApplication.class)
public class UserDaoTest {
@Autowired
    private UserDao userDao;
@Test
public void addtest(){
    System.out.println(userDao);
    Users users = new Users();
    users.setUsername("aaa");
    users.setPassword("daddd");
    users.setUserImg("njh.png");
    users.setUserModtime(new Date());
    users.setUserRegtime(new Date());
//    回填id
    int i = userDao.insertUseGeneratedKeys(users);
    System.out.println(users.getUserId());
    assertEquals(1,i);
}


}

测试结果:

测试结果,回填的id为空,这里也是一个坑。注意:在进行主键回填的时候,实体类中id必须要用@Id指定一下 ,要不然映射的时候找不到id;

再次测试~

3.1.2修改

        修改主键为‘9’的用户信息。过程如下:创建一个users对象,对象的id是需要修改的用户的id,其他信息是需要更改后的信息。代码如下:

@Test
    public void updateTest(){
    Users users = new Users(9,"aaaaa","323232","蛙哈哈","我是娃哈哈","wahaha.jpg",null,null,'男',new Date(),new Date(),new Date());
//    修改主键为9的用户信息
   int i =userDao.updateByPrimaryKey(users);
//   断言
   assertEquals(1,i);
}

测试结果: 

 3.1.3删除:

        根据id进行删除,代码如下:

    @Test
    public void deleteTest(){
      int i = userDao.deleteByPrimaryKey(9);
        assertEquals(1,i);
    }

3.2tkMapper常用方法之查询

3.2.1查询所有:

   @Test
    public void selectAllTest(){
      List<Users> usersList = userDao.selectAll();
        for (Users i :usersList
             ) {
            System.out.println(i);
        }
    }

测试结果:

 3.2.2根据主键查询:

    @Test
    public void selectbyidTest(){
        Users users = userDao.selectByPrimaryKey(8);
        System.out.println(users);
    }

测试结果:

 3.2.3根据条件查询

        查询用户名为‘aaaa’的用户

 @Test
    public void select3Test(){//条件查询
       Example em = new Example(Users.class);//可以封装任何条件,需要给一个泛型
//       将条件封装到example的内部类
       Example.Criteria criteria = em.createCriteria();
//       条件的封装是面向对象的
       criteria.andEqualTo("username","aaaa");
//       criteria.andEqualTo("password","1111");
        List<Users> users = userDao.selectByExample(em);//符合条件的可能是个集合
        System.out.println(users);
    }

测试结果:

3.3tkMapper关联查询实现

        查询userid为1的用户信息以及他的收货地址信息

(1)、创建UserAddrDao 

package com.xgsm.dao;

import com.xgsm.beans.UserAddr;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
import tk.mybatis.mapper.common.SqlServerMapper;

public interface UserAddrDao extends Mapper<UserAddr>, MySqlMapper<UserAddr> {
}

(2)、实现

        实现思路:在Users中添加 private List<UserAddr> userAddrList。在实现中,先对userID为1 的用户信息进行查询,然后拿到用户信息后,在用查询到的userid作为查询条件,查询userid为1的用户收货地址信息即可~代码如下:

    package com.xgsm.dao;

import com.xgsm.beans.UserAddr;
import com.xgsm.beans.Users;
import com.xgsm.tkmapperdemo.TkmapperApplication;
import org.apache.catalina.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;
import java.util.List;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TkmapperApplication.class)
public class UserDaoTest {
    @Autowired
    private UserDao userDao;
    @Autowired
    private UserAddrDao userAddrDao;


    @Test
    public void select4Test() {//条件查询
        Example em = new Example(Users.class);//可以封装任何条件,需要给一个泛型
//       将条件封装到example的内部类
        Example.Criteria criteria = em.createCriteria();
//       条件的封装是面向对象的
        criteria.andEqualTo("userId", 1);
        List<Users> users = userDao.selectByExample(em);//符合条件的可能是个集合
//       得到userid后,二次查询
        Example example = new Example(UserAddr.class);
        Example.Criteria criteriaAddr = example.createCriteria();
        criteria.andEqualTo("userId", users.get(0).getUserId());
        List<UserAddr> userAddrList = userAddrDao.selectByExample(example);
//        将查询到的集合给users
        users.get(0).setUserAddrList(userAddrList);
        for (Users i:users
             ) {
            System.out.println(i);
        }


//

        System.out.println(users);
    }


}

输出结果如下:

四、tkMapper逆向工程

        逆向工程,就是根据创建好的数据表,生成实体类、dao、映射文件

4.1添加逆向工程依赖

        此依赖是一个mybatis的maven插件

   <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.29</version>
                    </dependency>
                    <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.1.5</version>
                    </dependency>

                </dependencies>
            </plugin>

4.2逆向工程配置

        在resources目录下创建generatorConfig.xml,在里面定义了需要生成的表,以及生成文件的路径等信息~

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!-- 引入数据库连接配置 -->
    <!--    <properties resource="jdbc.properties"/>-->

    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 配置 GeneralDAO -->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="com.xgsm.general.GeneralDao"/>
        </plugin>

        <!-- 配置数据库连接 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/fmmall"
                        userId="root" password="990501">
        </jdbcConnection>

        <!-- 配置实体类存放路径 -->
        <javaModelGenerator targetPackage="com.xgsm.beans" targetProject="src/main/java"/>

        <!-- 配置 XML 存放路径 -->
        <sqlMapGenerator targetPackage="/" targetProject="src/main/resources/mappers"/>

        <!-- 配置 DAO 存放路径 -->
        <javaClientGenerator targetPackage="com.xgsm.dao" targetProject="src/main/java" type="XMLMAPPER"/>

        <!-- 配置需要指定生成的数据库和表,% 代表所有表 -->
        <table tableName="%"></table>
    </context>
</generatorConfiguration>

          在此之前要先声明一个‘GeneralDao’

package com.xgsm.general;

import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

@Repository
public interface GeneralDao<T> extends MySqlMapper<T>, Mapper<T> {
}

        将‘配置文件’设置到maven插件中

  <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <configuration>
<!--                    配置 配置文件的路径-->
                    <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.29</version>
                    </dependency>
                    <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.1.5</version>
                    </dependency>

                </dependencies>
            </plugin>

        双击mybatis-generator:generate执行逆向生成~

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐