SpringBoot - IDEA搭建Spring Boot整合mybatis(XMl与注解版)详解入门 - XMl扫描不到的吭

目录html

-配置数据源java

    -SpringBoot自动配置数据源
mysql

    -java类手动配置数据源
web

-添加MyBatis相关spring

    -注解版
sql

    -XML版
数据库


1.开发工具:apache


2.Spring Boot 搭建 Mybatis api

      点击查看详细的搭建步骤:session

3.个人目录


方式1.SpringBoot自动配置数据源(属性文件配置一下就能够了)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;

//@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})//禁用系统自动启用自动配置的额数据源 - 由于咱们要本身定义数据源 因此要禁用
@SpringBootApplication
@EnableScheduling
//@ComponentScan
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		System.out.println("启动成功");
	}
}

application-dev.properties配置以下

# 数据库访问配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://xxxx.com/wallet_supper?useUnicode=true&characterEncoding=utf8&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=xxxxx
# 下面为链接池的补充设置,应用到上面全部数据源中
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置获取链接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测须要关闭的空闲链接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个链接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 配置监控统计拦截的filters,去掉后监控界面sql没法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
spring.datasource.logSlowSql=true

SpringBoot的核心思惟预约优于配置的思惟

自动配置内部已经约定了spring.datasource.xxx 只要咱们配置赋值就能够了


方式2.JavaConfig方式配置数据源(更灵活)

1.启动类

package com.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})//禁用系统自动启用自动配置的额数据源 - 由于咱们要本身定义数据源 因此要禁用
@EnableScheduling
public class DemoApplication {
	public static void main(String[] args) {

		SpringApplication.run(DemoApplication.class, args);
		System.out.println("启动成功");
	}
}

PS:细心的朋友应该看到这么一句话 

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})//禁用系统自动启用自动配置的额数据源 - 由于咱们要本身定义数据源 因此要禁用

2.Spring配置 Druid管理数据源

server.port=8080
# 数据库访问配置
spring.datasource.db.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.db.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db.url=jdbc:mysql://localhost:3306/wallet_supper?useUnicode=true&characterEncoding=utf8&autoReconnect=true
spring.datasource.db.username=linpeng
spring.datasource.db.password=a123456
# 下面为链接池的补充设置,应用到上面全部数据源中
spring.datasource.db.initialSize=5
spring.datasource.db.minIdle=5
spring.datasource.db.maxActive=20
# 配置获取链接等待超时的时间
spring.datasource.db.maxWait=60000
# 配置间隔多久才进行一次检测,检测须要关闭的空闲链接,单位是毫秒
spring.datasource.db.timeBetweenEvictionRunsMillis=60000
# 配置一个链接在池中最小生存的时间,单位是毫秒
spring.datasource.db.minEvictableIdleTimeMillis=300000
spring.datasource.db.validationQuery=SELECT 1 FROM DUAL
spring.datasource.db.testWhileIdle=true
spring.datasource.db.testOnBorrow=false
spring.datasource.db.testOnReturn=false
# 配置监控统计拦截的filters,去掉后监控界面sql没法统计,'wall'用于防火墙
spring.datasource.db.filters=stat,wall,log4j
spring.datasource.db.logSlowSql=true

咱们本身定义 spring.datasource.db.XXX

spring.datasource.db.type=com.alibaba.druid.pool.DruidDataSource 
指定数据源 DruidDataSource 以下

有了上面的配置并不能完美启动注入,咱们须要写一个数据源的配置类来启动  

