前言
应该有一个月没发博客了。。。从10月8号到15号一直都忙着在找工作,去了二维火、大搜车、阿里等公司面试,结果还是被虐的体无完肤;最后只能去宗盛只能科技(娃哈哈旗下的一个做自动贩卖机和无人超市的公司),虽然这和我来杭州找工作的之前的预期有很大的差别,但是又能怪谁呢?现实告诉我这一年虽然吃了不少资源,但是都没有吃的那么透彻。就像阿里的面试官所说:不要搞一些花里胡哨的框架,框架是跟随着市场需求变化产生的,而支撑框架的就是java基础、源代码,学了那么多框架不如掌握底层源码和原理有用。
从15号入职宗盛到现在,一直都在忙着熟悉公司的东西,也上了不少课。从现在开始,每一周都要记录工作中遇到的有意义的问题,你们可以当做是一个节目,也可以看做是学习成长周记,也可以叫做 码周记!!!
简介
- 使用spring自带的定时任务schedule时候的lazy懒加载问题
- 如果mysql设置了主键自增之后,mybatis插入对象之后如何获得主键id
- mybatis自带的一些标签
- 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有其他函数能处理这个需求,但是我觉得我这应该是最简单粗暴的!