一、温馨提醒

1)接下来的内容,请抱着看戏的态度阅览

2)如果内容给您带来不适,请尽快关闭

二、情景还原

1)两周前,让我接手一个新项目

2)还没开始熟悉项目,需要让我两周内完成

3)项目流程与需求想结合,搞了两天,知道是怎么个情况

4)对比现在实现与需求调整,想吐的感觉油然而生

5)代码跟*一样,根本改不了。不带犹豫卷土重来,从0开始

6)跟*一样的代码,大概情况是这么个样子
                1、MyBatis注解,Mapper都是注解,根本不想看

        2、重复代码,copy又copy,有业务区别,直接加个if处理

        3、一个方法恨不得1千行代码,根本不想读

        4、丝毫没有注释,功能全靠猜

        5、你见过把整个Service层做为Dubbo提供的Service层吗?不需要暴露的方法,全部给注册到ZK,根本没有消费者,项目启动慢如老狗

        6、抱歉抱歉,没有控制好情绪,吐槽,留痕一下

三、作业实施

1)需求分析,数据表操作

        1、把要调整数据表先整理出来

        2、确定表结构不需要改动

        3、部分表字段,必填改为选填,需要调整的业务梳理出来

2)需求概况与流程分析

        1、因属于内部业务,具体流程就不表述了

3)代码结构设计

        1、抽象流程,搞一搞

        2、设计模式,用一用(策略模式)

        3、枚举定义,加一加

        4、方法定义,走一走

        5、交互流程,定一定

        6、公共业务处理,用父类

        7、公共非业务处理,用工具类

        8、通用魔法值,Constants
               9、专用魔法值,private static

4)作业顺序

        1、从Biz向上下作业

        2、向上,Controller,然后View

        3、向下,Service,然后DAO

        4、向上向下,优先向下

四、MyBatis-Plus,看见MyBatis低版本,就不要奢望了

1)怎么定义MyBatis版本,以哪一版本为参考呢?

2)1.1.1以下的,就不要想了

3)MyBatis-Plus依赖MybatisSqlSessionFactoryBean(使用原生的SqlSessionFactoryBean的,也放弃吧,别乱搞;不是不可以搞,是代价有点高,我是吃不消)

五、生产事故

1)将SqlSessionFactoryBean,改成了MybatisSqlSessionFactoryBean

2)新增MyBatis,Mapper-xml方式(此时注解与xml方式并存,这个可以搞一下)

3)将MyBatis强行升级(1.1.1到MyBaits-Plus依赖的最低版本,应该是3.2.0,这个没确定)

4)导致结果

        1、我的功能,么得问题

        2、其他的部分功能模块,GG思密达

        3、绩效被扣,认认认~~不过害的领导也被扣,有点儿过意不去

六、事故处理

1)还原最初的代码

2)MyBatis-Plus,拜了个拜

3)业务调整,用MyBaits把DAO层的方法加了一加(之前用的MyBatis-Plus的嘛)

4)测试一波,晚上看时间发版

七、建议一波

1)责任心可以有,看代价

2)不要怕出错,这次事故,学到了很多

八、出道题(非Java专业,请忽略)

1)代码A

@Bean(name = "sqlSessionFactory")
@Primary
public SqlSessionFactory setSqlSessionFactory(@Qualifier("baseDataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
//分页插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("dialect", "mysql");
pageHelper.setProperties(properties);
sessionFactory.setPlugins(new Interceptor[]{pageHelper});
refreshWithXml(sessionFactory);
return sessionFactory.getObject();
}

2)代码B

@Bean(name = "sqlSessionFactory")
@Primary
public SqlSessionFactory setSqlSessionFactory(@Qualifier("baseDataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = initSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
//分页插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("dialect", "mysql");
pageHelper.setProperties(properties);
sessionFactory.setPlugins(new Interceptor[]{pageHelper});
refreshWithXml(sessionFactory);
return sessionFactory.getObject();
}

@Bean
public SqlSessionFactoryBean initSqlSessionFactoryBean() {
return new SqlSessionFactoryBean();
}

3)问:代码A与代码B有什么区别?

4)答案先给出

        1、代码B,MyBatis分页无效

        2、原因,@Bean注解,Bean注册到Spring,仅注册一次(默认单例);代码B,SqlSessionFactoryBean在initSqlSessionFactoryBean()方法中,Bean已经创建,后续再赋值属性,并不会再次加载