关键做用 

    @Configuration

   @ConfigurationProperties(prefix="spring.datasource.db"//获取properties文件中的前缀属性字段


package com.demo.dataSource;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;


@Configuration
@ConfigurationProperties(prefix="spring.datasource.db") //获取properties文件中的前缀属性字段
public class ApplicationConfig {

    private String url;
    private String username;
    private String password;

    @Bean
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(username);// 用户名
        dataSource.setPassword(password);// 密码
        return dataSource;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

关键代码Druid数据源数据配置

@Bean 会把这个 return的dataSource数据源对象告诉Spring 去读取使用
@Bean
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(username);// 用户名
        dataSource.setPassword(password);// 密码
        return dataSource;
    }

也可使用其余的数据源

DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(username);// 用户名
        dataSource.setPassword(password);// 密码
        return dataSource;
DataSource是一个数据源抽象类 详细能够查看 

点击:spring配置datasource三种方式 数据库链接池


3.mybatis 数据源相关准备  注解版 @Select

Model+Mapper  Model就简单的实体类就不贴代码了 Mapper以下

package com.demo.mybatis.mapper;
import com.demo.mybatis.model.RepayBbsdkNotify;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.*;
import java.util.List;

@Mapper
public interface RepayBbsdkNotifyMapper {

    @Select({"SELECT * from repay_bbsdk_notify limit 0,5"})
    List<RepayBbsdkNotify> selectAll();


}

@Mapper 注解 别写错了 (容易写成Mapping)告诉Spring来管理这个bean  若是该类没有加@Mapper 注解的话 须要在启动类Application类上面加载扫描   @MapperScan("com.jiuzhm.memo.mybatis") 不然会报错扫描不到com.jiuzhm.memo.mybatis.mapper.AcctInfoMapper

3.mybatis xml版本





不一样的数据源 须要添加Maven Alt+Enter会提示

Controller测试

package com.demo.api.Controller;

import com.demo.mybatis.mapper.RepayBbsdkNotifyMapper;
import com.demo.mybatis.model.RepayBbsdkNotify;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

@RestController
public class LoginController {
    @Resource
    RepayBbsdkNotifyMapper repayBbsdkNotifyMapper;

    @RequestMapping("/hello")
    public String hello(){
        return "hello world";
    }

    @RequestMapping("/test")
    public List<RepayBbsdkNotify> test(){
        List data = repayBbsdkNotifyMapper.selectAll();
        for (int i = 0;i< data.size(); i++){
            RepayBbsdkNotify model = (RepayBbsdkNotify) data.get(i);
            System.out.println("===="+model.getCardNo());
        }
        return data;
    }
}

结果



注意:

1.若是启动类DemoApplacation不在根目录的话 会扫描不到Mapper或者Controller


========================20180517更新================

前提:若是使用mybatis的时候只用mybatis的注解方式写sql的话没什么问题,可是若是你有用到 sql放xml里面 与dao分开的话就会遇到.....


1.Idea mybatis的xml不在resource里面的时候不会被扫描 致使错误 idea的坑!!!

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

解决方案一

由于xml被认定为是一种资源文件 idea默认是不会去java包里面扫描资源文件的 要放在resource文件下面他们才会扫描的到 Eclipse就不会存在这个问题 在idea项目的里面有个target 你翻开目录 也是看不到xml文件的 

步骤一:resource下面建立一个mybatis的文件夹专门放mybatis生成的xml文件  彷佛官方也建议把mybatis的xml放资源下(我的不是很喜欢这样)


步骤二:pom.xml里面添加<resources>...

<resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
                <filtering>false</filtering>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>

步骤三:properties配置扫描路径(路路劲不要写错了 这是一个大坑)

# MyBatis 配置 若是mapper.xml在resource的mybatis文件下面就这么配置
#mybatis.mapper-locations=classpath:mybatis/*.xml
#mybatis.type-aliases-package=com.jiuzhm.mybatis.entity

解决方案二

不少人不喜欢把xml放到resource下面去喜欢放在java上面 跟实体类 dao等放在一个文件目录下面 因此就要修改配置扫描文件

步骤一:pom.xml里面添加<resources>... 如上

步骤二:配置文件修改扫描路径

mybatis.mapper-locations=classpath*:com/jiuzhm/memo/mybatis/**/*.xml
mybatis.type-aliases-package=com.jiuzhm.memo.mybatis.entity
mybatis.config-location=classpath:mybatis-config.xml

路径必定要对!不对的话就会各类问题很难解决!看一下个人文件目录 若是不能解决多半是配置路径有问题 必定要仔细检查



解决方案三 

若是以上配置还有问题  就本身配置数据源 javaConfig方式配置 (上面我有讲到)手动配置SqlSeccionFactoryBean 设置扫描xml路径 

简单了解读了mybatis的中文文档才知道mybatis最主要的配置就是1.配置数据源 2.配置xml扫描路径  核心是SqlSeccionFactory这个对象 mybatis经过SqlSeccionFactory 获得SqlSeccion,SqlSeccion经过命名空间查询sql的id映射出数据(底层如何实现我也不是很懂) 

Spring和mybatis整合以后 衍生出了一个SqlSeccionFactoryBean 取代SqlSeccionFactory的工做  javaConfig以下

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;
@Configuration
@ConfigurationProperties(prefix="spring.datasource.db") //获取properties文件中的前缀属性字段
public class ApplicationConfig {
    private String url;
    private String username;
    private String password;
    @Bean
    public DataSource dataSourceBean() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(username);// 用户名
        dataSource.setPassword(password);// 密码
        return dataSource;
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean() {
        SqlSessionFactoryBean sqlFactory = new SqlSessionFactoryBean();
        SqlSessionFactory
        try {
            sqlFactory.setDataSource(dataSourceBean());
            //设置mybatis的主配置文件  记住是主配置文件啊
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            Resource mybatisXml = resolver.getResource("classpath:mybatis-config.xml");
            sqlFactory.setConfigLocation(mybatisXml);
            //设置mapper.xml文件的路径
            Resource [] resource = resolver.getResources("classpath*:com/jiuzhm/memo/mybatis/**/*.xml");//{resourceMapXML};
            sqlFactory.setMapperLocations(resource);
            //扫描实体类所在包
            sqlFactory.setTypeAliasesPackage("com.jiuzhm.memo.mybatis.entity");
        } catch (Exception e) {
            //e.printStackTrace();
        }
        return sqlFactory;
    }
    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
但愿个人吭能够帮助到有须要的人