这是学习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;

  1. import org.mybatis.spring.SqlSessionFactoryBean;
  2. import org.mybatis.spring.SqlSessionTemplate;
  3. import org.mybatis.spring.annotation.MapperScan;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.core.io.Resource;
  9. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  10. import org.springframework.core.io.support.ResourcePatternResolver;
  11. import org.mybatis.spring.boot.autoconfigure.*;
  12. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  13. import org.springframework.transaction.PlatformTransactionManager;
  14. import org.springframework.transaction.annotation.EnableTransactionManagement;
  15. import org.springframework.transaction.annotation.TransactionManagementConfigurer;
  16. import javax.sql.DataSource;
  17. @Configuration
  18. @EnableTransactionManagement
  19. public class MyBatisConfig {
  20. @Autowired
  21. private DataSource dataSource;
  1.   @Value("${mybatis.mapper-locations}")
      private String MAPPER_LOCATION;
  1.   //当容器里没有指定的Bean的情况下创建该对象 @Bean(name = "SqlSessionFactoryBean") @ConditionalOnMissingBean
      public SqlSessionFactoryBean sqlSessionFactoryBean() { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); // 设置数据源
  2. sqlSessionFactoryBean.setDataSource(dataSource);
    //设置 mapper.xml的路径 (非常重要,这里踩坑两天)
  1. sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
    .getResources(MAPPER_LOCATION));
  1. return sqlSessionFactoryBean; }

  

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

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

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

  1. package com.example.demo.config;
  2.  
  3. import org.mybatis.spring.mapper.MapperScannerConfigurer;
  4. import org.springframework.boot.autoconfigure.AutoConfigureAfter;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7.  
  8. @Configuration
  9. @AutoConfigureAfter(MapperScannerConfig.class) //保证在MyBatisConfig实例化之后再实例化该类
  10. public class MapperScannerConfig {
  11. // mapper接口的扫描器
  12. @Bean
  13. public MapperScannerConfigurer mapperScannerConfigurer() {
  14. MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
  15. mapperScannerConfigurer.setBasePackage("com.example.demo");
  16. return mapperScannerConfigurer;
  17. }
  18. }

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

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

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

  1. # mybatis_config
    mybatis:
    mapper-locations: classpath:mapperXml/**/*.xml
    具体路径以自己项目做适当调整。
  2.  
  3. 注意:坑来了,这个XML的坑很严重,有时候会折腾到你想死的心都有了,但是还是死不甘心。
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.example.demo.permission.mapper.UserMapper">
  4. <resultMap id="BaseResultMap" type="com.example.demo.permission.model.User">
  5. <id column="id" property="id" jdbcType="INTEGER"/>
  6. <result column="nickname" property="nickname" jdbcType="VARCHAR"/>
  7. <result column="email" property="email" jdbcType="VARCHAR"/>
  8. <result column="pswd" property="pswd" jdbcType="VARCHAR"/>
  9. <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
  10. <result column="last_login_time" property="lastLoginTime" jdbcType="TIMESTAMP"/>
  11. <result column="status" property="status" jdbcType="TINYINT"/>
  12. </resultMap>
  13. <sql id="Base_Column_List">
  14. id, nickname, email, pswd, create_time, last_login_time, status
  15. </sql>
  16. <select id="selectByPrimaryKey" resultMap="BaseResultMap" resultType="com.example.demo.permission.model.User" parameterType="java.lang.Integer">
  17. select
  18. <include refid="Base_Column_List"/>
  19. from sys_user
  20. where id = #{id,jdbcType=INTEGER}
  21. </select>
  22. </mapper>
  1. (1).mapper.xml 文件的namespace要与 mapper接口的包名相同
  1. (2).UserMapper 的方法在UserMapper.xml中没有,然后执行 userService 的方法会报错
  1. (3).UserMapper 的方法返回值是List<User>,而select元素没有正确配置ResultMap,或者只配置ResultType! 这个第三个非常隐敝,我在这里折腾了三天,就是少了一个ResultType
  1. 整合Druid
    这玩意 取了一个 德鲁伊 的名字,估计是阿里哪位大神喜欢玩游戏吧,哈哈。好了,这个东西主要是就是一个db连接池的作用。
    所以我们只需要把一系列连接数据库的参数配置上去就Ok
    1 DruidConfig
  1. package com.example.demo.config;
  2.  
  3. import com.alibaba.druid.pool.DruidDataSource;
  4. import com.alibaba.druid.support.http.StatViewServlet;
  5. import com.alibaba.druid.support.http.WebStatFilter;
  6. import org.slf4j.*;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  10. import org.springframework.boot.web.servlet.ServletRegistrationBean;
  11. import org.springframework.context.annotation.Bean;
  12. import org.springframework.context.annotation.Configuration;
  13. import org.springframework.context.annotation.Primary;
  14. import com.alibaba.druid.*;
  15.  
  16. import javax.sql.DataSource;
  17. import java.sql.SQLException;
  18.  
  19. @Configuration()
  20. public class DruidConfig {
  21. private Logger logger = LoggerFactory.getLogger(getClass());
  22.  
  23. @Value("${spring.datasource.url}")
  24. private String dbUrl;
  25.  
  26. @Value("${spring.datasource.username}")
  27. private String username;
  28.  
  29. @Value("${spring.datasource.password}")
  30. private String password;
  31.  
  32. @Value("${spring.datasource.driver-class-name}")
  33. private String driverClassName;
  34.  
  35. @Value("${spring.datasource.filters}")
  36. private String filters;
  37.  
  38. @Bean
  39. public FilterRegistrationBean filterRegistrationBean() {
  40. FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
  41. filterRegistrationBean.setFilter(new WebStatFilter());
  42. filterRegistrationBean.addUrlPatterns("/*");
  43. filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
  44. filterRegistrationBean.addInitParameter("profileEnable", "true");
  45. filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");
  46. filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");
  47. return filterRegistrationBean;
  48. }
  49.  
  50. @Bean
  51. @Primary
  52. public DataSource druidDataSource() {
  53. DruidDataSource datasource = new DruidDataSource();
  54. datasource.setUrl(this.dbUrl);
  55. datasource.setUsername(username);
  56. datasource.setPassword(password);
  57. datasource.setDriverClassName(driverClassName);
  58. try {
  59. datasource.setFilters(filters);
  60. } catch (SQLException e) {
  61. logger.error("druid configuration initialization filter", e);
  62. }
  63. return datasource;
  64. }
  65.  
  66. @Bean
  67. public ServletRegistrationBean druidServlet() {
  68. ServletRegistrationBean reg = new ServletRegistrationBean();
  69. reg.setServlet(new StatViewServlet());
  70. reg.addUrlMappings("/druid/*");
  71. reg.addInitParameter("loginUsername", "druid");
  72. reg.addInitParameter("loginPassword", "druid");
  73. return reg;
  74. }
  75.  
  76. }
  1. 其实只需要配置一个 druidDataSource 这个就可以了。
  1. FilterRegistrationBean ServletRegistrationBean 主要是为了试一试 Druid的监控介面而已,不要的话,完全没有问题的。
  2.  
  3. 2)配置文件
  1. #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,鸟德配置成功。
  2.  
  3. 配置文件的读到,各种坑,慢慢踩
    暂且说有两种配置文件吧,
    第一种,application.yaml 这个,注意,springboot @Configraperporties 标记的 配置节点,读到的都是application.yaml或得application.properties 里面的值的。
    第二种,自定义的配置文件,注意,虽然 springboot 号称能读取.YAML文件,但是,只限 application.yaml 这一个,自定义的文件,只能用 .properties的文件做后缀才能读的到。
  1.       @PropertySource(value = {"classpath:config/globalconfig.properties"}) 是不能读取 .yaml文件
  2.  
  1.  

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. http请求各种数据的接受

    一.接受请求的http数据 1.接受客户请求的数据,例如xml数据格式,代码如下: 此代码相当于服务端 public String analyzeWeixinXMLStr(HttpServletReq ...

  2. mybatis-映射器的CRUD

    设计步骤:model.mapper.dao.service.junit单元测试.log4j日志 项目和之前的一样在此只是创建了test和修改了mapper 1.修改映射 1.1修改接口 package ...

  3. C# 字符串转组件名、变量名

    字符串转组件名 (Controls["button1"] as Button).Text = "Hello";//单独组件 (Controls[].Contro ...

  4. vue+node+mongodb实现的页面

    源代码地址:https://github.com/GainLoss/vue-node-mongodb 目前这个项目实现的是: 1.利用vue-cli实现前台页面的编写 (1)页面的跳转利用的是vue- ...

  5. HDU5269 字典树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5269 ,BestCoder Round #44的B题,关于字典树的应用. 比赛的时候没想出做法,现在补 ...

  6. java 串口通信实现流程

    1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 ...

  7. CSS样式中visited,hover,active , focus这四个分别表示什么意思?

    CSS伪类用于向某些选择器添加特殊的效果.CSS又名层叠样式表,所谓层叠,就是后面的样式会覆盖前面的样式,所以在样式表中,各样式排列的顺序很有讲究. :link 与 :visited 在样式文件中的顺 ...

  8. json字符串转换成对象需要注意的问题

    json转换成对象的时候应该尽量避免出现特殊的符号,如“\”这样的字符在转义成数组的时候会被去除掉,最好的例子就是后台返回的内容为存储路径的JSON,这时候最好是把一个斜杠变为两个斜杠,如: [{&q ...

  9. javascript中Array常用方法

    一.基本概念 1.什么是数组 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 2.关于js中的数组特点 数组定义时无需指定数据类型 数组定义时可 ...

  10. NOIP2018初赛 解题报告

    前言 \(NOIP2018\)初赛已经结束了,接下来就要准备复赛了. 不过,在此之前,还是先为初赛写一篇解题报告吧. 单项选择题 送分题.(虽然我还是做错了)可以考虑将它们全部转化为\(10\)进制, ...