目录
-配置数据源
-SpringBoot自动配置数据源
-java类手动配置数据源
-添加MyBatis相关
-注解版
-XML版
1.开发工具:
2.Spring Boot 搭建 Mybatis
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版本
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;
}
}
希望我的吭可以帮助到有需要的人