本文主要是介绍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的数据。
以后将持续更新问题!!!!
有些问题,可能暂时还没有找到解决方案,如果哪位读者有解决方案或更好的方案,可以在评论区留言。
这篇关于java编程中的问题及解决问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!