码周记(第一期)

版权声明:我想应该是对的,不对的地方,希望读者能指出来! https://blog.csdn.net/tuesdayma/article/details/83687226

提示:可能对很多人来说码周记中的内容比较菜,不喜勿喷!!!

前言

应该有一个月没发博客了。。。从10月8号到15号一直都忙着在找工作,去了二维火、大搜车、阿里等公司面试,结果还是被虐的体无完肤;最后只能去宗盛只能科技(娃哈哈旗下的一个做自动贩卖机和无人超市的公司),虽然这和我来杭州找工作的之前的预期有很大的差别,但是又能怪谁呢?现实告诉我这一年虽然吃了不少资源,但是都没有吃的那么透彻。就像阿里的面试官所说:不要搞一些花里胡哨的框架,框架是跟随着市场需求变化产生的,而支撑框架的就是java基础、源代码,学了那么多框架不如掌握底层源码和原理有用。
从15号入职宗盛到现在,一直都在忙着熟悉公司的东西,也上了不少课。从现在开始,每一周都要记录工作中遇到的有意义的问题,你们可以当做是一个节目,也可以看做是学习成长周记,也可以叫做 码周记!!!

简介

  1. 使用spring自带的定时任务schedule时候的lazy懒加载问题
  2. 如果mysql设置了主键自增之后,mybatis插入对象之后如何获得主键id
  3. mybatis自带的一些标签
  4. mysql按状态排序

一、使用spring自带的定时任务schedule时候的懒加载问题

在boot+quartz开发中,定时任务显得很简单,但是为了一个小小的需求把quartz搬进来显然没有使用spring自带的定时任务合理,因为我们并不需要频繁的配置定时任务触发的机制。但是原本以为很简单的一个操作,最后却做的很难受!
大家都知道spring配置有两种,一种就是写在xml里面,一种就是注解的形式,那么这两种在实现schedule的时候有什么区别呢?

共同点: 让spring支持定时任务

  <task:annotation-driven />

xml形式: 意思就是将mySchedule扔进spring容器中,然后根据cron规则定时执行dotest这个方法

<bean id="mySchedule"   class="XXX.XXX.XX.mySchedule"/>
  <task:scheduled-tasks>
        <task:scheduled ref="mySchedule" method="dotest" cron="0/5 * * * * ?"/>
  </task:scheduled-tasks>

注解形式:

1、在mySchedule上面加上@Component注解。

2、在需要被定时执行的方法上加上 @Scheduled(cron = "0 0 * * * ? ")表达式

结果: 很神奇的事,我最开始用的就是注解形式,但是用注解配置的定时任务竟然不起作用,网上查了半天不知道什么原因,然后我用xml的形式,竟然可以,这两种方法明显原理是一模一样的,我后来想起来一个问题:懒加载问题!

思考: 但是之前一直都记得spring中懒加载默认值是false啊,也就是说spring默认是不进行懒加载的,于是我在类上写了一个@Lazy(value = true)结果发现true是暗色的
,而改为false之后就变成亮色了,用过idea的小伙伴一改都知道,只有默认值才是暗色的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜想: 可能在xml中配置的bean懒加载默认是false,而使用注解形式的bean懒加载默认是ture。。。

二、如果mysql设置了主键自增之后,mybatis插入对象之后如何获得主键id

培训出来之后,一般都是用的uuid最为主键的,也就是说对象入库之前我就知道主键id了,但是现在主键设置了自增的形式,也就是入库之前我是不知道对象的id的,那么入库之后我们将找不到这条记录了,那怎么办呢???mybatis帮我们提供了一种方法:

  <insert id="insertA" parameterType="XXX.XXX.XX.Abean">
        <selectKey resultType="java.lang.Integer" order="AFTER"  keyProperty="id">
            SELECT LAST_INSERT_ID()
        </selectKey>
    insert   into  tablename  (.....) values(....)
  </insert>

resultType: selectKey里面的resultType是指Abean中id属性的类型,是String、int还是integer类型

SELECT LAST_INSERT_ID(): 查询这张表中的最后一个id

order: 设置为AFTER表示在执行insert之后再执行查询最后一个id这个操作

keyProperty: 表示查询出最后一个id之后赋值给Abean的那个属性

三、mybatis自带的一些标签

来到这个公司之后发现了mybatis还有这些写法:

trim标签+if标签插入数据:

insert into  table_a  
     <trim prefix="(" suffix=")" suffixOverrides="," >
          <if test="column1!= null" >
          column1,
          </if>
          <if test="column2!= null" >
            column2,
          </if>
   </trim>
   <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="column1!= null" >
          column1,
          </if>
          <if test="column2!= null" >
            column2,
          </if>
   </trim>

prefix:这个大家应该都知道,前缀

suffix:这个大家也应该都知道,后缀

suffixoverrides:表示删除最后一个,如果是“,”,那就是删除当前trim标签下sql的最后一个“,”

prefixoverride:和suffixoverrides对应,表示删除第一个符号

set标签+if标签updata数据:

 <update id="updateCbean" parameterType="XXX.XXX.XX.Cbean" >
    update table_c
    <set >
      <if test="column1!= null" >
        column1= #{column1,jdbcType=BIGINT},
      </if>
      <if test="column2!= null" >
        column2= #{column2,jdbcType=TINYINT},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>

set的作用就是,就算只匹配上第一个,那么第一个后面的那个“,”,set会帮我们自动删除!

include标签+sql标签:

我们平时查询的时候,会发现很多查询字段都是重复的,如果要改的话,会要改很多地方,那么是不是应该可以有一种方法,将查询的字段抽取出来,然后统一维护,查询的时候去引用就行了呢,这就是:include标签+sql标签

  <sql id="selsect_a" >
    column1,column2,column3,column4.......
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select 
    <include refid="selsect_a" />
    from table_d
    where id = #{id,jdbcType=BIGINT}
  </select>

四、mysql按状态排序

有这么一个需求:一个保修的状态有5中,待接单(1)、待处理(2)、转工厂(3)、完结(4)、取消(5),现在要求取消的保修永远排在最后,其他状态的保修按创建时间排序!我想来想去,想到一个比较偷鸡的方法:

select  column1,column2,column3  from   table_g    order by
( case a.repair_status when 5 then 5 else 1 end) ,
 create_time

可能mysql有其他函数能处理这个需求,但是我觉得我这应该是最简单粗暴的!

猜你喜欢

转载自blog.csdn.net/tuesdayma/article/details/83687226