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

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。