ssh框架怎么导入myeclipse

ssh框架怎么导入myeclipse,第1张

 新建web工程

在myeclipse窗口中右键,在d出的小窗中点击new,然后web project。

在Project Name里输入工程名字,此处输入SSH,选择java ee 5.0,版本设置在1.5以上。

struts依赖包

下面来添加struts依赖包。

右击工程,选择“myeclipse”在二级菜单找到“Add Struts Capabilities”点击进入。

按照图中选择struts 2.1的,然后点击完成。

添加struts的依赖包。点击完成。

添加spring框架依赖包

下面来添加spring依赖包。

右击工程,选择“myeclipse”在二级菜单找到“Add Spring Capabilities”点击进入。

选择spring3.0的,然后勾上红框中的包,并且把这些包放到lib目录下面。

选择存放资源的位置。

点击完成后,spring部分的搭建完毕,可以看到文件夹上带有“S”的标志。

建立一个数据库连接

在配置hibernate之前,先建立一个数据库的连接。myeclipse右上角找到切换视图的图标,点击,找到“MyEclipse Database Explorer”点击进入。

右击新建一个连接“new“

这里使用的是mysql数据库,所以选择这个,驱动包可以到网上下载,提供的项目里面拿。放在lib下面了。

添加完驱动后,点击完成。

右击新建好的数据库连接,选择”open another connection“连接数据库,看是否成功,成功后可以看到数据库的表结构。

添加hibernate依赖包

下面来添加hibernate依赖包。

右击工程,选择“myeclipse”在二级菜单找到“Add Hibernate Capabilities ”点击进入。

选择hibernate3.3的支持。选中红框需要的包,并且把这些包放到lib目录下面。

统一由Spring configuration file管理Hibernate

这里选择继承的Spring配置文件。

选择刚才新建好的数据库连接。

把勾去掉,点击”next“,然后再点击完成。到了这一步,SSH框架的搭建基本上就完成了。

Hibernate中提供了三种查询方式,分别为HQL、Criteria查询、本地化SQL查询,实际应用中,有很多人忽略了Criteria的用处,觉得不如另外两种贴近SQL方式便捷,实际则未必,很多情况下Criteria更具有优势;本篇文章就对Criteria查询做一个全面的介绍,以期尽可能的将更多的Criteria强大的查询功能展现出来;

1、首先新建一个Maven Web Project项目,本次使用的是hibernate4.3.11版本,使用MySql数据库,添加如下依赖:

[html] view plain copy

<!-- 引入mysql jar依赖 -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.38</version>

</dependency>

<!-- 引入hibernate依赖 -->

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-core</artifactId>

<version>4.3.11.Final</version>

</dependency>

新建完毕后,项目结构如下:

2、entity包下面放置的是通过Hibernate反向工程生成的实体映射类,samples包下面放置测试类,同样hibernate.cfg.xml文件需要配置,在此就不一一展示了,好了,准备工程就这么多,下面开始介绍Criteria的实际 *** 作;

3、Criteria查询

3.1 获取Criteria对象

[java] view plain copy

package com.hibernate.samples

import org.hibernate.Criteria

import org.hibernate.Session

import org.hibernate.SessionFactory

import org.hibernate.cfg.Configuration

import org.junit.After

import org.junit.Assert

import org.junit.Before

import org.junit.Test

import com.hibernate.entity.SlEmployee

public class HibernateTest {

// 声明一个Hibernate Session类型的变量

private Session session

@Before

public void getSession(){

Configuration config = new Configuration().configure()

SessionFactory sessionFactory = config.buildSessionFactory()

session = sessionFactory.openSession()

}

@After

public void closeSession(){

if(session != null){

session.close()

}

}

@Test

public void doCreateCriteriaInstance(){

// 获取Criteria实例对象

Criteria criteria = session.createCriteria(SlEmployee.class)

Assert.assertNotNull(criteria)

}

}

3.2 在SQL中,我们可以通过WHERE关键字对条件进行定义,那么在Criteria中呢?看例子

[java] view plain copy

@Test

