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


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

     UserInfo

    1. import lombok.Data;
    2. @Data
    3. public class UserInfo {
    4. private int id;
    5. private String name;
    6. private int age;
    7. private String email;
    8. //LocalDateTime可用于接收 时间
    9. }

    Mapper 

    UserMapper

    1. package com.example.demo1014.mapper;
    2. import com.example.demo1014.entity.UserInfo;
    3. import lombok.Data;
    4. import org.apache.ibatis.annotations.Mapper;
    5. import org.apache.ibatis.annotations.Param;
    6. import java.util.*;
    7. @Mapper
    8. public interface UserMapper {
    9. // UserInfo getUserById(Integer id);
    10. UserInfo getUserById(@Param("user_id") Integer id);
    11. //这里的参数“user_id”与resources.mybatis.UserMapper.xml里面的id的值相对应
    12. //查所有用户信息
    13. List getAll();
    14. //插入信息
    15. int add(UserInfo userinfo);
    16. //添加并返回用户的自增ID:
    17. int addGetId(UserInfo userinfo);
    18. //修改操作:
    19. int upUserName(UserInfo userinfo);
    20. //删除操作:
    21. int delById(@Param("id") Integer id);
    22. List getListByOrder(@Param("order") String order);
    23. //类似登录逻辑的实现————根据name和id一起查询信息,只有一个就不行;
    24. UserInfo login(@Param("name") String name,@Param("email") String email);
    25. //进行模糊查询
    26. List getListByName(@Param("name") String name);
    27. int add2(UserInfo userinfo);
    28. int add3(UserInfo userinfo);
    29. List getListByParam(String name,Integer id);
    30. int update2(UserInfo userinfo);
    31. int dels(List ids);
    32. }
    33. /**mapper里面有接口有xml文件;
    34. * */
    35. /**接口:
    36. * 接口中的方法都没有方法体都是抽象方法
    37. * **/
    38. /**单元测试:
    39. * 1.在需要进行单元测试的类中选择generate
    40. * */

    UserMapper.xml

    1. "1.0" encoding="UTF-8"?>
    2. "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. "com.example.demo1014.mapper.UserMapper">
    4. "add">
    5. insert into userinfo(id,name,age,email) values(#{id},#{name},#{age},#{email})
    6. "addGetId" useGeneratedKeys="true" keyProperty="id">
    7. insert into userinfo(id,name,age,email) values(#{id},#{name},#{age},#{email})
    8. "upUserName">
    9. update userinfo set name= #{name} where id=#{id}
    10. "delById">
    11. delete from userinfo where id = #{id}
    12. "add2">
    13. insert into userinfo(id,
    14. <if test="name!=null">
    15. name,
    16. if>
    17. age) values(#{id},
    18. <if test="name!=null">
    19. #{name},
    20. if>
    21. #{age})
    22. "add3">
    23. insert into userinfo
    24. "(" suffix=")" suffixOverrides=",">
    25. <if test="id!=null">
    26. id,
    27. if>
    28. <if test="name!=null">
    29. name,
    30. if>
    31. <if test="age!=null">
    32. age,
    33. if>
    34. <if test="email!=null">
    35. email,
    36. if>
    37. values
    38. "(" suffix=")" suffixOverrides=",">
    39. <if test="id!=null">
    40. #{id},
    41. if>
    42. <if test="name!=null">
    43. #{name},
    44. if>
    45. <if test="age!=null">
    46. #{age},
    47. if>
    48. <if test="email!=null">
    49. #{email},
    50. if>
    51. "update2">
    52. update userinfo
    53. <if test="id!=null">
    54. id=#{id},
    55. if>
    56. <if test="name!=null">
    57. name=#{name},
    58. if>
    59. where id=#{id}
    60. "dels">
    61. delete from userinfo where id in
    62. "ids" open="(" close=")" item="id" separator=",">
    63. #{id}

    service

    1. package com.example.demo1014.service;
    2. import com.example.demo1014.entity.UserInfo;
    3. import com.example.demo1014.mapper.UserMapper;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Service;
    6. @Service
    7. public class UserService {
    8. @Autowired//依赖注入
    9. private UserMapper userMapper;
    10. public UserInfo getUserById(Integer id){
    11. return userMapper.getUserById(id);
    12. }
    13. }

    controller

    1. package com.example.demo1014.controller;
    2. import com.example.demo1014.entity.UserInfo;
    3. import com.example.demo1014.service.UserService;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import org.springframework.web.bind.annotation.RestController;
    7. @RestController//=@ResponseBody+@Controller
    8. @RequestMapping("/user")
    9. public class UserController {
    10. @Autowired
    11. private UserService userservice;
    12. @RequestMapping("/getuserbyid")
    13. public UserInfo getUserById(Integer id ){
    14. if(id==null) return null;
    15. return userservice.getUserById(id);
    16. }
    17. }

    //此时就可以用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可开启事务,不污染数据库。

    1. package com.example.demo1014.mapper;
    2. /**单元测试:
    3. * 1.在需要进行单元测试的类中选择generate
    4. * */
    5. import com.example.demo1014.entity.UserInfo;
    6. import org.junit.jupiter.api.Assertions;
    7. import org.junit.jupiter.api.Test;
    8. import org.springframework.beans.factory.annotation.Autowired;
    9. import org.springframework.boot.test.context.SpringBootTest;
    10. import org.springframework.transaction.annotation.Transactional;
    11. import java.util.List;
    12. import static org.junit.jupiter.api.Assertions.*;
    13. @SpringBootTest//1. 表明当前单元测试是运行在SpringBoot中
    14. //@Transactional //Spring 将会在方法执行前开启一个事务,在方法执行结束后根据方法的执行结果进行事务的提交或回滚
    15. class UserMapperTest {
    16. @Autowired//2. 注入测试对象
    17. private UserMapper userMapper;
    18. @Test
    19. void getUserById() {
    20. //3. 添加单元测试的业务代码
    21. UserInfo userinfo=userMapper.getUserById(1);
    22. System.out.println(userinfo);
    23. /**使用断言->判断最终结果是否符合预期!?
    24. *
    25. * */
    26. Assertions.assertEquals("John",userinfo.getName());
    27. }
    28. @Test
    29. void getAll() {
    30. List list=userMapper.getAll();
    31. Assertions.assertEquals(8,list.size());
    32. }
    33. @Test
    34. void add() {
    35. UserInfo userinfo = new UserInfo();
    36. userinfo.setId(11);
    37. userinfo.setName("小龙女");
    38. userinfo.setAge(18);
    39. userinfo.setEmail("xxx@example.com");
    40. int result = userMapper.add(userinfo);
    41. assertEquals(1, result); // 验证插入是否成功
    42. // sqlSession.commit(); // 提交事务
    43. }
    44. @Test
    45. void addGetId() {//
    46. UserInfo userinfo=new UserInfo();
    47. userinfo.setId(9);
    48. userinfo.setAge(30);
    49. userinfo.setName("小龙女");
    50. userinfo.setEmail("33780908@qq.com");
    51. //调用mybatis添加方法执行添加操作
    52. int result=userMapper.addGetId(userinfo);
    53. System.out.println("添加:"+result);
    54. int uid=userinfo.getId();
    55. System.out.println("用户id:"+uid);
    56. Assertions.assertEquals(1,result);
    57. //2023-10-15 16:50:24.135 INFO 23020 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
    58. //2023-10-15 16:50:24.327 INFO 23020 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
    59. //添加:1
    60. //用户id:5
    61. }
    62. @Test
    63. void upUserName() {
    64. //构建测试数据
    65. UserInfo userinfo=new UserInfo();
    66. userinfo.setId(6);
    67. userinfo.setName("孙悟空");
    68. //受影响的行数:
    69. int result=userMapper.upUserName(userinfo);
    70. System.out.println("修改:"+result);
    71. Assertions.assertEquals(1,result);
    72. }
    73. @Test
    74. // @Transactional//加上后就不会污染我们的数据库信息;
    75. void delById() {
    76. Integer id=6;
    77. int result= userMapper.delById(id);
    78. System.out.println("删除:"+result);
    79. Assertions.assertEquals(1,result);
    80. }
    81. @Test
    82. void getListByOrder() {
    83. List list=userMapper.getListByOrder("asc");
    84. System.out.println(list);
    85. }
    86. @Test
    87. void login() {
    88. String email="1111@qq.com";
    89. // String name="mike";
    90. String name="' or 1='1";
    91. UserInfo userinfo=userMapper.login(name,email);
    92. System.out.println("用户登陆状态:"+(userinfo==null?"失败":"成功"));
    93. }
    94. @Test
    95. void add2() {
    96. UserInfo userinfo=new UserInfo();
    97. userinfo.setId(11);
    98. userinfo.setName(null);
    99. userinfo.setAge(111111);
    100. // userinfo.setEmail("222");
    101. int result=userMapper.add2(userinfo);
    102. System.out.println("result:"+result);
    103. }
    104. @Test
    105. void add3() {
    106. UserInfo userinfo=new UserInfo();
    107. userinfo.setId(13);
    108. userinfo.setName("sss");
    109. userinfo.setEmail("12432`");
    110. int result=userMapper.add3(userinfo);
    111. Assertions.assertEquals(1,result);
    112. }
    113. @Test
    114. void getListByParam() {
    115. List list=userMapper.getListByParam("John",1);//select* from userinfo WHERE name=? and id=?
    116. List list1=userMapper.getListByParam("John",null);// select* from userinfo WHERE name=?
    117. List list2=userMapper.getListByParam(null,1);//select* from userinfo WHERE id=?
    118. List list3=userMapper.getListByParam(null,null);//select* from userinfo
    119. }
    120. @Test
    121. void update2() {
    122. UserInfo userinfo=new UserInfo();
    123. userinfo.setId(2);
    124. userinfo.setName("小李子zi");
    125. userMapper.update2(userinfo);
    126. }
    127. /**在pom.xml中添加配置
    128. * # 开启mybatis sql 日志打印;
    129. * configuration:
    130. * log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    131. *
    132. * # 配置打印MyBatis执行的sql;
    133. * logging:
    134. * level:
    135. * com:
    136. * example:
    137. * demo1014: debug
    138. * 后,可进行打印日志
    139. * ==> Preparing: update userinfo set name= ? where id=?
    140. * ==> Parameters: 孙悟空(String), 4(Integer)
    141. * <== Updates: 1
    142. * **/
    143. }
    144. /** 参数占位符 #{} 和 ${} :
    145. * #{}:预编译处理;
    146. * ${}: 字符直接替换;
    147. *
    148. * Mybatis在处理#{}时,会把SQL中的#{}替换成?,使用PaeparedStatement的set方法来复制,直接替换:Mybatis在处理${},是把${}替换成变量的值;
    149. * $的应用场景:使用Java中的关键字的时候!
    150. * ${sort}可以实现排序查询,而是用#{sort}就不能实现排序查询了,因为当使用#{sort}查询的时候,如果查询的值是String,则会加单引号,就会导致sql错误;
    151. *
    152. * **/

    这个插件好用,推荐MyBatisx, 

  • 相关阅读:
    RealSenseSR300工程环境配置说明
    java使用ws.schild.jave将视频转成mp4
    【云原生与5G】微服务加持5G核心网
    Minecraft我的世界部署教程
    python带你对北京二手房进行数据分析,看看大概都什么价位
    Python 用Ursina引擎制作一个3D迷宫游戏
    bat查找文件并复制
    Java-SPI机制详解
    电力电子转战数字IC——IC笔试面试Verilog合集(持续更新)
    力扣刷题 day47:10-17
  • 原文地址:https://blog.csdn.net/m0_74106420/article/details/133887990