springboot2.1.7整合mybati3.5.2與mysql8.0.13


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肯定會有這樣那樣的問題,這些錯誤總結就是博主踩過的大坑,特別貼出來供大家參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM