给大家讲一个关于map和bean的故事(在SpringJdbc玩map被玩死)

下面要给大家讲一个关于map和bean的故事。。。

(在spring jdbc玩map被玩死)

bean:pojo类,我习惯叫bean,有时候也叫他entity,实体类。


不要在springjdbc里玩map,这不是演习!!!
------------------------------------------------

前戏:

还记得很久以前,我在上学的时候,老师教我们什么叫数据库,什么叫SQL,怎么使用JDBC去连接数据库,然后写一坨代码:

....
02.Connection conn = null; 
03.PreparedStatement pstmt = null;
04.try {
05.conn = getConnection(); //1.获取JDBC连接 
06.String sql = "select * from tableName"; //2.声明SQL
07.pstmt = conn.prepareStatement(sql); //3.预编译SQL
08.ResultSet rs = pstmt.executeQuery(); //4.执行SQL
09.process(rs); //5.处理结果集
10.closeResultSet(rs); //5.释放结果集
11.closeStatement(pstmt); //6.释放Statement 
12.conn.commit(); //8.提交事务
13.} catch (Exception e) { 
14.//9.处理异常并回滚事务
15.conn.rollback();
16.throw e;
17.} finally {
18.//10.释放JDBC连接,防止JDBC连接不关闭造成的内存泄漏
19.closeConnection(conn);
20.}
21.....

之后,战战兢兢的去用eclipse启动服务,oh yes!

数据库里的数据神奇的出来了!!!

之后会了单表CRUD,我就敢自信满满的在简历上写着“精通jdbc”了。。。


。。。

ok,谁都有过青春,不是吗?

------------------------------------------------

时光荏苒,一晃就毕业了,进入到了工作岗位中,由于之前的JDBC连接数据库的方式实在是太繁琐了,并且很有可能一不小心漏掉了什么,就出现了bug。

并且使用JDBC后,我还得费劲巴拉的把resultSet里的东西给自己转成bean里,so?

我们用了hibernate。。。


当年斥叉风云SSH框架(struts/spring/hibernate),一时间,风起云涌,好像只要会SSH就可以找到好工作了,不会SSH就不敢跟别人打招呼。

然后hibernate并不是那么想象中的完美。


我总结出的hibernate的缺点/痛点有(也是某些公司的面试题):

1.hibernate传说中的不用写sql,是很强大,配置好了之后,你就看你的控制台上输出的sql吧,如果你的项目不care性能。(哪个项目不care性能?除非是毕设~)

2.当年的那个OneToMany,ManyToOne,OneToOne的配置的确让我痛苦了一阵子,我承认我很low。。。

3.hibernate传说中的hql和方言,亲,无论你换成什么数据库,都不用修改我们的hql哟~只要换方言就可以啦,但是哪个项目会经常换数据库呢?并且hql不支持复杂的sql写法,我觉得挺鸡肋的功能。

4.我记忆犹新的一件事,当时数据查出来了之后,到页面上就报错,结果搜索了一下,发现是什么hibernate的session已经关闭了,需要借用spring的一个什么东西才能好。

5.hibernate传说中的二级缓存,玩不好能玩死你,并且现在谁还用spring/hibernate的缓存啊?现在都是分布式/大数据的时代,全是分布式redis,memcache的年代了。

6.各种各样的复杂概念,各种复杂配置,什么延迟加载啊,session的生命周期啊,哦,我的天。

7.学习成本高


经历了一些事情之后,开始学会慢慢的长大,有那么句话叫:“经历的多了,也就成熟了。”


后来和几个同事聊了很多关于hibernate的优缺点,发现hibernate的优点我们都用不上,用上的都是痛点,

于是痛定思痛,决定摒弃hibernate,寻找新的持久层框架。


------------------------------------------------

之后接触了spring jdbc,mybatis,spring data jpa等框架。

