当前位置 : 首页 » 文章分类 :  开发  »  SpringBoot整合MyBatis

SpringBoot整合MyBatis

Spring Boot 中使用MyBatis笔记


Invalid bound statement (not found)

一开始以为是没有配 maven 的 <build> <resources> <resource>,导致mapper.xml没有打包进去,从而找不到xml,后来仔细检查发现.xml在包中,但还是提示这个错误。
https://blog.csdn.net/hello_world_qwp/article/details/79030823
https://blog.csdn.net/k469785635/article/details/77532512

后来发现是application.properties中没有配置 mybatis.mapperLocations 属性

mybatis.mapperLocations=classpath:mapper/*.xml

mybatis.mapperLocations 属性

当mybatis的xml文件和mapper接口不在相同包下时,需要用mapperLocations属性指定xml文件的路径。*是个通配符,代表所有的文件,**代表所有目录下

如果Mapper.xml与Mapper.class在同一个包下且同名,spring扫描Mapper.class的同时会自动扫描同名的Mapper.xml并装配到Mapper.class。
如果Mapper.xml与Mapper.class不在同一个包下或者不同名,就必须使用配置mapperLocations指定mapper.xml的位置。
此时spring是通过识别mapper.xml中的 <mapper namespace="com.fan.mapper.UserDao"> namespace的值来确定对应的Mapper.class的。

官方文档:
如果 MyBatis 映射器 XML 文件在和映射器类相同的路径下不存在,那么另外一个需要 配置文件的原因就是它了。使用这个配置,有两种选择。第一是手动在 MyBatis 的 XML 配 置文件中使用<mappers>部分来指定类路径。第二是使用工厂 bean 的 mapperLocations 属 性。
mapperLocations 属性使用一个资源位置的 list。 这个属性可以用来指定 MyBatis 的 XML 映射器文件的位置。 它的值可以包含 Ant 样式来加载一个目录中所有文件, 或者从基路径下 递归搜索所有路径。比如:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />
</bean>

这会从类路径下加载在 sample.config.mappers 包和它的子包中所有的 MyBatis 映射器 XML 文件。

Springboot mybatis集成 Invalid bound statement (not found)
https://blog.csdn.net/qq_35981283/article/details/78590090

SqlSessionFactoryBean
http://www.mybatis.org/spring/zh/factorybean.html


使用Spring默认单数据源

在IDEA中创建Spring Initializr项目

添加pom依赖

1、引入整合MyBatis的核心依赖mybatis-spring-boot-starter
2、引入连接mysql的必要依赖mysql-connector-java
3、引入spring-boot-starter-test用来做单元测试验证数据访问

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.winterchen</groupId>
    <artifactId>springboot-mybatis-demo2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springboot-mybatis-demo2</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

配置数据源

Spring Boot 默认配置文件为application.properties,在其中添加数据源配置:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

或者根据个人喜好改用更简洁的yml配置文件application.yml

spring:
  datasource:
     url: jdbc:mysql://127.0.0.1:3306/mytest
     username: root
     password: 123456
     driver-class-name: com.mysql.jdbc.Driver

spring boot自带的DataSourceAutoConfiguration会自动读取application.properties文件的spring.datasource.*属性并自动配置单数据源。
spring boot自动创建的默认数据源是tomcat jdbc connection pool,并将数据源自动注入到sqlSessionFactory中,sqlSessionFactory会自动注入到Mapper中,一切都不用管,直接拿起来使用就行了。


创建mysql数据表

创建数据库mytest,切换到mytest,并创建表t_user
sql语句如下:

CREATE DATABASE mytest;

USE mytest;

CREATE TABLE t_user(
  id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL ,
  password VARCHAR(255) NOT NULL ,
  phone VARCHAR(255) NOT NULL
) ENGINE=INNODB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;

创建实体User

/**
 * User实体映射类
 * Created by Administrator on 2017/11/24.
 */

public class User {
    private Integer id;
    private String name;
    private String password;
    private String phone;
    //省略 get 和 set ...
}

创建Mapper

import com.xxx.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

/**
 * User映射类
 * Created by Administrator on 2017/11/24.
 */
@Mapper
public interface UserMapper {

    @Select("SELECT * FROM T_USER WHERE PHONE = #{phone}")
    User findUserByPhone(@Param("phone") String phone);

    @Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(#{name}, #{password}, #{phone})")
    int insert(@Param("name") String name, @Param("password") String password, @Param("phone") String phone);

}

可以在Mapper类上面添加注解@Mapper来使Spring将其自动扫描为bean,但每个Mapper类都要加比较麻烦,或者在启动类中添加@MapperScan实现对所有Mapper类的自动扫描。


SpringBoot启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootMybatisDemo2Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisDemo2Application.class, args);
    }
}

单元测试

import com.xxx.User;
import com.xxx.UserMapper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMybatisDemo2ApplicationTests {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void test(){
        userMapper.insert("winterchen", "123456", "12345678910");
        User u = userMapper.findUserByPhone("12345678910");
        Assert.assertEquals("winterchen", u.getName());
    }
}

Spring boot Mybatis 整合(注解版)
https://blog.csdn.net/Winter_chen001/article/details/78622141

Spring boot Mybatis 整合(完整版)
https://blog.csdn.net/winter_chen001/article/details/77249029

spring boot(六):如何优雅的使用mybatis(更详细)
https://www.cnblogs.com/ityouknow/p/6037431.html

Spring Boot整合MyBatis(《Spring Cloud微服务实战》作者翟永超)
http://blog.didispace.com/springbootmybatis/


多数据源

不同mapper使用不同的SqlSessionFactory,对应不同的数据源

Spring Boot + Mybatis多数据源和动态数据源配置
https://blog.csdn.net/neosmith/article/details/61202084


动态数据源

禁用SpringBoot数据源自动配置

首先要将spring boot自带的DataSourceAutoConfiguration禁掉,因为它会读取application.properties文件的spring.datasource.*属性并自动配置单数据源。在@SpringBootApplication注解中添加exclude属性即可:

@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class
})
public class SpringInitializrApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringInitializrApplication.class, args);
    }
}

SpringBoot多数据源及MyBatis配置详解
https://my.oschina.net/angerbaby/blog/715281

SpringBoot 自定义+动态切换数据源
https://blog.csdn.net/DuShiWoDeCuo/article/details/78189043

Spring中AOP方式实现多数据源切换

Spring中AOP方式实现多数据源切换
https://www.jianshu.com/p/ddebf4ae57c1


上一篇 SpringBoot-@Scheduled定时任务

下一篇 Java-Jar包

阅读
1,539
阅读预计7分钟
创建日期 2018-06-26
修改日期 2018-06-27
类别
百度推荐