来自大佬指点代码问题

最近有一个业务场景要求在项目启动的时候自动去读取某张表的数据获得要创建表的表名和字段自动去创建表,于是我就写了一个filter,运行的挺好的,但是大佬每周要检查一次我的代码,大佬偶然看见我这个类所以立马给我谈了以下问题。当然大佬就是大佬,大佬表示代码没有问题都是一些小问题,反正我工作不久但是我是发现了越有本事的人人家越低调,肚子里有东西但是嘴很严。就和克五爷和白兰地用的杯子一样讲究的是膛大口小,感觉跳槽是正确的工作轻松了不少,钱还多,还有大佬给指点,最重要的是在北京能在下午6点钟准时到健身房锻炼。唉不扯这么多了直接进入正题。
首先

类名不贴切

因为我这个拦截器作用是检索数据库中是否存在指定的表,不存在则创建对应表所以我起的名字是这样的:
TableExistFilter.java,大佬表示这个类不是很贴切,类名一定要见名知意。

函数名问题

因为之前有个函数名是我在别的filter里面copy过来的因为甲方催的比较紧所以当时把函数名copy过来的没有改变

mapper类实例化问题

因为有两个类是是我用上下文直接实例化的但是这个filter本身注解包含了@Component,所以其实这两个mapper可以用自动装配注解
就是这个filter的注解本身如下
在这里插入图片描述
可以看到上面有一个注解

@StartedFilterComponent(order = 5)

我们可以点进去这个注释看一下:
可以看到这个是大佬自定义的注解,上面已经加入了Component注解
在这里插入图片描述
我当时实例化的代码如下:

//todo 以下俩mapper可以直接@Autowired注入
        QuestionInfoMapper questionInfoMapper = applicationContext.getBean(QuestionInfoMapper.class);
        DynamicMapper dynamicMapper = applicationContext.getBean(DynamicMapper.class);

其实是可以自动装配的,这里大佬表示已经这么写了就先不用改了

查询问题

业务已经说了是要求在项目启动的时候自动去读取某张表的数据获得要创建表的表名和字段自动去创建表,当然要检查这张表是否存在,所以我就调用了ORACLE的sql语句

String sql = "SELECT count(*) count FROM all_tables WHERE OWNER = 'QUESTIONNAIRE' AND TABLE_NAME =" + "'" + questionInfo.getTableName() + "'";

这个sql是检查指定的表是否存在数据库中
大佬表示这里其实只有一个结果所以我没有必要用

 List<Map> mapList = dynamicMapper.dynamicSelect(sql);

应该改成

 Map map = dynamicMapper.dynamicSelectOne(sql);

数据比对问题

用上面的sql语句oracle中传回来的是一个Map类型其中包裹着String和BigDecimal类型,所以最好用数值做判断

字符串拼接问题

因为我们的表是动态创建的,所以我们并没有一个实体类去对应相应的表,所以我是通过字符串拼接的方式去拼接对应的sql语句而后去执行相应的sql语句,因为我考虑到StringBuffer是线程安全的但是大佬表示我这个代码是写在拦截器里面项目启动的时候回去执行而且我是在执行代码的时候new出来的,所以不存在线程安全问题所以建议用StringBuilder
在这里插入图片描述
说实话其实这些问题我也不知道有多少人和我一样只有在面试的时候才去关注,平时因为工作繁忙我们都是以开发业务为主,当然了大佬除外,不过我感觉大佬应该不会看我的博客吧。所以我感觉我或者说有很多初级开发人员还是和我一样只注意了任务的结果,不过这样是不行的就像我所钟爱的力量举一样,有些人只顾着盲目训练我今天做了几组几次多少kg,但是我们往往忽视了最基础的东西,昨天晚上我所关注的一个力量举博主发表了一个视频,他说总有人问他为什么成绩提不上去,其实我们都忽视了最基础的问题,那就是平衡,我们都知道一个训练准则就是在训练的时候眼睛盯着一个点这样身体就不会乱晃了这个对于热衷于力量举训练的人群来说应该是最基础的,但是真正的训练中又有几个人能做到呢?就相当于我们的语言知识基础,我们每个人,你业务写的再多基础都不牢固根本没有进步可言。

数据库字段问题

数据库中的字段有一个完成状态
这个字段是定长的,我用的是varchar2(50)

sf.append("COMPLETION_STATUS varchar2(50),");

大佬表示像这种只有0和1不到50的长度关于这种已经有长度类型的。这里就没有必要用varchar2(50)了,像这种指定长度的直接用定长类型的char(1)

//todo 只有0 和1 用不到50的长度,直接直接用定长char(1)类型
sf.append("COMPLETION_STATUS varchar2(50),");
//todo 已经确定了只表示 0 1 number最好指定精度 比如number(1)
sf.append("TYPE NUMBER,");

关闭连接问题

我这个try catch并没有关闭连接,所以这里一定要加一个finally来关流

try {
      Class.forName(driverName);
      Connection conn = DriverManager.getConnection(url, userName, password);
      Statement stmt = conn.createStatement();
      stmt.executeUpdate(finalSql);
      System.out.println("Create Success!");
      stmt.close();
      conn.close();
    }
      //todo 异常吃掉了
      catch (java.lang.ClassNotFoundException e) {
            System.err.print(e.getMessage());
      } catch (SQLException ex) {
        System.out.println("\n***SQLException caught ***\n");
  }

我修改后的代码如下

try {
                    Class.forName(driverName);
                    conn = DriverManager.getConnection(url, userName, password);
                    stmt = conn.createStatement();
                    stmt.executeUpdate(finalSql);
                    System.out.println("Create Success!");
                }catch (Exception e){
                    throw new BaseException("数据库或者类名不存在",e);
                }finally {
                    try {
                        stmt.close();
                        conn.close();
                    } catch (SQLException e) {
                        throw new BaseException("关流失败",e);
                    }
                }

获取数据库连接问题

上面的代码获取数据库连接用的是原生的jdbc,大佬表示这样是不受连接池管理的,如果没有关流是比较危险的,建议我用SqlSessionFactory(因为这个项目比较简单只有一个数据源)
具体代码如下:

@Autowired
SqlSessionFactory sqlSessionFactory;

SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.getConnection();

总结

以上就是大佬给我提的全部问题,大佬表示每周要检查一次我写的代码,自己用的框架都是大佬写的,所以对于这个事情还是很积极,最起码自己可以每周有进步。如果平时健力也有个大佬能指导我一下就行了,唉还是得靠自己多积累

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值