当时就想一直用一个持久层框架,配合各种自己写的半自动化代码生成工具以及baseDao,可以节省大量工作量,时间就是金钱,我的朋友。

这些框架各有千秋,选来选去,忽然间发现spring jdbc的namedParameterJdbcTemplate里无论是入参,还是返回值,都可以玩Map,我当时头脑一热,这下好啦:

1.首先spring jdbc是spring的亲儿子,应该不会出什么兼容性问题的幺蛾子。

2.Map非常灵活呀,想放什么就放什么,想拿什么就拿什么,都是Object嘛。

3.最重要的一点是,可以完全摒弃了bean,之前表一多,各种bean满天飞的时代一去不复返啦,现在只要Map,Map在手,天下我有。


经过短暂的头发发热之后,开始风风火火的封baseDao,写自动生成工具,然后风风火火的接项目(自己创业期间),开始干!

做了几个小项目,发现,恩~map还真真儿的不错呢,好方便呀,我封好的baseDao里基本上涵盖了所有dao里80%的代码,项目组里的小盆友们甚至不用写dao,但是痛点也来了,service层上耦合了大量dao的东西,非常乱,因为当时是小项目,痛点没有凸现出来,直到。。。。。。。


直到做了所谓的中型项目后,一旦人一多,表一多,逻辑一多,玩多模块多项目开发的时候,各种依赖的时候。。。

oh no。。。


------------------------------------------------

前戏结束,步入正题,下面列出map和bean的优缺点:

map的优点:

1.灵活,通用,相当于是一个大泛型,也可以转成bean。

2.大幅提高开发速度(开发层面)

3.数据库频繁变动的前提下,几乎很少的去修改代码。

4.节省了bean的维护工作,项目中几乎找不到bean了。

5.和spring一脉相承,不需要额外的配置来转化bean,以及额外的bug,(这里说的是spring jdbc)


map的缺点:

1.不直观,开发人员不清楚map里有什么字段,每个字段具体是什么数据类型,前提是知道表结构。

2.使用表单validation框架时,需要创建表单bean

3.每次取值的时候都要手写字段名称,有时需要强制类型转换,如果用bean就没有这个痛点了。

4.难维护

5.项目大了以后,玩分模块,玩微服务,痛点更明显

6.项目大了之后,在不同的地方调用db返回的数据,自己都不知道应该查哪个字段

7.一旦字段更改后,如果有地方想不到,那就会造成隐藏bug,如果用bean的话,直接eclipse就会报错,减少bug几率。

8.put/get数据的时候频率是很高的,Map的话,get还需要写字段,每次put和get的时候都要编写大量代码,以及类型转换。

9.数据库一变更之后,大面积的map.put/get 都不报错,自己也不知道该改哪里,不该改哪里。一启动服务后全是错,但是用bean,直接就会出红叉,知道该改哪里。

------------------------------------------------
bean的优点:

1.直观,开发人员清楚的知道bean里有什么字段,什么类型。
2.使用表单validation框架时,可以直接使用已生成的bean
3.新人上手快
4.易维护

bean的缺点:

1.多表联查的时候还需要自己创建bean(看你的sql复杂不复杂,也可以考虑建大bean来解决)
2.开发效率不是很高(在频繁修改数据库的情况下,会带来额外的代码修改工作量)。

------------------------------------------------

尾声:

之前在我用Map开始干的时候,也询问过一些朋友,大家总体的反应是小项目用map玩玩可以,但是大项目就要用bean。

现在想想。。。拉倒吧,小项目也别用map了,好习惯早养成。

我当时没在乎,我就是想试试到底有多痛。。。

结果真的很痛。。。


后来痛的要死的时候,发现其实spring jdbc是原生支持玩bean的,结果花了2天一股脑又封了一个基于bean的baseDao,现在项目里是既有bean,又有map。

慢慢来吧,少年。


好啦,这就是我要给你们讲的map和bean的故事。


------------------------------------------------
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值