springboot整合mybatis的通用mapper、整合Junit、测试事务Transactional

在这里插入图片描述
偶尔需要在pojo定义id等、不需要在mapper接口写方法的,只需要在service直接使用tk帮我们弄好的方法就行

一、步骤(不用junit测试):

1.pom.xml

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>

    </parent>
    <groupId>cn.itcast</groupId>
    <artifactId>Spingboot_day1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.9</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--java配置配置数据库要的-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--Spring Boot的属性注入需要的-->
        <dependency>
            <groupId> org.springframework.boot </groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <!--不传递依赖-->
            <optional>true</optional>
        </dependency>

        <!--lombok需要的-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--事务和连接池需要的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

        <!--mybatis需要的-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>


        <!--mybatis通用mapper需要的-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>
    </dependencies>
</project>

2. 编写UserMapper:

(得继承 extends Mapper)

package com.itheima.mapper;

import com.itheima.pojo.User;
import tk.mybatis.mapper.common.Mapper;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/21 22:39
 */
public interface UserMapper extends Mapper<User>{
    
    
}

3.把启动类上的@MapperScan注解修改为通用mapper中自带的:

易错点:
在这里插入图片描述

package com.itheima;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/19 14:27
 */


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

/**
 * spring boot工程都有一个启动引导类,这是工程的入口类
 * 并在引导类上添加@SpringBootApplication
 */
@SpringBootApplication
//扫描mybatis所有的业务mapper接口
//@MapperScan("com.itheima.mapper") //这是是通用mapper之前的spring版本

//通用mapper得用tk的
@MapperScan("com.itheima.mapper")
public class Application {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Application.class,args);
    }
}

4.在User实体类上加JPA注解

在这里插入图片描述

package com.itheima.pojo;

import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/21 17:30
 */
//在编译阶段会根据注解自动生成对应的方法;data包含get/set/hashCode/equals/toString等方法
@Data
//tb_user是我数据库里面的一张表
@Table(name = "tb_user")
public class User {
    
    
    //设置主键id
    @Id
    //开启主键自动回填(增加用户时会把用户id返回给你)
    @KeySql(useGeneratedKeys = true)
    private Long id;


    private String user_name;
    private String password;
    private String name;
    private Integer age;
    private Integer sex;
    private Date birthday;
    private String note;
    private Date created;
    private Date updated;

}

5.对 UserService 的代码进行简单改造:

package com.itheima.service;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/21 22:01
 */
@Service
public class UserService {
    
    

    //得注入mapper接口,好操作点,在service注入dao层的意思
    @Autowired
    private UserMapper userMapper;

    public User queryById(Long id){
    
    
        //根据id查询,selectByPrimaryKey是mapper没有的方法,是tk自动创的,原因在的pojo声明了@id
        return userMapper.selectByPrimaryKey(id);
    }

    //Transactional如果你其中一个error会自动回滚的
    @Transactional
    public void saveUser(User user){
    
    
        System.out.println("新增用户");
        //选择性新增;如果属性为空则该属性不会出现在insert语句上
        userMapper.insertSelective(user);
    }
}

6.测试将 HelloController 进行简单改造:

package com.itheima.controller;

import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.sql.DataSource;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/19 15:33
 */

@RestController
public class HelloController {
    
    

    @Autowired
    private DataSource dataSource;

    //注入service
    @Autowired
    private UserService userService; //在controller注入service

    //多个yml测试
    @Value("${itcast.url}")   //是写yml里面的根.xx
    private String itcastUrl;
    @Value("${itheima.url}")  //是写yml里面的根.xx
    private String itHeimaUrl;

    @GetMapping("hello1")
    public String hello(){
    
    
        System.out.println("yml的abc文件test:"+itcastUrl);
        System.out.println("yml的def文件test:"+itHeimaUrl);
        System.out.println("dataSource="+dataSource);
        return "hello spring boot4!!!";
    }


    /***
     * 根据id获取用户
     * * @param id 用户id
     * * @return 用户 */
    @GetMapping("/user/{id}")
    public User queryById(@PathVariable Long id){
    
    
        return userService.queryById(id);
    }
}

其他代码跟上一篇一样在这里插入图片描述

然后浏览器输入:
http://localhost:81/user/8(因为我在application设置的端口为81):在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
test成功!

二、用Junit测试

基于上面的代码进行测试在这里插入图片描述

在这里插入图片描述
1.pom.xml:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>

    </parent>
    <groupId>cn.itcast</groupId>
    <artifactId>Spingboot_day1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.9</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--java配置配置数据库要的-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--Spring Boot的属性注入需要的-->
        <dependency>
            <groupId> org.springframework.boot </groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <!--不传递依赖-->
            <optional>true</optional>
        </dependency>

        <!--lombok需要的-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--事务和连接池需要的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

        <!--mybatis需要的-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>


        <!--mybatis通用mapper需要的-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

        <!--Junit需要的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

</project>

2.在测试包下编写测试类
在测试类上面必须要添加 @SpringBootTest 注解和加
@RunWith(SpringRunner.class)

先打开UserService在类名上按Crlt+shift+t:
在这里插入图片描述
在这里插入图片描述
然后idea会自动在test包生成对应的测试类:
在这里插入图片描述

package com.itheima.service;

import com.itheima.pojo.User;
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 org.junit.Test;

import java.util.Date;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/22 14:12
 */

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
    
    

    //注入Service进行测试
    @Autowired
    private UserService userService;

    @Test
    public void queryById() {
    
    
        //9L代表是9的Long型
        User user=userService.queryById(9L);
        System.out.println("user:"+user);
    }

    @Test
    public void saveUser() {
    
    
        User user = new User();
        user.setUser_name("test1");
        user.setName("test1");
        user.setPassword("123");
        user.setSex(1);
        user.setAge(20);
        user.setCreated(new Date());
        userService.saveUser(user);
    }
}

点上面的测试类小绿点就行:
运行成功在这里插入图片描述
保存用户数据:
在这里插入图片描述数据库也生成了:
在这里插入图片描述

也成功!下面改下service的save方法演示一下事务(故意写错):

package com.itheima.service;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/21 22:01
 */
@Service
public class UserService {
    
    

    //得注入mapper接口,好操作点,在service注入dao层的意思
    @Autowired
    private UserMapper userMapper;

    public User queryById(Long id){
    
    
        //根据id查询,selectByPrimaryKey是mapper没有的方法,是tk自动创的,原因在的pojo声明了@id
        return userMapper.selectByPrimaryKey(id);
    }

    //Transactional如果你下面方法任何一个地方有错都会自动回滚事务,不会提交到数据库的
    @Transactional
    public void saveUser(User user){
    
    
        System.out.println("新增用户");
        //选择性新增;如果属性为空则该属性不会出现在insert语句上
        userMapper.insertSelective(user);
        //故意出错,junit测试用的
        int i=1/0;
    }
}

然后再运行在这里插入图片描述控制台报错,事务不会提交数据库,测试事务成功!!!
(@Transactional如果你下面方法任何一个地方有错都会自动回滚事务,不会提交到数据库的

猜你喜欢

转载自blog.csdn.net/GLOAL_COOK/article/details/113933703