前文介绍了如何通过xml接口映射文件的方式为SpringBoot项目配置MyBatis,今天这篇文章继续介绍另外一种方式:使用注解实现。这两种方式前面的步骤差不多,区别就在于注解方式不需要接口配置文件。看一下具体步骤
导入依赖
本例中使用的MyBatis启动器版本是2.2.0。同时,由于要进行数据库操作,所以需要将数据源和JDBC相关依赖也添加到配置文件中。
pom.xml
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
创建数据库
在Mysql数据库中创建数据库book,然后在book中创建一张admin表。
表中预先插入一条数据,name=admin,password=123456
配置application.properties
SpringBoot进行数据库操作时需要对数据源和JDBC进行配置,用来连接数据源。如果使用MyBatis,除了常规配置之外需要加入MyBatis配置。
spring.datasource.name=springboot-login-datasource
spring.datasource.url=jdbc:mysql://localhost:3306/book?useUnicode=true&serverTimezone=GMT&characterEncoding=utf8&autoReconnect=true&useSSL=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root123
#mybatis
#mybatis.mapper-locations=classpath:mapper/*.xml #mapper映射文件的路径,注解版本已经不需要这个配置
myBatis.type-aliases-package=com.henk.book_excerpt.domain #实体类的路径
依然是一个登录的例子
这部分我们沿用之前SpringBoot整合MyBatis(xml版)里边的登录例子,创建登录实体类和Mapper接口,不同的是不需要创建对应的Mapper接口映射文件了,取而代之的是在Mapper接口中添加SQL注解。
登录实体类
data class Admin(val id:Int,val name:String,val password:String)
Mapper接口文件
由于使用了注解来替代与接口对应的映射文件,没有了映射文件,但是映射文件所承担的工作必然要由其他的组件来完成,这项工作现在转移到了接口文件中。来看一下注解版和xml版在接口文件上有什么不同
使用注解之前:
interface AdminMapper{
fun login(name:String,password:String):Admin
}
使用注解之后:
interface AdminMapper{
@Select("SELECT * FROM admin WHERE name=#{name} AND password=#{password}")
fun login(name:String,password:String):Admin
}
可以看到,使用注解之后,原来只需要定义方法的Mapper文件承担了原来映射文件的工作,所有的数据库操作都迁移到了Mapper文件中,并且多了一些Select之类的操作数据库的注解,关于这些注解会在后文介绍,我们先完成这个示例。
创建Service层
在Service层里添加一些访问Mapper接口的数据库方法,这一层也可以省去,直接在后边的Controller层操作接口文件。 AdminService.kt
interface AdminService {
fun login(name:String,password:String):Admin?
}
AdminImpl.kt
@Service
class AdminImpl :AdminService{
@Resource
lateinit var adminMapper:AdminMapper
override fun login(name: String, password: String): Admin? {
return adminMapper.login(name, password)
}
}
创建LoginController
Controller层中可以使用创建测Service层作为中间层来操作Mapper接口,也可以直接操作Mapper接口。这里选的是才用中间层的方式,这样分层更加清晰一些。
@RestController
class LoginController {
@Resource
lateinit var adminService: AdminService
@PostMapping("/login")
//这里和xml版不一样的地方就是方法中的参数名字必须和数据库中的名字保持一致,不然会报400
fun login(@RequestParam name:String,@RequestParam password:String):Admin?{
val admin=adminService.login(name,password)
return if (admin==null){
null
}else{
admin
}
}
}
Postman测试
启动服务,在postman输入http://localhost:8080/login 填写name和password两个参数,发送请求。