这是学习spring boot 的第二周,公司号称这玩意是啥都不会的新手就可以填空开发,于是决定上手一把,怎么说我也是搞了快七八年的.NET和.NETcore,没想到无情打脸,快被这个能填空开的IDE搞疯了,下面是记下一些自己踩坑开发中遇到的一系列无穷无尽的问题。

一 .集成MyBatis

a)首先如何理解这个  MyBatis 的东西,我的理解是 :MyBatis 有点类似ORM的感觉,跟 JPA很类似,就是一个orm,需要一个类似 dbcontext的东西,这个东西,在MyBatis 里面叫做 sqlSessionFactoryBean,好了知道这个,我们就不需要像百度上面一样,搞各种各样的配置,不知道所云的东西全都搞在工程里面。我的是这样配置的package com.example.demo.configimport org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
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.mybatis.spring.boot.autoconfigure.*;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer; import javax.sql.DataSource; @Configuration
@EnableTransactionManagement
public class MyBatisConfig {
@Autowired
private DataSource dataSource;
  @Value("${mybatis.mapper-locations}")
  private String MAPPER_LOCATION;
  //当容器里没有指定的Bean的情况下创建该对象 @Bean(name = "SqlSessionFactoryBean") @ConditionalOnMissingBean 
  public SqlSessionFactoryBean sqlSessionFactoryBean() { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); // 设置数据源
sqlSessionFactoryBean.setDataSource(dataSource);
//设置 mapper.xml的路径 (非常重要,这里踩坑两天)
       sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(MAPPER_LOCATION));
return sqlSessionFactoryBean; } 

  

,去执行他内置的一些鬼CURD操作,对,他只需要这一个方法就可以了,设置数据源,然后你的 MyBatis  就可以认为有了 我们常说的 dbcontext了。

有了这个数据库上下文的  sqlSessionFactoryBean,我们需要一些  CRUD的方法,方法在哪里呢,在那什么  mapper.xml文件里面的。

b). 配置  这些方法的路径,什么,路径,对是路径,我没有写过 之前的spring mvc的,但是了解到这些 Mapper.xml 其它就是对应的一个个之前配置的Bean节点下的 方法,只是换了个马甲而已吧。

package com.example.demo.config;

import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
@AutoConfigureAfter(MapperScannerConfig.class) //保证在MyBatisConfig实例化之后再实例化该类
public class MapperScannerConfig {
// mapper接口的扫描器
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.example.demo");
return mapperScannerConfigurer;
}
}

mapperScannerConfigurer.setBasePackage("com.example.demo");  注意这句,是说我配置了我的数据库上下文之后,我要扫我这个上下文里面 有哪些方法,我要从哪个基包开始扫描找到这些方法,传说是递归去找的。这里你查看你的mapper接口的包名是什么,可以直接设置成上一层去,就可以扫描到的。

@AutoConfigureAfter(MapperScannerConfig.class) //保证在MyBatisConfig实例化之后再实例化该类

c)设置mapper.xml的路径  也就是你的  mapper接口写好了,得有一个对应的 mapper.xml对应,这样才知道 你这个接口具体是执行了什么操作,对,就是这样,杀人放火的动作,都是写在XML文件里面的,当然,写这个XML文件,个人觉得,没有什么比用这各方法写CRUD操作更坑爹的了,没有。配置  application.yaml  里面:

# mybatis_config
mybatis:
mapper-locations: classpath:mapperXml/**/*.xml
具体路径以自己项目做适当调整。 注意:坑来了,这个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.example.demo.permission.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.example.demo.permission.model.User">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="nickname" property="nickname" jdbcType="VARCHAR"/>
<result column="email" property="email" jdbcType="VARCHAR"/>
<result column="pswd" property="pswd" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="last_login_time" property="lastLoginTime" jdbcType="TIMESTAMP"/>
<result column="status" property="status" jdbcType="TINYINT"/>
</resultMap>
<sql id="Base_Column_List">
id, nickname, email, pswd, create_time, last_login_time, status
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" resultType="com.example.demo.permission.model.User" parameterType="java.lang.Integer">
select
<include refid="Base_Column_List"/>
from sys_user
where id = #{id,jdbcType=INTEGER}
</select>
</mapper>
(1).mapper.xml 文件的namespace要与 mapper接口的包名相同
(2).UserMapper 的方法在UserMapper.xml中没有,然后执行 userService 的方法会报错
(3).UserMapper 的方法返回值是List<User>,而select元素没有正确配置ResultMap,或者只配置ResultType! 这个第三个非常隐敝,我在这里折腾了三天,就是少了一个ResultType
二  整合Druid
这玩意 取了一个 德鲁伊 的名字,估计是阿里哪位大神喜欢玩游戏吧,哈哈。好了,这个东西主要是就是一个db连接池的作用。
所以我们只需要把一系列连接数据库的参数配置上去就Ok了
1) DruidConfig
package com.example.demo.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.slf4j.*;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.*; import javax.sql.DataSource;
import java.sql.SQLException; @Configuration()
public class DruidConfig {
private Logger logger = LoggerFactory.getLogger(getClass()); @Value("${spring.datasource.url}")
private String dbUrl; @Value("${spring.datasource.username}")
private String username; @Value("${spring.datasource.password}")
private String password; @Value("${spring.datasource.driver-class-name}")
private String driverClassName; @Value("${spring.datasource.filters}")
private String filters; @Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
filterRegistrationBean.addInitParameter("profileEnable", "true");
filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");
filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");
return filterRegistrationBean;
} @Bean
@Primary
public DataSource druidDataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
logger.error("druid configuration initialization filter", e);
}
return datasource;
} @Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings("/druid/*");
reg.addInitParameter("loginUsername", "druid");
reg.addInitParameter("loginPassword", "druid");
return reg;
} }
其实只需要配置一个 : druidDataSource 这个就可以了。
FilterRegistrationBean  与 ServletRegistrationBean 主要是为了试一试  Druid的监控介面而已,不要的话,完全没有问题的。

