Mybatis对数据库进行增删查改以及单元测试

这篇写的草率了,是好几天前学到,以后用来自己复习 

 UserInfo

import lombok.Data;@Data
public class UserInfo {private int id;private String name;private int age;private String email;//LocalDateTime可用于接收  时间}

Mapper 

UserMapper

package com.example.demo1014.mapper;import com.example.demo1014.entity.UserInfo;
import lombok.Data;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.*;@Mapper
public interface UserMapper {// UserInfo getUserById(Integer id);UserInfo getUserById(@Param("user_id") Integer id);//这里的参数“user_id”与resources.mybatis.UserMapper.xml里面的id的值相对应//查所有用户信息List<UserInfo> getAll();//插入信息int add(UserInfo userinfo);//添加并返回用户的自增ID:int addGetId(UserInfo userinfo);//修改操作:int upUserName(UserInfo userinfo);//删除操作:int delById(@Param("id") Integer id);List<UserInfo> getListByOrder(@Param("order") String order);//类似登录逻辑的实现————根据name和id一起查询信息,只有一个就不行;UserInfo login(@Param("name") String name,@Param("email") String email);//进行模糊查询List<UserInfo> getListByName(@Param("name") String name);int add2(UserInfo userinfo);int add3(UserInfo userinfo);List<UserInfo>   getListByParam(String name,Integer id);int update2(UserInfo userinfo);int dels(List<Integer> ids);}
/**mapper里面有接口有xml文件;* */
/**接口:* 接口中的方法都没有方法体都是抽象方法* **//**单元测试:* 1.在需要进行单元测试的类中选择generate* */

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo1014.mapper.UserMapper"><select id="getUserById" resultType="com.example.demo1014.entity.UserInfo">SELECT * FROM UserInfo WHERE id = #{user_id}<!--这里的#{user_id}是与Java对象中的属性对应的,而不是数据库的字段--></select><select id="getAll" resultType="com.example.demo1014.entity.UserInfo">select * from userinfo</select><insert id="add">insert into userinfo(id,name,age,email) values(#{id},#{name},#{age},#{email})</insert><!--insert默认返回值就是int--><!--返回自增id,这里的“”里面一定是程序中实体类的属性而不是数据库中的字段--><insert id="addGetId" useGeneratedKeys="true" keyProperty="id">insert into userinfo(id,name,age,email) values(#{id},#{name},#{age},#{email})</insert><update id="upUserName">update userinfo set name= #{name} where id=#{id}</update><delete id="delById">delete from userinfo where id = #{id}</delete><select id="getListByOrder" resultType="com.example.demo1014.entity.UserInfo">select* from userinfo order by id ${order}</select><select id="login" resultType="com.example.demo1014.entity.UserInfo">select* from userinfo where name='${name}' and email =#{email}</select><select id="getListByName"  resultType="com.example.demo1014.entity.UserInfo">select* from userinfo where name like  CONCAT('%', #{name}, '%')</select><!--必填和非必填的<if>标签--><insert id="add2">insert into userinfo(id,<if test="name!=null">name,</if>age) values(#{id},<if test="name!=null">#{name},</if>#{age})</insert><insert id="add3">insert into userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="id!=null">id,</if><if test="name!=null">name,</if><if test="age!=null">age,</if><if test="email!=null">email,</if></trim> values<trim prefix="(" suffix=")" suffixOverrides=","><if test="id!=null">#{id},</if><if test="name!=null">#{name},</if><if test="age!=null">#{age},</if><if test="email!=null">#{email},</if></trim></insert><select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">select* from userinfo
<!--        <where>-->
<!--            <if test="name!=null">-->
<!--              and  name=#{name}-->
<!--            </if>-->
<!--            <if test="id!=null">-->
<!--              and  id=#{id}--><!--            </if>-->
<!--        </where>--><trim prefix="where" prefixOverrides="and"><if test="name!=null">and name=#{name}</if><if test="id!=null">and id=#{id}</if></trim></select><update id="update2">update userinfo<set><if test="id!=null">id=#{id},</if><if test="name!=null">name=#{name},</if></set>where id=#{id}</update><delete id="dels">     <!--delete from userinfo where id in ()-->delete from userinfo where id in<foreach collection="ids" open="(" close=")" item="id" separator=",">#{id}</foreach></delete></mapper>
<!--namsespace是xml实现接口的全路径(包名+接口名) id是实现的方法名  resultType是返回的类型 ${}是标签,用来传递参数-->

service

package com.example.demo1014.service;import com.example.demo1014.entity.UserInfo;
import com.example.demo1014.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowired//依赖注入private UserMapper userMapper;public UserInfo getUserById(Integer id){return userMapper.getUserById(id);}
}

controller

package com.example.demo1014.controller;import com.example.demo1014.entity.UserInfo;
import com.example.demo1014.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController//=@ResponseBody+@Controller
@RequestMapping("/user")public class UserController {@Autowiredprivate UserService userservice;@RequestMapping("/getuserbyid")public UserInfo getUserById(Integer id ){if(id==null) return null;return userservice.getUserById(id);}}

//此时就可以用postman查询了使用http://127.0.0.1:8080/user/getuserbyid?id=1
//查询到{
    "id": 1,
    "name": "John",
    "age": 25,
    "email": "john@example.com"
}
 

 如何进行单元测试?

