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.hqwc.cn/news/140623.html

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

相关文章

Python-flask高级使用

文章目录 一.Python-flask使用数据库第一步&#xff1a;首先安装包安装 flask-sqlalchemy (用于ORM&#xff09;&#xff1a;安装 flask-migrate (用于数据迁移)&#xff1a;安装 pymysql (MySQL驱动)&#xff1a; 第二步:在__init__ 配置第三步&#xff1a;插件管理第一步&…

react+ts手写cron表达式转换组件

前言 最近在写的一个分布式调度系统&#xff0c;后端同学需要让我传入cron表达式&#xff0c;给调度接口传参。我去了学习了解了cron表达式的用法&#xff0c;发现有3个通用的表达式刚好符合我们的需求&#xff1a; 需求 每天 xx 的时间&#xff1a; 0 11 20 * * ? 上面是…

通过内网穿透技术实现USB设备共享(USB Redirector)逆向共享

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序&#xff0c;它提供了共享和访问本地或互联网上的U…

Python 机器学习入门之K-Means聚类算法

系列文章目录 第一章 Python 机器学习入门之线性回归 K-Means聚类算法 系列文章目录前言一、K-Means简介1、定义2、例子3、K-Means与KNN 二、 K-Means实现1、步骤2、优化2.1 初始化优化之K-Means2.2 距离优化之elkan K-Means 三、优缺点1、优点2、缺点 前言 学完K近邻算法&a…

【Java 进阶篇】JavaScript 动态表格案例

在这篇博客中&#xff0c;我们将深入了解JavaScript如何创建和操作动态表格。我们将从头开始构建一个动态表格&#xff0c;并逐步添加各种功能&#xff0c;使其能够实现数据的添加、删除和编辑。这个示例将有助于理解如何在前端开发中使用JavaScript创建交互性强大的表格。 准…

Linux | vim的入门手册

目录 前言 一、什么是vim 二、vim编辑器的模式 1、插入模式 &#xff08;1&#xff09;用vim打开文件 &#xff08;2&#xff09;进入插入模式 2、默认模式 &#xff08;1&#xff09;光标移动 &#xff08;2&#xff09;复制、粘贴与剪切操作 &#xff08;3&#x…

uniapp checkbox样式失效,选中框选中按钮不显示

找了很多方法 最后网上一个博主找到了解决方法 在项目的main.css里面 如果你不知道你的css样式在哪个文件夹 直接全局搜索‘ 找到注释两个地方 第一个 checkbox::before 找到这一行 注释箭头指的地方就可以 第二个 checkbox .uni-checkbox-input::before, 注释这两个地方…

垃圾邮件(短信)分类算法实现 机器学习 深度学习 计算机竞赛

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…

腾讯云服务器上行带宽和下行带宽速度表

腾讯云服务器公网带宽下载速度计算&#xff0c;1M公网带宽下载速度是128KB/秒&#xff0c;5M带宽下载速度是512KB/s&#xff0c;腾讯云10M带宽下载速度是1.25M/秒&#xff0c;腾讯云百科txybk.com来详细说下腾讯云服务器不同公网带宽实际下载速度以及对应的上传速度对照表&…

Linux篇 五、Ubuntu与Linux板卡建立NFS服务

Linux系列文章目录 一、香橙派Zero2设置开机连接wifi 二、香橙派Zero2获取Linux SDK源码 三、香橙派Zero2搭建Qt环境 四、Linux修改用户名 文章目录 Linux系列文章目录前言一、连接到局域网互ping测试 二、安装NFS服务配置NFS更新exports配置三、板卡安装NFS客户端四、板卡临时…

php如何查找地图距离

要在PHP中使用高德地图、百度地图或腾讯地图获取位置信息&#xff0c;您可以使用它们的相应API服务。以下是获取位置信息的一般步骤&#xff1a; 思路: 获取API密钥&#xff1a;首先&#xff0c;您需要注册并获取相应地图服务提供商的API密钥。这将允许您访问他们的API以获取位…

数字图像处理实验记录二(直方图和直方图均衡化)

文章目录 一、基础知识1&#xff0c;什么是直方图2&#xff0c;直方图有什么用3&#xff0c;直方图均衡化4、原理代码实现 二、实验要求任务1&#xff1a;任务2&#xff1a; 三、实验记录任务1&#xff1a;任务2&#xff1a; 四、结果展示任务1&#xff1a;任务2&#xff1a; 五…