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

2024-06-21 17:18

本文主要是介绍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编程中的问题及解决问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081838

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input