偶尔需要在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如果你下面方法任何一个地方有错都会自动回滚事务,不会提交到数据库的
)