java编程中的问题及解决问题

1 ibatis中是否定义可重用的列名?例<sql id="COLUMN_LIST">id, age, name</sql>

原因:如果定义这个,可以使得编写的sql可重用,但是多人开发可能 会使得修改会产生新的问题,如果某个人添加了一些字段在COLUMN_LIST中,那么之前写的sql语句就会发生错误,所以这里涉及到开发人员对可重用的理解与重用部分修改的考虑。

答:可以定义,但名称应该更加明确,<sql id="INSERT_COLUMN_LIST">,<sql id="SELECT_COLUMN_LIST">...,

而且开发者之间需要达成共识:对于该部分的修改,需要考虑其它现有部分的功能,如果实在无法重用,重新建立列名集合,不以修改为扩展,以添加为扩展


2 表结构对应实体的维护,项目中经常定义了一个表结构对应的实体,但随着项目的进展,需要新的实体对象,大多数的时候我们都是在原有实体中添加字段来达到我们的要求,这样引发了一个问题:一个实体不再只表示一种含义,它跟多个部分进行耦合,这样导致代码很难理解,而且对于实体的含义很难有确切的定义。但如果不这么做,我们需要对用到的属性进行再次封装,这样使得实体越来越多,有些实体之间的属性相差不大,导致属性冗余,有没有一种好的解决方案来解决实体的可重用问题?(暂时没有找到解决方案


3 DAO层是否需要接口,在很多项目中,我们都没有那么复杂的业务,DAO层往往我们只写一个实现就可以实现功能,但按照接口编程的思想,我们需要面向接口编程,这种情况下,我们是否需要面向接口编程?

答:如果项目的功能很单一,不会涉及迁移数据库等其它多DAO的实现,那么按照项目的开发进度,可以不写DAO层接口。但是,如果你是一个目光长远的人,你就应该面向接口编程,但面临新需求时,可以适应扩展,而不是修改原有代码,导致一些不可预见的bug。


4 数据库表中是否需要设置外键关系?在项目中,很多时候都没有对表与表之间设置外键关系,而是通过查询的时候进行关联查询就好了,是一种软关联,是否需要设置物理上的外键关联?

答:大多数时候需要设置物理上的外键关联,因为这样可以限制数据库的数据的完整性,有些不设置外键关系的考虑是:减少DBMS对外键关系数据的校验;具有更加灵活的数据操作。在我看来,数据之前通过外键进行关联是很必要的,这样保证数据的完整性,也使得数据的含义更加明显。


5 mysql中建立索引可以使得查询速度提升很多,那么如何使用索引呢,是每个查询的条件设置索引?在项目中如果不使用索引,会导致查询会全表扫描。

答:固定长度的字段可以设置索引 ,order by的字段可以设置索引,但不滥用索引。


6 数据库中join多个表时,按照mysql优化来说,它会将查询结果少的当作驱动表,以驱动表为基础来关联其它表,这样可以使得数据操作更少,速度更快,我们也可以手动设置驱动表:left join,而且如果order by 的字段不是驱动表的字段,则会产生临时表,速度会很慢。

答:在不知道那个表的数据多和少的情况下,最好不要手动设置驱动表,除非你很确定。


7 前台传递参数到后台,怎么封装json数据?目前的做法是:封装数据到form表单中,通过表单的序列化: form.serialize() 来获取json数据,有没有直接封装json的工具,可以直接封装想要的json数据。

答:需要其它js的支持,例如json2.js支持(https://github.com/douglascrockford/JSON-js


8 后台接收前台传递的参数,是使用实体对象接收还是使用Map来接收?很多时候,传递的参数很少,且现有的实体不支持,是否新建新的实体来接收参数还是使用Map来接收?

答:大多数都是通过实体对象来接收,如果传递的参数具有很明显的规律或特征,那么使用Map来封装,可以减少封装的实体,且具有很明显的含义。


9 ibatis批量插入时传递的对象是使用Map还是使用封装集合的实体对象?

答: 这个时候使用Map会比较简单,可以减少实体并且灵活性会比较好,只要往里面加集合数据就好,具有一定的可重用性。


10 mysql查询时如何不区分大小写?

查询时指定collation : SELECT * FROM case_test WHERE word COLLATE utf8_bin LIKE 'F%'; 

上述可以区分大小写,但首尾空格还是无法区分,为了精准查询,可以使用SELECT * FROM case_test WHERE BINARY word LIKE 'F%'。 


11 当涉及多个数据库或多个表结构时,各个表结构的对应的实体相差不大,我们是否需要将一个表的实体适配到另一个表的实体上?

答:为了后期的维护与解耦合,我们需要将实体进行适配,这就相当于进行接口适配一样。


12 有些时候,当编写某个service时,发现其耦合了其它service,即在serviceA中使用了serviceB的方法,按照三层架构,service访问的是DAO的方法,直接耦合其它service是一种好的方法吗?还是需要在其它DAO中再定义一些方法进行实现。

答:首先service耦合service,在业务和模块划分明确的情况下是可以这样做的,因为内部紧密耦合是可以的,同层和Service-DAO层的耦合是可以的,但绝不允许直接在非DAO和Service中直接引用DAO,这会造成严重的耦合,导致业务无法扩展。


13 使用辅助表进行ID自增的时候,如果我们需要执行批量插入,那么需要先获取到相应的主键ID,然后才能执行批量插入,这样会造成性能问题,如何解决呢?暂时没有更好的解决方案

答: 首先获取一次主键值,然后将设置主键值为当前主键值+列表的长度,这样就可以确定主键,也不会影响主键的唯一性,需要写一个存储过程来实现。


14 ibatis批量插入的实现,有两种方式,一种是通过startBatch和executeBatch来实现,还有一种就是通过在xml中配置<iterate>来实现,两种方式哪种更好呢?

答:从性能上来看,使用在xml中配置<iterate>来实现更快,尤其是数据量较大时,所以使用xml配置更好。


15 有些人会觉得能用sql语句解决的就不用java代码来实现,而有些人觉得能用java代码解决的就不用sql,对此你怎么看?

答:我个人觉得两者各有其特点,不能一概而论,sql语句适合处理表之间数据的转移和查找,而java代码适合对复杂逻辑进行处理,如果使用mysql进行一些复杂逻辑的判断,那么不仅占用数据库资源,更会造成数据并发程度降低,java代码的优点是,数据结构丰富,逻辑处理能力比较强。


16 jsp中判断数据是否存在的依据:判断是否为null,或集合数据长度是否为0,这就牵扯出数据初始化的问题,集合数据初始化为长度为0的还是null?

答:个人比较推荐初始化为null,减少不必要的资源浪费,在有些通信场景就可能需要进行初始化为默认数据或长度为0的数据。


以后将持续更新问题!!!!

有些问题,可能暂时还没有找到解决方案,如果哪位读者有解决方案或更好的方案,可以在评论区留言。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来了就走下去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值