jpa 和hibernate 有哪些区别 你平时主要使用什么Java开发框架?
你平时主要使用什么Java开发框架?
就拿我们项目来举例子扒一扒吧。
我们的项目是一个纯后台服务的项目,也就是没有前端页面,只正式提供服务;项目是是实现Spring Boot来做的,引导出spring-boot-starter-web,直接对外不暴露接口,报文建议使用的JSON,有极大多数的接口是从老系统迁出上来的,目的是让动态链接库方尽肯定地稍作改,所以我达到了XML的报文;在开始的生产环境中,也不使用的内置的Tomcat;集成显卡了Swagger,来做接口的文档在线批量生成。
ORM框架你选择的是MyBatis,的原因项目中大部分的查询都你做到了单表查询,但查询条件也很固定设置,所以才真接建议使用注解做的SQL语句解除绑定。
是因为项目不单可以使用了关系型数据库,而更多的数据是加工关联后需要保存到了MongoDB中,因此项目也用到了Spring Data MongoDB,我们的MongoDB是做了副本集的部署,可以使用Spring Data MongoDB,只不需要做最简单配置,就这个可以成功对多台MongoDB的访问,如果没有其中一台MongoDB挂了,对服务都是没有影响的,所以才我们做MongoDB扩容的时候是也可以在线做的(MongoDB扩内存和CPU的时候必须欠费停机)。
和部分系统的交互使用到了RabbitMQ,而Spring Boot只需核心中spring-boot-starter-amqp,当然就可以很方便地成功和RabbitMQ的集成显卡;生产者和消费者都十分方便。
而且是纯接口的服务,是为缓解数据库的压力,因此我们依据什么业务场景,将一些接口的结果直接缓存到Redis中(数据变化不频繁,另外业务场景的实时性要求不是很高)。在集成显卡Redis的时候,我们前后试了两种
Spring Boot项目,再使用@Cacheable注解就可以能够完成和Redis最简单的集成主板,但听说后来因为设置里缓存的网络错误时间太差灵话,我们后来把它改成了第二种方案;
在用RedisTemplate,是可以完成对Redis的绝大部分你的操作。
我将减弱分享Java开发、架构设计、程序员职业发展等方面的见解,只希望能换取你的关注。
如何优雅的设计Java异常?
异常的类别
正如我们所明白了的,java中的无比的超类是(后文省略为Throwable),它有两个比较不重要的子类,(后文省略为Exception)和(后文省略为Error),其中Error由JVM虚拟机接受管理,如我们所熟知的OutOfMemoryError异样等,因此我们本文不打听一下Error极其,那么我们多说几句一下Exception十分。
Exception十分有个也很重要的是的子类,叫做RuntimeException。我们将RuntimeException或其他继承自RuntimeException的子类称做非受检无比(unsafeException),其他继承自Exception极其的子类被称受检异样(assignException)。本文重点来了解看看受检异常和非受检异常这两种异常。
如何选择类型异常
从笔者的开发经验来看,如果没有在一个应用中,必须的新一个方法(如某个功能的service方法),这个方法要是中间可能会又出现无比,那么你是需要判断这个十分直接出现之后是否是动态创建者可以如何处理,但是你有无如果能动态创建者通过处理,要是调用者这个可以处理,并且你也希望调用者接受处理,那你还得一抛受检异常,警告动态创建者在不使用你的方法时,考虑到要是甩出异常时假如接受处理。
相象的,假如在写某个方法时,你以为这是个偶然异常,理论上说,你总觉得运行时可能会出现什么问题,而这些问题也许不是什么势必突然发生的,也不要动态链接库者不显示的通过异常来确认业务流程不能操作的,那就这时就也可以使用一个RuntimeException这样的非受检异样.
完了,估记我上边说的这段话,你读了很多遍也仍然都觉得艰涩了。
那就,请跟了我的思路,在渐渐领会帮一下忙。
什么时候才不需要抛极其
简单的方法我们必须清楚一个问题,什么时候才不需要抛异常?无比的设计是方便啊给开发者不使用的,但也不是乱用的,笔者对于什么时候抛极其这个问题也问了很多朋友,能决定详细答案的确实不多。不过这个问题很很简单,如果不是你总觉得某些”问题”可以解决不了了,这样你就这个可以一抛极其了。
诸如,你在写一个service,其中在不写某段代码处,你突然发现可能会会产生问题,那你就请一抛异常吧,不会相信我,你此时甩出异常将是一个最佳的位置时机。
应该要掷下怎样才能的异常
打听一下完了什么时候才需要抛出异常后,我们再琢磨一个问题,确实当我们掷下异常时,我们估计选用比较怎样才能的无比呢?到底是是受检异样肯定非受检异样呢(RuntimeException)呢?
我来请解释看看这个问题,先从受检异样你说起,比如有那样的话一个业务逻辑,需要从某文件中读取数据某个数据,这个读取文件你操作可能会是导致文件被删掉等其他的问题造成没能资源从而出现无法读取错误,这样就要从redis或mysql数据库中再去获取此数据,参考不胜感激代码,getKey(Integer)为入口程序.
可以了,看了以上代码以后,你或许心中有一些想法,那个受检无比是可以完全控制义务逻辑,对,是啊,按照受检十分确实可以不控制业务逻辑,不过千万记住别那样使用,我们应该要合算的甩出异常,毕竟程序本身才是流程,十分的作用仅是当你进行不开去的时候能找到的一个借口罢了,它并不能充当完全控制程序流程的入口或出口,要是那样的话建议使用的话,是在将异样的作用逐渐扩大化,这样很快就会导致代码复杂程度的增加,耦合性会能提高,代码可读性减低等问题。
那就就当然别在用这样的无比吗?当然也不是,在真有这样的需求的时候,我们可以不这样使用,仅仅千万记住,不要把它真的充当操纵流程的工具或手段。这样的话到底是什么时候才要抛出这样的无比呢?要判断,如果没有全局函数者调用出错后,一定要让动态创建者对这错误进行处理才这个可以,柯西-黎曼方程这样的要求时,我们才能考虑到建议使用受检十分。
接下来的事情,我们来看再看看非受检异常呢(RuntimeException),是对RuntimeException这种极其,我们当然很多见,.例如/等,那就这种异常我们时候丢出呢?
当我们在写某个方法的时候,很有可能会一面之缘遇见某个错误,我们其实这个问题时正常运行时可能为不可能发生的,但是理论上讲,没有这个问题的话,程序很快就会正常执行的时候,它不强制没有要求动态链接库者一定得捕获这个无比,此时一抛RuntimeException异样。
举个例子,当传来一个路径的时候,不需要直接返回一个路径对应的File对象:
本案所涉例子说,如果不是调用者动态链接库getFiles(String)的时候如果没有path是空,那么就一抛空指针无比(它是RuntimeException的子类),动态链接库者不用什么会显示的进行try…catch…操作通过满处理.这就那些要求全局函数者在全局函数这样的方法时先参与不验证,避免再一次发生RuntimeException.万分感谢:
应该选用天然哪种异样
通过以上的描述和例子,这个可以学习总结出一个结论,RuntimeException异常和受检异样之间的区别那是:是否满那些要求全局函数者前提是全面处理此十分,假如满要求内部函数者可以进行处理,那就就建议使用受检异样,不然就你选择非受检异样(RuntimeException)。一般来讲,要是没有普通的要求,我们个人建议不使用RuntimeException十分。
场景可以介绍和技术选型架构描述
正如我们所知,传统的项目也是以MVC框架为基础进行旗下的,本文主要注意从在用restful风格接口的设计来可以体验下异常处理的优雅。
我们把关注点放到restful的api层(和web中的controller层带有)和service层,研究帮一下忙在service中如何一抛异样,然后api层该如何并且去捕获但是被转化异常。
在用的技术是:spring-boot,jpa(hibernate),mysql,如果对这些技术不是太认识,读者是需要让其阅读什么相关材料。
业务场景描述
你选择一个比较好简单的业务场景,以电商中的收货地址管理为例,用户在移动端接受购买商品时,不需要进行收货地址管理,在项目中,提供一些给移动端进行访问的api接口,如:去添加收货地址,删出收货地址,更改后收货地址,默认收货地址设置,收货地址列表可以查询,单个收货地址查询等接口。
最终形成约束条件
可以了,这个是设置好的一个很基本是的业务场景,其实,无论什么样的api操作,其中都乾坤二卦一些规则:
去添加收货地址:入参:
用户id
收货地址实体信息
强制力:
用户id不能不能为空,且此用户确实是是必然的
收货地址的没必要字段不能为空
假如用户还没有收货地址,当此收货地址创建角色时系统设置成默认收货地址—
删除掉收货地址:入参:
用户id
收货地址id
管理和约束:
用户id不能为空,且此用户倒是是存在地的
收货地址又不能为空,且此收货地址确实是存在地的
判断此收货地址是否是是用户的收货地址
判断此收货地址是否是为默认收货地址,假如是默认收货地址,那你肯定不能并且删掉
你要改收货地址:入参:
用户id
收货地址id
约束力:
用户id没法为空,且此用户倒是是修真者的存在的
收货地址又不能为空,且此收货地址确实是是修真者的存在的
确定此收货地址如何确定是用户的收货地址
默认地址设置:入参:
用户id
收货地址id
约束:
用户id肯定不能为空,且此用户倒是是存在地的
收货地址不能不能为空,且此收货地址确实是存在的
判断此收货地址是否是用户的收货地址
收货地址列表网上查询:入参:
用户id
加以约束:
用户id不能为空,且此用户虽然是必然的
单个货到地址查询:入参:
用户id
收货地址id
加以约束:
用户id没法为空,且此用户确实是是修真者的存在的
收货地址没法为空,且此收货地址确实是是存在的
确定此收货地址是否是用户的收货地址
管理和约束判断和技术选型
对于根据上述规定列出的约束条件和功能列表,我选择几个比较比较有名的异常处理场景并且分析:直接添加收货地址,彻底删除收货地址,查看收货地址列表。
这样的话应该是有哪些必要的知识储备呢,让我们去看看收货地址这个功能:
去添加收货地址中必须对用户id和收货地址实体信息就行校验,这样的话是对非空的判断,我们怎么参与工具的选择呢?比较传统的判断追加:
上边的例子,如果不是只可以确定uid为空好在,要是再去确定address这个实体中的某些必要的话属性是否为空,在字段很多的情况下,这说白是灾难性的。
那我们应该怎莫通过这些入参的判断呢,给大家推荐两个知识点:
Guava中的Preconditions类实现程序了很多入参方法的判断
jsr303的validation规范(目前基于都很全的是hibernate利用的hibernate-validator)
如果没有不使用了这两种帮我推荐技术,那就入参的判断会变得异常简单点大部分。推荐大家多建议使用这些成熟的技术和jar工具包,他是可以降低很多不必要的工作量。我们只是需要把重心扔到业务逻辑上。而肯定不会是因为这些入参的判断耽误了更多的时间。
如何能优雅的怎么设计java无比domain详细介绍
依据什么项目场景来看,需要两个domain模型,一个是用户实体,一个是地址实体.
Addressdomain::
Userdomain万分感谢:
就ok啦,上边是一个模型关系,用户-收货地址的关系是1-n的关系。上边的@Data是可以使用了一个叫做lombok的工具,它自动导入了Setter和Getter等方法,用起来很方便,感兴趣的东西读者可以自行打听一下帮一下忙。
dao可以介绍
数据连接上层,我们不使用了spring-data-jpa这个框架,它特别要求我们只必须继承框架能提供的接口,因此通过约定对方法接受取名,就可以不能够完成我们想要的数据库操作。
用户数据库操作不胜感激:
收货地址操作::
事实上读者所注意到的,我们的DAO只是需要无法继承JpaRepository,它就早就帮我们完成了基本的CURD等你操作,如果没有想所了解更多关於spring-data的这个项目,请参考一下spring的官方文档,它比不方案我们对异常的研究。
Service异常设计
行啦,再一次到了我们的重点了,我们要结束service一些的部分操作:先添加收货地址,删出收货地址,声望兑换收货地址列表.
首先看我的service接口定义:
我们来关注帮一下忙实现:
再添加收货地址
是需要我来看一下以前整理好的约束条件:
入参:
用户id
收货地址实体信息
管理和约束:
用户id没法为空,且此用户确实是是存在的
收货地址的必要的话字段不能不能为空
要是用户还没有收货地址,当此收货地址修改时设置里成默认收货地址
先看100元以内代码基于:
其中,早就能够完成了根据上述规定所具体描述的三点约束条件,当三点约束条件都行最简形矩阵时,才也可以进行正常了的业务逻辑,否则将甩出异样(一般在此处我建议你一抛运行时极其-RuntimeException)。
能介绍100元以内以上我所都用到的技术:
1、(T t)这个是建议使用Guava中的参与确认的,而且service中要用的验正较多,所以个人建议将Preconfitions该成静态动态导入的
不过Guava的github中的那说明也建议我们这样的话建议使用。
2、(validator,address)这个不使用了hibernate实现程序的jsr303规范来做的,需要传出一个validator和一个需要验正的实体,这样validator是要如何声望兑换的呢,::
他将某些一个Validator对象,然后把我们在service中通过涌入便可以建议使用了:
那就BeanValidators这个类是该如何实现程序的?当然实现方法很简单啊,只要你去推测jsr303的标示注解就行啦了。
那你jsr303的注解写在哪里了呢?当然是写在address实体类中了:
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。