导入依赖
将SpringBoot和MyBatis结合的第一步就是将启动器配置到pom中,但是Spring本身并没有提供MyBatis任何相关的启动器,反倒是MyBatis为了适应Spring自己提供了一套启动器,所以启动器的版本跟SpringBoot的版本并不相同,这点要注意一下。本例中使用的MyBatis启动器版本是2.2.0。同时,由于要进行数据库操作,所以需要将数据源和JDBC相关依赖也添加到配置文件中。
<!-- 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 #实体类的路径
一个登录的例子
前面的操作只是完成了基本的配置,还有一些MyBatis的核心内容没有配置。可以通过一个登录的例子来一步步添加这些核心配置。
创建登录实体类
登录的操作就是要通过类似输入用户名密码去数据库查询有没有相关用户,并且把信息返回给客户端的过程。我们需要创建一个用来接收从数据库查询到的用户信息的数据类Admin,这个类的名字要记好,后续有用。
data class Admin(val id:Int,val name:String,val password:String)
创建Mapper接口文件
接口文件里定义一个login方法,接收客户端输入的用户名和密码作为参数,返回之前创建的Admin对象。
interface AdminMapper{
fun login(name:String,password:String):Admin
}
创建接口映射文件
在Resource目录下创建Mapper接口的映射文件AdminMapper.xml核心内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.henk.book_excerpt.mapper.AdminMapper">
<resultMap id="admin" type="com.henk.book_excerpt.domain.Admin">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
</resultMap>
<select id="login" resultMap="admin">
select * from admin where name=#{name} and password=#{password}
</select>
</mapper>
这个配置文件中主要关注几个点:
- mapper的命名空间namespace就是需要映射的接口文件的完整路径
- resultMap 的type就是之前创建的实体类的完整路径
- resultMap中的column对应的是数据库中字段名,property对应的时实体类的字段名,jdbcType要和数据库中字段类型保持一致
- select查询语句中resultMap值对应的是上边resultMap的id
- 注意sql语句的写法
创建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")
fun login(@RequestParam name:String,@RequestParam pass:String):String{
val admin=adminService.login(name,pass)
return if (admin==null){
"账号不存在"
}else{
"登录成功"
}
}
}
Postman测试
启动服务,在postman输入http://localhost:8080/login 填写name和password两个参数,发送请求。
这一小节介绍了通过xml方式整合MyBatis的过程,后续将会介绍使用注解整合的方式。