在UserMApper类里面,右键->generate ->Test->勾选你想要的方法

进入Test

需要注意@Transaction可开启事务,不污染数据库。

package com.example.demo1014.mapper;
/**单元测试:* 1.在需要进行单元测试的类中选择generate* */import com.example.demo1014.entity.UserInfo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;import java.util.List;import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest//1. 表明当前单元测试是运行在SpringBoot中
//@Transactional //Spring 将会在方法执行前开启一个事务,在方法执行结束后根据方法的执行结果进行事务的提交或回滚
class UserMapperTest {@Autowired//2. 注入测试对象private UserMapper userMapper;@Testvoid getUserById() {//3. 添加单元测试的业务代码UserInfo userinfo=userMapper.getUserById(1);System.out.println(userinfo);/**使用断言->判断最终结果是否符合预期!?** */Assertions.assertEquals("John",userinfo.getName());}@Testvoid getAll() {List<UserInfo> list=userMapper.getAll();Assertions.assertEquals(8,list.size());}@Testvoid add() {UserInfo userinfo = new UserInfo();userinfo.setId(11);userinfo.setName("小龙女");userinfo.setAge(18);userinfo.setEmail("xxx@example.com");int result = userMapper.add(userinfo);assertEquals(1, result); // 验证插入是否成功// sqlSession.commit(); // 提交事务}@Testvoid addGetId() {//UserInfo userinfo=new UserInfo();userinfo.setId(9);userinfo.setAge(30);userinfo.setName("小龙女");userinfo.setEmail("33780908@qq.com");//调用mybatis添加方法执行添加操作int result=userMapper.addGetId(userinfo);System.out.println("添加:"+result);int uid=userinfo.getId();System.out.println("用户id:"+uid);Assertions.assertEquals(1,result);//2023-10-15 16:50:24.135  INFO 23020 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...//2023-10-15 16:50:24.327  INFO 23020 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.//添加:1//用户id:5}@Testvoid upUserName() {//构建测试数据UserInfo userinfo=new UserInfo();userinfo.setId(6);userinfo.setName("孙悟空");//受影响的行数:int result=userMapper.upUserName(userinfo);System.out.println("修改:"+result);Assertions.assertEquals(1,result);}@Test// @Transactional//加上后就不会污染我们的数据库信息;void delById() {Integer id=6;int result= userMapper.delById(id);System.out.println("删除:"+result);Assertions.assertEquals(1,result);}@Testvoid   getListByOrder() {List<UserInfo> list=userMapper.getListByOrder("asc");System.out.println(list);}@Testvoid login() {String email="1111@qq.com";// String name="mike";String name="' or 1='1";UserInfo userinfo=userMapper.login(name,email);System.out.println("用户登陆状态:"+(userinfo==null?"失败":"成功"));}@Testvoid add2() {UserInfo userinfo=new UserInfo();userinfo.setId(11);userinfo.setName(null);userinfo.setAge(111111);// userinfo.setEmail("222");int result=userMapper.add2(userinfo);System.out.println("result:"+result);}@Testvoid add3() {UserInfo userinfo=new UserInfo();userinfo.setId(13);userinfo.setName("sss");userinfo.setEmail("12432`");int result=userMapper.add3(userinfo);Assertions.assertEquals(1,result);}@Testvoid getListByParam() {List<UserInfo> list=userMapper.getListByParam("John",1);//select* from userinfo WHERE name=? and id=?List<UserInfo> list1=userMapper.getListByParam("John",null);// select* from userinfo WHERE name=?List<UserInfo> list2=userMapper.getListByParam(null,1);//select* from userinfo WHERE id=?List<UserInfo> list3=userMapper.getListByParam(null,null);//select* from userinfo}@Testvoid update2() {UserInfo userinfo=new UserInfo();userinfo.setId(2);userinfo.setName("小李子zi");userMapper.update2(userinfo);}/**在pom.xml中添加配置* # 开启mybatis sql 日志打印;*   configuration:*     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl** # 配置打印MyBatis执行的sql;* logging:*   level:*     com:*       example:*         demo1014: debug*  后,可进行打印日志* ==>  Preparing: update userinfo set name= ? where id=?* ==> Parameters: 孙悟空(String), 4(Integer)* <==    Updates: 1* **/}/**  参数占位符 #{} 和 ${} :* #{}:预编译处理;* ${}: 字符直接替换;** Mybatis在处理#{}时,会把SQL中的#{}替换成?,使用PaeparedStatement的set方法来复制,直接替换:Mybatis在处理${},是把${}替换成变量的值;* $的应用场景:使用Java中的关键字的时候!* ${sort}可以实现排序查询,而是用#{sort}就不能实现排序查询了,因为当使用#{sort}查询的时候,如果查询的值是String,则会加单引号,就会导致sql错误;** **/

这个插件好用,推荐MyBatisx, 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年中国多功能折叠刀产量、销量及市场规模分析[图]

多功能折叠刀是一种集多种功能于一身的刀具&#xff0c;通常包括切割、开瓶、剥皮、锯木等功能&#xff0c;可以通过折叠和展开的方式来实现不同的功能&#xff0c;具有便携、多用途、安全等特点&#xff0c;广泛应用于户外探险、露营、自驾旅行等场景。 多功能折叠刀行业分类…

Simian使用方法

1.下载 链接1&#xff1a;官网下载 链接2&#xff1a;压缩包 2.操作 1.双击exe启动 2.打开控制台&#xff0c;winR 输入cmd 3.输入操作语句 G:\1111\simian-2.5.10\bin\simian-2.5.10.exe -includes"G:\1111\test\*.cpp" -threshold3 > output.txt G:\1111\si…

利用TypeScript 和 jsdom 库实现自动化抓取数据

以下是一个使用 TypeScript 和 jsdom 库的下载器程序&#xff0c;用于下载zhihu的内容。此程序使用了 duoip.cn/get_proxy 这段代码。 import { JSDOM } from jsdom; import { getProxy } from https://www.duoip.cn/get_proxy;const zhihuUrl https://www.zhihu.com;(async (…

璞华科技再次赋能,助力成都市温江区“码”上维权不烦“薪” !

科技赋能护“薪”行动 “码”上维权不烦“薪” 为保障劳动者工资收入的合法权益&#xff0c;提升人社部门智能化咨询服务能力&#xff0c;2023年10月17日&#xff0c;成都市温江区人力资源和社会保障局发布“码上护薪”小程序&#xff0c;助力劳动者“码”上维权不烦”薪”。…

【Machine Learning】01-Supervised learning

01-Supervised learning 1. 机器学习入门1.1 What is Machine Learning?1.2 Supervised learning1.3 Unsupervised learning 2. Supervised learning2.1 单元线性回归模型2.1.1 Linear Regression Model&#xff08;线性回归模型&#xff09;2.1.2 Cost Function&#xff08;代…

学习编程语言需要熟悉库函数吗?

学习编程语言需要熟悉库函数吗? 我想答案肯定是需要的。 但不是盲目的挨个去记&#xff0c;几乎各个语言的库函数都极为丰富&#xff0c;逐个记忆的话是十分劝退的&#xff0c;而且也不可能全部熟悉&#xff0c;到用的时候该忘还是忘。最近很多小伙伴找我&#xff0c;说想要一…

AArch64 TrustZone

概述 本文我们介绍了 TrustZone 技术。通过CPU内置的硬件强制隔离&#xff0c;TrustZone 提供了一种高效的全系统安全设计。 我们介绍了如下功能&#xff1a;将 TrustZone 技术添加到处理器架构中&#xff0c;内存系统对于 TrustZone 的支持以及典型的软件架构。我们还介绍了…

利用MixProxy自动录制生成Pytest案例:轻松实现测试脚本编写!

前言 进行接口自动化时&#xff0c;有时候往往没有接口文档&#xff0c;或者文档更新并不及时&#xff0c;此时&#xff0c;想要获取相关接口&#xff0c;通过抓包是一种快速便捷的手段。抓包获取到接口后&#xff0c;开始写接口用例&#xff0c;此时需要复制请求url、请求参数…

全开源无加密跨境电商购物网站系统源码(无货源模式+多语言+多货币)

在全球化的时代背景下&#xff0c;跨境电商成为了越来越受欢迎的消费方式&#xff0c;而建立一个源码无加密多语言跨境购物网站系统是一个具有挑战性的任务&#xff0c;但完全可行。以下是这个过程的一些主要步骤&#xff1a; 1. 确定需求和功能规划&#xff1a;先确定网站需要…

IOday7

A进程 #include <head.h> int main(int argc, const char *argv[]) {pid_t cpidfork();if(cpid>0)//父进程向管道文件2写{ int wfd;if((wfdopen("./myfifo2",O_WRONLY))-1){ERR_MSG("open");return -1;} char buf[128]"";while(1){bze…

Python接口自动化 —— token登录(详解)

简介 为了验证用户登录情况以及减轻服务器的压力&#xff0c;减少频繁的查询数据库&#xff0c;使服务器更加健壮。有些登录不是用 cookie 来验证的&#xff0c;是用 token 参数来判断是否登录。token 传参有两种一种是放在请求头里&#xff0c;本质上是跟 cookie 是一样的&am…

MySql 数据库基础概念,基本简单操作及数据类型介绍

文章目录 数据库基础为什么需要数据库&#xff1f;创建数据库mysql架构SQL语句分类编码集修改数据库属性数据库备份 表的基本操作存在时更新&#xff0c;不存在时插入 数据类型日期类型enum和set 数据库基础 以特定的格式保存文件&#xff0c;叫做数据库&#xff0c;这是狭义上…

逐字稿 | 8 视频理解论文串讲(上)【论文精读】

目录 1 自从 Alexnet 之后&#xff0c;对视频理解的研究就从这种手工特征慢慢转移到卷积神经网络了。 ​编辑 1.1Deep video——深度学习时代&#xff0c;使用卷积神经网络去处理视频理解问题的最早期的工作之一 1.2如何把卷积神经网络&#xff0c;从图片识别应用到视频识别…

Nginx详细配置指南

nginx.conf配置 找到Nginx的安装目录下的nginx.conf文件&#xff0c;该文件负责Nginx的基础功能配置。 配置文件概述 Nginx的主配置文件(conf/nginx.conf)按以下结构组织&#xff1a; 配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理…

Pyecharts绘图教程(1)—— Pyecharts可视化神器基础入门

文章目录 &#x1f3af; 1. 简介1.1 Pyecharts 是什么1.2 Pyecharts 特性 &#x1f3af; 2. 安装2.1 Pyecharts 版本2.2 常用安装方式2.3 安装地图文件&#xff08;可选&#xff09; &#x1f3af; 3. 图表类型3.1 直角坐标系图表3.2 基本图表3.3 树形图表3.4 地理图表3.5 3D图…

redis(其它操作、管道)、django中使用redis(通用方案、 第三方模块)、django缓存、celery介绍(celery的快速使用)

1 redis其它操作 2 redis管道 3 django中使用redis 3.1 通用方案 3.2 第三方模块 4 django缓存 5 celery介绍 5.1 celery的快速使用 1 redis其它操作 delete(*names) exists(name) keys(pattern*) expire(name ,time) rename(src, dst) move(name, db)) randomkey() type(na…

COCO数据集解析

介绍 官网&#xff1a;https://cocodataset.org/ 下载地址&#xff1a;https://cocodataset.org/#download COCO的全称是Common Objects in COntext&#xff0c;起源于微软于2014年出资标注党的Microsoft COCO数据&#xff0c;与ImageNet竞赛一样&#xff0c;是计算机视觉领域…

安卓14通过“冻结”缓存应用程序腾出CPU,提高性能和内存效率

本月早些时候&#xff0c;我们听说更新到安卓14似乎提高了谷歌Pixel 7和Pixel 6的效率——提高了电池寿命&#xff0c;并在这个过程中减少了热量的产生。现在看来&#xff0c;安卓14的增效功能细节已经公布。 安卓侦探Mishaal Rahman在X&#xff08;前身为Twitter&#xff09;…

阿里云优惠口令(2023更新)

2023年阿里云域名优惠口令&#xff0c;com域名续费优惠口令“com批量注册更享优惠”&#xff0c;cn域名续费优惠口令“cn注册多个价格更优”&#xff0c;cn域名注册优惠口令“互联网上的中国标识”&#xff0c;阿里云优惠口令是域名专属的优惠码&#xff0c;可用于域名注册、续…

工程企业管理软件源码-综合型项目管理软件

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…