SpringBoot + 纯注解MyBatis
原生MyBatis,不包含通用Mapper等插件
参考:https://www.cnblogs.com/linjiqin/p/9686981.html
这篇博客的目的:
MyBatis在平常使用时,个人都是用的通用Mapper插件,分不清哪些是原生的MyBatis提供的功能,哪些是插件提供的功能。这里基于原生的MyBatis写一个基于注解的最小实现。
通过下面实现,可以看到原生MyBatis与通用Mapper的区别。
- 原生MyBatis只需要配置三个地方:POJO包扫描、Mapper包扫描、Mapper成员方法的SQL。
- 原生MyBatis不需要:Mapper不需要继承或实现其他类、POJO对象不需要加任何注解。
- 通用Mapper插件,在MyBatis基础实现ORM框架,所以需要操作POJO对象,实现POJO对象和数据表结构的映射,也就能自动生成SQL语句了。为了自动生成SQL语句,通用Mapper需要自定义Mapper继承Mapper类。
MyBatis在SpringMVC框架上只干了一件事:简化DAO的写法,让SQL直接绑定到DAO上。MyBatis不是一个ORM框架,只是一个SQL映射框架;MyBatis的作用只是方便写SQL,而不能根据数据库自动生成SQL;MyBatis始终没有和数据库表结构发生关联,数据库表结构是程序员手动写SQL体现的。
https://www.zhihu.com/question/39454008?sort=created
一 项目结构、数据库结构
1.1 项目结构
一个配置文件application.yml、一个启动类Application、一个Controller、一个Service、一个Mapper、一个POJO类
1.2 数据库结构
在这里插入代码片
二 maven依赖、项目配置、启动程序
1.1 pom.xml
三个依赖:springboot启动器、mybatis启动器、mysql连接器
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
1.2 application.yml
三个配置:端口号、数据源、mybatis(只需要配置pojo包路径)
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/newdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123456
mybatis:
type-aliases-package: com.javapractice.leyou.pojo
1.3 Application.java
一个注解:@MapperScan,mapper包路径
@SpringBootApplication
@MapperScan("com.javapractice.leyou.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
三 controller、service、mapper、pojo
2.1 controller
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/findUser")
public ResponseEntity<User> findUserByName(String name){
User user = userService.findUserByName(name);
return ResponseEntity.ok(user);
}
}
2.2 service
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User findUserByName(String name){
return userMapper.findUserByName(name);
}
}
2.3 mapper
由于启动类配置了包扫描,这里不需要配置@Repository或者@Mapper
public interface UserMapper {
@Select("Select * From user where username=#{name}")
public User findUserByName(String name);
}
2.4 pojo
MyBatis通过Set方法将查询结果封装到POJO对象,如果缺少Set方法,无法封装
public class User implements Serializable {
private Long id;
private String username;
private String score;
// get、set方法
}
四 结果
五 补充
也可能不配置Mapper包扫描,这样每个Mapper都要加@Mapper注解