springboot2.x已經發布一段時間,博主在這里使用springboot2.1.7整合mybatis3.5.2,使用的數據庫為mysql8.0.13
1. 導入依賴
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!--mybatis-spring-boot-starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
2. 在application.properties配置數據源(此文件會被springboot自動掃描)
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=********* #mysql8以上版本使用這個 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #mybatis讀取根目錄下mapper文件夾下的所有以.xml結尾的文件 mybatis.mapper-locations=classpath:/mapper/*.xml
3. 編寫controller,service,dao,mapper.xml
AdminController:
package com.gl.pin.web.controller;
import com.gl.pin.service.api.system.entity.AdminEntity;
import com.gl.pin.service.api.system.res.DubboRes;
import com.gl.pin.service.api.system.service.AdminServiceI;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* @Auther: zjk
* @Date: 2019/9/3
* @Description:
*/
@ResponseBody
@Controller
@RequestMapping(value = "/admin")
public class AdminController {
@Autowired
AdminServiceI adminServiceI;
@PostMapping(value = "/login")
public AdminEntity login(@RequestParam(value = "userName") String userName , @RequestParam (value = "password") String password){
return adminServiceI.login(userName,password);
}
}
AdminService:(AdminServiceI 自行腦補)
package com.gl.pin.service.system.service;
import com.gl.pin.service.api.system.entity.AdminEntity;
import com.gl.pin.service.api.system.res.DubboRes;
import com.gl.pin.service.api.system.service.AdminServiceI;
import com.gl.pin.service.system.dao.AdminDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Auther: zjk
* @Date: 2019/9/4
* @Description:
*/
@Service
public class AdminService implements AdminServiceI {
@Autowired
AdminDao adminDao;
@Override
public AdminEntity login(String userName , String password) {
return adminDao.login(userName,password);
}
}
AdminDao:
package com.gl.pin.service.system.dao;
import com.gl.pin.service.api.system.entity.AdminEntity;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* @Auther: zjk
* @Date: 2019/9/4
* @Description:
*/
@Repository
@Mapper
public interface AdminDao {
/**
* 管理員登錄
* @param userName
* @param password
* @return AdminEntity
*/
AdminEntity login(String userName,String password);
}
resoures/mapper/AdminDao.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.gl.pin.service.system.dao.AdminDao"> <!--AdminEntity與數據庫中的列的映射--> <resultMap id="adminDao" type="com.gl.pin.service.api.system.entity.AdminEntity"> <id property="id" column="a_id"/> <result property="userName" column="a_userName"/> <result property="password" column="a_password"/> </resultMap> <!--admin login --> <select id="login1" parameterType="java.lang.String" resultMap="adminDao"> SELECT a_id,a_userName,a_password FROM sys_admin WHERE a_userName=#{userName} AND a_password=#{password} </select> </mapper>
4. 如何將dao裝配在spring容器中?
方法一:在dao接口類上加上注解@Mapper
@Repository
@Mapper
public interface AdminDao {
/**
* 管理員登錄
* @param userName
* @param password
* @return AdminEntity
*/
AdminEntity login(String userName,String password);
}
方法二:在springboot啟動類上加注解@MapperScan
@SpringBootApplication
@MapperScan("com.gl.pin.service.system.dao")
public class PinServiceSystemApplication {
public static void main(String[] args) {
SpringApplication.run(PinServiceSystemApplication.class, args);
}
}
5. 報錯總結
1.springboot啟動失敗---找不到接口類
錯誤詳情:
Description: Field adminDao in com.gl.pin.service.system.service.AdminService required a bean of type 'com.gl.pin.service.system.dao.AdminDao' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type 'com.gl.pin.service.system.dao.AdminDao' in your configuration.
解決方案:沒有使用@Mapper或@MapperScan,或者錯誤使用(@MapperScan掃描包的路徑不對等等)
2. springboot啟動成功,發送請求報錯---dao和mapper.xml綁定失敗,找不到對應方法
錯誤詳情:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.gl.pin.service.system.dao.AdminDao.login
解決方案:
2.1 dao接口所在包與mapper.xml映射文件中的namespace不一致
<mapper namespace="com.gl.pin.service.system.dao.AdminDao">
2.2 dao中有的方法,但mapper.xml中沒有
2.3 dao中的方法名和mapper.xml中id的不一樣
<select id="login" parameterType="java.lang.String" resultMap="adminDao">
2.4 mapper.xml文件壓根沒被解析,需要在application.properties中配置
#最好使用"/",用"."可能在多級文件情況下有問題 mybatis.mapper-locations=classpath:/mapper/*.xml
springboot整合mybatis肯定會有這樣那樣的問題,這些錯誤總結就是博主踩過的大坑,特別貼出來供大家參考。
