目录
基于mybatis提供了很多第三方插件,这些插件通常可以完成数据操作方法的封装、数据库逆向工程工作(根据数据表生成实体类、映射文件)
tkMapper就是一个Mybatis插件,是在Mybatis的基础上提供了许多工具,让开发变得简单,提高开发效率
创建springboot工程,创建工程时,添加常用注解的添加(例如:springweb、mybatis、数据驱动文件、lombok)此处略~~
使用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的使用之前呢,我们需要做一些准备工作。
(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,所以在映射的时候,所以实体类名要与数据库表名保持一致(实体类名为表名首字母大写、带有下划线‘_’的名字,省去下划线,下划线后的第一个首字母大写)如果表名和实体类名不对应会报错,一共有两种解决方式:
在测试类的时候userdao会报错,提示“找不到userdao”,这里可以忽略(因为是可以获取到的),如果看着不舒服可以在接口中使用@Repository注解
测试结果:
增加方法在准备工作中已经完成,如果想了解此部分内容,可以向上进行查看,此处主要是添加功能的另一种实现————主键回填
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);
}
@Test
public void selectAllTest(){
List<Users> usersList = userDao.selectAll();
for (Users i :usersList
) {
System.out.println(i);
}
}
测试结果:
@Test
public void selectbyidTest(){
Users users = userDao.selectByPrimaryKey(8);
System.out.println(users);
}
测试结果:
查询用户名为‘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);
}
测试结果:
查询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);
}
}
输出结果如下:
逆向工程,就是根据创建好的数据表,生成实体类、dao、映射文件
此依赖是一个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>
在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执行逆向生成~
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185192.html原文链接:https://javaforall.cn