public void doConditionQueryInCriteria() {

// 获取Criteria实例对象

Criteria criteria = session.createCriteria(SlEmployee.class)

// 查询出王姓员工且收入在3000到5000之间的

// 类似于HQL中 WHERE employeeName LIKE '王%' AND salary BETWEEN 3000 AND 5000

List emps = criteria.add(Restrictions.like("employeeName", "王%"))

.add(Restrictions.between("salary", 3000.0, 5000.0)).list()

// 查询出工资在4000以下或5000以上的王姓员工

// 可以通过Restrictions的or或and进行逻辑分组

emps = criteria.add(Restrictions.like("employeeName", "王%"))

.add(Restrictions.or(Restrictions.gt("salary", 5000D), Restrictions.lt("salary", 3000D))).list()

// 查询出岗位是软件工程师或测试工程师,且学历是硕士、本科或大专的员工有哪些

emps = criteria.add(Restrictions.in("position", new String[] { "软件工程师", "测试工程师" }))

.add(Restrictions.disjunction().add(Restrictions.eq("degree", "硕士")).add(Restrictions.eq("degree", "本科"))

.add(Restrictions.eq("degree", "大专")))

.list()

}

上述三个查询可以看出Restrictions类提供了内建Cretirion类型来满足各种查询状况,此外Criteria还有一个特别强大的功能,那就是允许你直接指定SQL查询,看例子

[html] view plain copy

List emps = criteria.add(Restrictions.sqlRestriction("birthday >'1980-01-01' AND employee_name like '刘%'")).list()

上述无论是birthday还是employee_name都是数据库中表的字段名称,看起来是不是特别好用,此外还可以直接通过属性实例构建查询条件,比如要查询出学习是高中、中专的员工有哪些:

[java] view plain copy

List emps = criteria.add(Property.forName("degree").in(new String[]{"高中","中专"})).list()

3.3 对结果集进行排序,同样可以分为上述两种方式

[java] view plain copy

List emps = criteria.add(Restrictions.sqlRestriction("birthday >'1970-01-01'")).addOrder(Order.asc("birthday"))

.addOrder(Order.desc("salary")).list()

List emps = criteria.add(Restrictions.sqlRestriction("birthday >'1970-01-01'"))

.addOrder(Property.forName("birthday").asc()).addOrder(Property.forName("salary").desc()).list()

3.4 上述几个例子直接演示了对我们想要实体的 *** 作,大家都知道每个实体都会有好多关联实体,比如一个请假实体类会关联请假申请人与审批人、一篇博客会关联作者和分类信息实体、一个订单会关联多个商品实体,顾客实体,地址实体等,如果此时我们想通过对关联实体的限制,最终限制想要的实体,那应该怎么处理呢,看例子;

[java] view plain copy

// 比如我们想查询北京各个公司中,员工学历中包括高中、中专、大专的公司部门有哪些

List depts = criteria.add(Restrictions.sqlRestriction("dept_name LIKE '北京%'"))

.createCriteria("slEmployees").add(Restrictions.in("degree", new String[]{"高中","中专","大专"})).list()

上述方法生成下列SQL文

[sql] view plain copy

from

sl_dept this_

inner join

sl_employee slemployee1_

on this_.dept_id=slemployee1_.DEPT_ID

where

dept_name LIKE '北京%'

and slemployee1_.DEGREE in (

?, ?, ?

)

通过该实例我们可以得出:

a)可以通过createCriteria方法来通过关联实体限制最终查询实体;

b)默认采用内连接的方式关联查询

那么如果我们想采用比如左连接,右连接甚至是全外连接的话又该怎么做呢,看例子:

[java] view plain copy

List depts = criteria.add(Restrictions.sqlRestriction("dept_name LIKE '北京%'")).createAlias("slEmployees", "emps2", JoinType.LEFT_OUTER_JOIN, Restrictions.gt("salary",6000.0)).list()

生成SQL如下:

[sql] view plain copy

from

sl_dept this_

left outer join

sl_employee emps2x1_

on this_.dept_id=emps2x1_.DEPT_ID

and (

emps2x1_.SALARY>?

)

where

dept_name LIKE '北京%'

另外同样在createCriteria方法中也同样可以指定查询方式;