2)配置文件
#datasource
spring:
datasource:
name: testdb
url: jdbc:mysql://localhost:3306/spring_boot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
#initalSize: 5
filters: stat
applictaion.yaml文件里面把这些提供一下,OK,鸟德配置成功。 三 配置文件的读到,各种坑,慢慢踩
暂且说有两种配置文件吧,
第一种,application.yaml 这个,注意,springboot中 @Configraperporties 标记的 配置节点,读到的都是application.yaml或得application.properties 里面的值的。
第二种,自定义的配置文件,注意,虽然 springboot 号称能读取.YAML文件,但是,只限 application.yaml 这一个,自定义的文件,只能用 .properties的文件做后缀才能读的到。
      @PropertySource(value = {"classpath:config/globalconfig.properties"}) 是不能读取 .yaml文件

Spring Boot 开发系列一 开发踩坑的更多相关文章

  1. Spring boot配置MongoDB以及Morphia踩坑记录

    pom 因为项目中采用Morphia(MongoDB的ODM框架,对象-文档映射(object-document mapper)),因此需要在pom文件中引入相应依赖: <dependency& ...

  2. Spring Boot干货系列:(五)开发Web应用JSP篇

    Spring Boot干货系列:(五)开发Web应用JSP篇 原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂 前言 上一篇介绍了Spring Boot中使用Thymeleaf模板引擎,今天 ...

  3. (转)Spring Boot干货系列:(四)开发Web应用之Thymeleaf篇

    转:http://tengj.top/2017/03/13/springboot4/ 前言 Web开发是我们平时开发中至关重要的,这里就来介绍一下Spring Boot对Web开发的支持. 正文 Sp ...

  4. Spring Boot入门(四):开发Web Api接口常用注解总结

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...

  5. Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

      (转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题   这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...

  6. 程序员DD 《Spring boot教程系列》补充

    最近在跟着程序员DD的Spring boot教程系列学习Spring boot,由于年代原因,Spring boot已经发生了一些变化,所以在这里进行一些补充. 补充的知识大多来自评论区,百度,Sta ...

  7. 【转】Spring Boot干货系列:(一)优雅的入门篇

    转自Spring Boot干货系列:(一)优雅的入门篇 前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社区中热度一直很高,所以决定花时间来了解和学习,为自己做 ...

  8. 【转】Spring Boot干货系列:(二)配置文件解析

    转自:Spring Boot干货系列:(二)配置文件解析 前言 上一篇介绍了Spring Boot的入门,知道了Spring Boot使用"习惯优于配置"(项目中存在大量的配置,此 ...

  9. 【转】Spring Boot干货系列:(三)启动原理解析

    前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开Sprin ...

  10. Spring Boot干货系列:(七)默认日志框架配置

    Spring Boot干货系列:(七)默认日志框架配置 原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候, ...

随机推荐

  1. 粗看ES6之变量

    标签: javascript var定义变量面临的问题 可以重复定义 无法限制变量不可修改 无块级作用域 ES6变量定义升级 新增let定义变量 新增const定义常量 let特性 有块级作用域 不可 ...

  2. JSP对象和JavaBean

    1. JSP 客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的,如下图所示: Http请求头对应的内容如下: 对应方 ...

  3. logback的加载过程

    使用logback-classic.jar时,启动应用后,logback按照以下顺序进行扫描: 1.在系统配置文件System Properties中寻找是否有logback.configuratio ...

  4. android-上下文菜单的创建 - 随心

    //Menu设置//覆盖两个方法onCreateOptionsMenu(Menu menu).onOptionsItemSelected(MenuItem Item)//onCreateOptions ...

  5. PHP函数:method_exists和function_exists

    method_exists 检查类的方法是否存在 bool method_exists ( mixed $object , string $method_name ) 检查类的方法是否存在于指定的ob ...

  6. VS找到了XXX的副本,但是当前源代码与XXX中内置的版本不同

    1.博客园有解决ASP.Net出现以上问题的方法: 删除ASP.Net临时文件夹内的dll文件. https://www.cnblogs.com/autumn/p/5261576.html 2.但我的 ...

  7. mybatis-关联关系

    在实现实列中我们在学生表里面增加了一个地址表用于与学生表的一对一 1.创建地址实体类: package com.java1234.mappers; import com.java1234.model. ...

  8. 比特币中P2SH(pay-to-script-hash)多重签名的锁定脚本和解锁脚本

    P2SH(pay-to-script-hash)多重签名的脚本 P2SH是多重签名的一种应用形式.在P2SH的交易中,多了一个Redeem Script的概念,称为赎回脚本.当向P2SH脚本的地址转账 ...

  9. mysqlimport命令

    mysqlimport的大多数选项直接对应LOAD DATA INFILE子句. 选项: -u,--user 指定连接用户名.   -p,--password[name] 指定连接用户的密码.   - ...

  10. MYSQL短索引

    优化MYSQL时,可以尽量使用短索引,如果只是为了提高读取的速度,可以优先使用聚合索引,把几个字段聚集在一起,当然缺点在于操作(写)的时候会降低效率,短索引一般都是开头几个字符基本不同的时候,可以考虑 ...