软件测试 | Java数据持久化技术(java对象持久化到数据库)
ztj100 2025-04-30 21:20 1 浏览 0 评论
TKMyBatis 简介
TKMybatis 是基于 Mybatis 框架开发的一个工具,内部实现了对单表的基本数据操作,只需要简单继承 TKMybatis 提供的接口,就能够实现无需编写任何 sql 即能完成单表操作。
下面简单介绍下 MyBatis , MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高 级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过 简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
TKMyBatis快速开始
MAVEN依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
在启动类中配置MAPPERSCAN扫描
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan("com.hogwartsmini.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
实体类中使用
在实体类中,常用的注解和意义为:
Table:描述数据库表信息,主要属性有 name(表名)、schema、catalog、uniqueConstraints 等。
Id:指定表主键字段,没有属性值。
Column:描述数据库字段信息,主要属性有 name(字段名)、columnDefinition、insertable、length、 nullable(是否可为空)、precision、scale、table、unique、updatable 等。
ColumnType:描述数据库字段类型,可对一些特殊类型作配置,进行特殊处理,主要属性有 jdbcType、column、typeHandler 等。
DAO 中使用
- 创建业务 Mapper 公共接口
首先创建一个公共接口,继承 Mapper, MySqlMapper, IdsMapper 三个类,用于后续业务 Mapper 接口 直接实现。
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface MySqlExtensionMapper<T> extends Mapper<T>, MySqlMapper<T>,
IdsMapper<T> {
}
- 创建业务Mapper接口
创建
HogwartsTestUserMapper.java接口
import com.hogwartsmini.demo.common.MySqlExtensionMapper;
import com.hogwartsmini.demo.entity.HogwartsTestUser;
import org.springframework.stereotype.Repository;
@Repository
public interface HogwartsTestUserMapper extends
MySqlExtensionMapper<HogwartsTestUser> {
}
SERVICE层中使用
- 查询
SPRING BOOT配置文件
spring:
application:
name: aitest
#数据库配置信息
datasource:
url: jdbc:mysql://localhost:3306/aitest_mini?
allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/
Shanghai
username: hogwarts
password: db@hogwarts
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.hogwartstest.aitestmini.entity
configuration:
mapUnderscoreToCamelCase: true
logging:
level:
com.hogwartstest.aitestmini.dao: debug #打印sql
示例表结构
CREATE TABLE `hogwarts_test_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT
NULL COMMENT '用户名',
`password` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT
NULL COMMENT '密码',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT
NULL COMMENT '邮箱',
`auto_create_case_job_name` varchar(50) CHARACTER SET utf8mb4 COLLATE
utf8mb4_general_ci DEFAULT NULL COMMENT '自动生成用例job名称 不为空时表示已经创建
job',
`start_test_job_name` varchar(50) CHARACTER SET utf8mb4 COLLATE
utf8mb4_general_ci DEFAULT NULL COMMENT '执行测试job名称 不为空时表示已经创建job',
`default_jenkins_id` int DEFAULT NULL COMMENT '默认Jenkins服务器',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户表';
CONTROLLER代码
import com.hogwartsmini.demo.entity.HogwartsTestUser;
import com.hogwartsmini.demo.service.HogwartsTestUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Author tlibn
* @Date 2020/7/16 17:14
**/
@Api(tags = "霍格沃兹测试学院-用户管理模块")
@RestController
@RequestMapping("hogwartsUser")
public class HogwartsTestUserDbController {
@Autowired
private HogwartsTestUserService hogwartsTestUserService;
@ApiOperation("用户注册")
@PostMapping("register")
public HogwartsTestUser register(
@RequestBody HogwartsTestUser hogwartsTestUser){
return hogwartsTestUserService.save(hogwartsTestUser);
}
@ApiOperation("用户信息修改接口")
@PutMapping()
public HogwartsTestUser updateUserInfo(
@RequestBody HogwartsTestUser hogwartsTestUser){
return hogwartsTestUserService.update(hogwartsTestUser);
}
@ApiOperation("根据用户id删除用户信息")
@DeleteMapping("{userId}")
public Integer delete(@PathVariable("userId") Integer userId){
return hogwartsTestUserService.delete(userId);
}
@ApiOperation("根据用户名查询")
@GetMapping("byName")
public List<HogwartsTestUser> getByName(
@RequestParam("userName") String userName){
HogwartsTestUser hogwartsTestUser = new HogwartsTestUser();
hogwartsTestUser.setUserName(userName);
return hogwartsTestUserService.getByName(hogwartsTestUser);
}
HOGWARTSTESTUSERSERVICE代码
import com.hogwartsmini.demo.entity.HogwartsTestUser;
import java.util.List;
public interface HogwartsTestUserService {
/**
* 保存
* @param hogwartsTestUser
* @return
*/
HogwartsTestUser save(HogwartsTestUser hogwartsTestUser);
/**
* 更新
* @param hogwartsTestUser
* @return
*/
HogwartsTestUser update(HogwartsTestUser hogwartsTestUser);
/**
* 根据用户名查询
* @param hogwartsTestUser
* @return
*/
List<HogwartsTestUser> getByName(HogwartsTestUser hogwartsTestUser);
/**
* 根据用户id删除用户信息
* @param userId
* @return
*/
Integer delete(Integer userId);
}
HOGWARTSTESTUSERSERVICEIMPL代码
import com.hogwartsmini.demo.dao.HogwartsTestUserMapper;
import com.hogwartsmini.demo.entity.HogwartsTestUser;
import com.hogwartsmini.demo.service.HogwartsTestUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @Author tlibn
* @Date 2020/7/17 11:03
**/
@Service
public class HogwartsTestUserServiceImpl implements HogwartsTestUserService {
@Autowired
private HogwartsTestUserMapper hogwartsTestUserMapper;
/**
* 保存
*
* @param hogwartsTestUser
* @return
*/
@Override
public HogwartsTestUser save(HogwartsTestUser hogwartsTestUser) {
hogwartsTestUser.setCreateTime(new Date());
hogwartsTestUser.setUpdateTime(new Date());
hogwartsTestUserMapper.insertUseGeneratedKeys(hogwartsTestUser);
return hogwartsTestUser;
}
/**
* 更新
*
* @param hogwartsTestUser
* @return
*/
@Override
public HogwartsTestUser update(HogwartsTestUser hogwartsTestUser) {
hogwartsTestUser.setCreateTime(new Date());
hogwartsTestUser.setUpdateTime(new Date());
hogwartsTestUserMapper.updateByPrimaryKeySelective(hogwartsTestUser);
return hogwartsTestUser;
}
/**
* 根据用户名查询
*
* @param hogwartsTestUser
* @return
*/
@Override
public List<HogwartsTestUser> getByName(HogwartsTestUser hogwartsTestUser) {
List<HogwartsTestUser> hogwartsTestUserList =
hogwartsTestUserMapper.select(hogwartsTestUser);
return hogwartsTestUserList;
}
/**
* 根据用户id删除用户信息
*
* @param userId
* @return
*/
@Override
public Integer delete(Integer userId) {
HogwartsTestUser hogwartsTestUser = new HogwartsTestUser();
hogwartsTestUser.setId(userId);
hogwartsTestUserMapper.delete(hogwartsTestUser);
return userId;
}
}
使用POSTMAN测试增删改查
新增
POSThttp://1270.0.1:8081/hogwartsUser/register
请求参数
{
"userName": "霍格沃兹test123",
"password": "test123"
}
响应参数
{
"id": 15,
"userName": "霍格沃兹test123",
"password": "test123",
"email": null,
"autoCreateCaseJobName": null,
"startTestJobName": null,
"defaultJenkinsId": null,
"createTime": "2021-04-14T09:37:58.358+00:00",
"updateTime": "2021-04-14T09:37:58.358+00:00"
}
查询
GET
http://127.0.0.1:8081/hogwartsUser/byName?userName=霍格沃兹test123
请求参数
见请求地址中 userName = 霍格沃兹test123
响应参数
[
{
"id": 15,
"userName": "霍格沃兹test123",
"password": "test123",
"email": null,
"autoCreateCaseJobName": null,
"startTestJobName": null,
"defaultJenkinsId": null,
"createTime": "2021-04-14T09:37:58.000+00:00",
"updateTime": "2021-04-14T09:37:58.000+00:00"
}
]
修改
PUT http://127.0.0.1:8081/hogwartsUser
请求参数
{
"id": 15,
"userName": "霍格沃兹test12345",
"password": "test123"
}
响应参数
{
"id": 15,
"userName": "霍格沃兹test12345",
"password": "test123",
"email": null,
"autoCreateCaseJobName": null,
"startTestJobName": null,
"defaultJenkinsId": null,
"createTime": "2021-04-14T09:43:45.018+00:00",
"updateTime": "2021-04-14T09:43:45.018+00:00"
}
删除
DELETE http://127.0.0.1:8081/hogwartsUser/15
请求参数
见请求地址中15
响应参数
15
搜索微信公众号:TestingStudio霍格沃兹的干货都很硬核
相关推荐
- Vue 技术栈(全家桶)(vue technology)
-
Vue技术栈(全家桶)尚硅谷前端研究院第1章:Vue核心Vue简介官网英文官网:https://vuejs.org/中文官网:https://cn.vuejs.org/...
- vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)
-
前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)在开发时,是不是遇到过这样的场景,响应...
- vue3 组件初始化流程(vue组件初始化顺序)
-
学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)...
- vue3优雅的设置element-plus的table自动滚动到底部
-
场景我是需要在table最后添加一行数据,然后把滚动条滚动到最后。查网上的解决方案都是读取html结构,暴力的去获取,虽能解决问题,但是不喜欢这种打补丁的解决方案,我想着官方应该有相关的定义,于是就去...
- Vue3为什么推荐使用ref而不是reactive
-
为什么推荐使用ref而不是reactivereactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代optionapi的data的替...
- 9、echarts 在 vue 中怎么引用?(必会)
-
首先我们初始化一个vue项目,执行vueinitwebpackechart,接着我们进入初始化的项目下。安装echarts,npminstallecharts-S//或...
- 无所不能,将 Vue 渲染到嵌入式液晶屏
-
该文章转载自公众号@前端时刻,https://mp.weixin.qq.com/s/WDHW36zhfNFVFVv4jO2vrA前言...
- vue-element-admin 增删改查(五)(vue-element-admin怎么用)
-
此篇幅比较长,涉及到的小知识点也比较多,一定要耐心看完,记住学东西没有耐心可不行!!!一、添加和修改注:添加和编辑用到了同一个组件,也就是此篇文章你能学会如何封装组件及引用组件;第二能学会async和...
- 最全的 Vue 面试题+详解答案(vue面试题知识点大全)
-
前言本文整理了...
- 基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时
-
今天给大家分享的是Vue3聊天实例中的朋友圈的实现及登录验证和倒计时操作。先上效果图这个是最新开发的vue3.x网页端聊天项目中的朋友圈模块。用到了ElementPlus...
- 不来看看这些 VUE 的生命周期钩子函数?| 原力计划
-
作者|huangfuyk责编|王晓曼出品|CSDN博客VUE的生命周期钩子函数:就是指在一个组件从创建到销毁的过程自动执行的函数,包含组件的变化。可以分为:创建、挂载、更新、销毁四个模块...
- Vue3.5正式上线,父传子props用法更丝滑简洁
-
前言Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性...
- Vue 3 生命周期完整指南(vue生命周期及使用)
-
Vue2和Vue3中的生命周期钩子的工作方式非常相似,我们仍然可以访问相同的钩子,也希望将它们能用于相同的场景。...
- 救命!这 10 个 Vue3 技巧藏太深了!性能翻倍 + 摸鱼神器全揭秘
-
前端打工人集合!是不是经常遇到这些崩溃瞬间:Vue3项目越写越卡,组件通信像走迷宫,复杂逻辑写得脑壳疼?别慌!作为在一线摸爬滚打多年的老前端,今天直接甩出10个超实用的Vue3实战技巧,手把...
- 怎么在 vue 中使用 form 清除校验状态?
-
在Vue中使用表单验证时,经常需要清除表单的校验状态。下面我将介绍一些方法来清除表单的校验状态。1.使用this.$refs...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Vue 技术栈(全家桶)(vue technology)
- vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)
- vue3 组件初始化流程(vue组件初始化顺序)
- vue3优雅的设置element-plus的table自动滚动到底部
- Vue3为什么推荐使用ref而不是reactive
- 9、echarts 在 vue 中怎么引用?(必会)
- 无所不能,将 Vue 渲染到嵌入式液晶屏
- vue-element-admin 增删改查(五)(vue-element-admin怎么用)
- 最全的 Vue 面试题+详解答案(vue面试题知识点大全)
- 基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)