在做web相关的应用时,经常需要提供接口与用户交互(获取数据、上传数据等),由于这个过程需要用户进行相关的 *** 作,为了避免出现一些错误的数据等,一般需要对数据进行校验,随着接口的增多,校验逻辑的冗余度也越来越大,虽然可以通过抽象出校验的方法来处理,但还是需要每次手动调用校验逻辑,相对来说还是不方便。

为了解决这个问题,Java中提供了Bean Validation的标准,该标准规定了校验的具体内容,通过简单的注解就能完成必要的校验逻辑了,相对来说就方便了很多,而该规范其实只是规范,并没有具体的实现,Hibernate提供了具体的实现,也即Hibernate Validator,这个也是目前使用得比较多的验证器了。

首先新建一个spring boot项目,引入web依赖

在web依赖中,已经引入了hibernate-validator的支持,所以只需要引入web依赖即可。

如果你所使用的版本没有支持,或者不是使用SpringBoot项目,具体的请参考文档解决。

然后配置一下validator,由于默认情况下,Hibernate-validator使用的校验策略是依次校验,并且将不通过的结果保存,最后再统一抛出异常信息,但实际上,当校验出现第一个不满足情况的时候,就可以停止了(当然,如果选择全部验证完也是可以的),所以我们手动配置一下

接下来编写需要进行验证的Bean

上面的注解已经很能够见名知意了,所以这里就先不讲解,后面再补充常用的验证注解及作用总结。

定义一个简单的测试接口

注意上面所使用的 @Valid 注解,通过该注解能够使得验证生效,如果去除的话,可以看到验证逻辑并没有生效。

通过上面的一个简单注解之后,验证的逻辑已经能够生效,然而,在测试的时候,可能会出现下面的情况

这是因为,默认情况下,SpringBoot配置了默认异常处理器DefaultHandlerExceptionResolver,而该处理器仅仅是将异常信息打印出来,显然,我们并不需要返回如此多的信息,只需要将对应属性中的message信息给调用者即可,解决的方法有两种。

通过上面的处理之后,现在如果验证不通过,则可以以比较优雅的方式返回给调用者了。

这里需要注意,如果上面两种方式都开启的话,是以第一种方式优先的,所以,第二种方式不会生效。

上面的方式能够解决 @RequestBody 标注的参数的验证及错误处理,然而,并不能处理 @PathVariable 以及 @RequestParam 标注的入参(不生效),而事实上,这两种类型的 *** 作也是非常常用的(也是需要对这两种类型进行验证,除了手动验证外,还有一种通用的解决方案,也是通过注解来实现),对于这两种类型同样可以使用验证注解进行标注,如下所示

为了让对应的注解生效,可以在类的上方使用 @Validated 进行标注,注意是标注在类上方,即

但此时如果验证失败,会抛出异常信息,而且,异常类型不是 MethodArgumentNotValidException ,而是 ConstraintViolationException ,巨坑!!!,所以还需要捕获该类型并且进行处理,如下所示

到此,基本上的参数验证就能完成了。

此外,在搜索解决方案的过程中,也发现了两个有用的小技巧,顺便记录在这里(跟上面的内容无关哈)。

对于 @PathVariable 还有另外一种解决方案(严格来说作为验证并不完善),通过正则表达式来进行匹配(这种方式不支持长度限制,但可以进行类型限制,如只包含字符,只包含数字等),如下所示

对于 @RequestParam 来说,可以使用默认值来实现可变化的参数列表,如下所示

更复杂的如分页,排序等等,可以通过默认参数的形式,来实现,而不再需要强制调用者输入对应的参数(毕竟这些参数是可选的嘛)。

常用的注解主要有以下几个,作用及内容如下所示

本小节主要学习了如何在SpringBoot中使用Hibernate-Validator,验证器的作用在于验证参数是否符合规定,通过配置验证器以及对应的异常处理器,可以使我们从繁琐的验证流程中解脱出来,当然,对于复杂的验证,其实还是要手动验证的,验证器能提供的是一些通用的,常规的验证 *** 作,当然,大部分情况下已经足够了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/bake/11419615.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存