Spring 4 整合 Hibernate 5 技术
- 格式:docx
- 大小:154.19 KB
- 文档页数:45
Hibernate+Spring多数据库解决方案我以前在项目中的探索和实践,写出来与大家分享。
大家有其他好的方式,也欢迎分享。
环境:JDK 1.4.x , Hibernate 3.1, Spring 2.0.6, JBOSS4.0, 开发模式: Service + DAO我们项目中需要同时使用多个数据库. 但 Hibernate 不能直接支持,为此我们对比了网上网友的方案,自己做了一点探索。
1. Demo需求我们的项目使用一个全省的公共库加十多个地市库的架构。
本文主要说明原理,将需求简化为两库模型。
主库:User管里,主要是系统管理,鉴权等数据;订单库:Order 管理,存放订单等业务性数据。
2. 原理:1) Hibernate 的每个配置文件对应一个数据库,因此多库需要做多个配置文件。
本文以两个为例:主库 hibernate_sys.cfg.xml,订单库 hibernate_order.cfg.xml每个库,Hibernate 对应一个 sessionFactory 实例,因此Hibernate 下的多库处理,就是在多个 sessionFactory 之间做好路由。
2) sessionFactory 有个 sessionFactory.getClassMetadata(voClass) 方法,返回值不为空时,表示该 VO 类在该库中(hbm.xml文件配置在了对应的hibernate.cfg.xml中),该方法是数据路由的核心和关键所在。
因此, User.hbm.xml 配置在 hibernate_sys.cfg.xml ,Order数据位于配置到 hibernate_order.cfg.xml3)多库处理时,需要使用 XA 事务管理。
本例中使用 Jboss4.0 来做JTA事务管理;用JOTM,其他应用服务器原理相同。
3. 实现1)为做多 sessionFactory 实例的管理,设计 SessionFactoryManager 类,功能就是做数据路由,控制路由的核心是 sessionFactoryMap 属性,它按dbFlag=sessionFactory 的方式存储了多个库的引用。
spring4.x + hibernate4.x 配置详解关于spring和hibernate的使用以及特征等等,在此不再啰嗦,相信大家也都知道,或者去搜索一下即可。
本篇博文的内容主要是我最近整理的关于spring4.x 和hibernate 4.x 相关配置和使用方式,当然spring3.x以及hibernate4.x也可以借鉴。
首先是配置文件web.xml 增加以下代码即可<!-- 加载spring相关的配置文件--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/applicationContext.xml</param-value> </context-param><!-- 启用spring监听--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</l istener-class></listener>然后建立 applicationContext.xml 文件,src下。
文件内容如下,注释我尽量写的很详细<beans xmlns:xsi="/2001/XMLSchema-instance"xmlns="/schema/beans"xmlns:aop="http://ww /schema/aop"xmlns:context="/schema/context"xmlns:tx="ht tp:///schema/tx"xmlns:cache="/schema/cache"xmlns:p="http:// /schema/p"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-4.0.xsd/schema/aop/schema/aop/spring-aop-4.0.xsd/schema/context/schema/context/spring-context-4.0.xsd/schema/tx/schema/tx/spring-tx-4.0.xsd/schema/cache http://www.springframewor /schema/cache/spring-cache-4.0.xsd"><!-- 引入properties文件--><context:property-placeholder location="classpath*:/appConfig.properties"/> <!-- 定义数据库连接池数据源bean destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用--> <bean id="dataSource"class="boPooledDataSourc e"destroy-method="close"><!-- 设置JDBC驱动名称--><property name="driverClass"value="${jdbc.driver}"/><!-- 设置JDBC连接URL --><property name="jdbcUrl"value="${jdbc.url}"/><!-- 设置数据库用户名--><property name="user"value="${ername}"/><!-- 设置数据库密码--><property name="password"value="${jdbc.password}"/><!-- 设置连接池初始值--><property name="initialPoolSize"value="5"/></bean><!-- 配置sessionFactory --><bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><!-- 数据源--><property name="dataSource"ref="dataSource"/><!-- hibernate的相关属性配置--><property name="hibernateProperties"><value><!-- 设置数据库方言-->hibernate.dialect=org.hibernate.dialect.MySQLDialect<!-- 设置自动创建|更新|验证数据库表结构-->hibernate.hbm2ddl.auto=update<!-- 是否在控制台显示sql -->hibernate.show_sql=true<!-- 是否格式化sql,优化显示-->hibernate.format_sql=true<!-- 是否开启二级缓存-->e_second_level_cache=false<!-- 是否开启查询缓存-->e_query_cache=false<!-- 数据库批量查询最大数-->hibernate.jdbc.fetch_size=50<!-- 数据库批量更新、添加、删除操作最大数-->hibernate.jdbc.batch_size=50<!-- 是否自动提交事务-->hibernate.connection.autocommit=true<!-- 指定hibernate在何时释放JDBC连接-->hibernate.connection.release_mode=auto<!-- 创建session方式hibernate4.x 的方式-->hibernate.current_session_context_class=org.springframework.or m.hibernate4.SpringSessionContext<!-- javax.persistence.validation.mode默认情况下是auto的,就是说如果不设置的话它是会自动去你的classpath下面找一个bean-validation**包所以把它设置为none即可-->javax.persistence.validation.mode=none</value></property><!-- 自动扫描实体对象tdxy.bean的包结构中存放实体类--><property name="packagesToScan"value="tdxy.bean"/> </bean><!-- 定义事务管理--><bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager "><property name="sessionFactory"ref="sessionFactory"/> </bean><!-- 定义Autowired 自动注入bean --><bean class="org.springframework.beans.factory.annotation.AutowiredAnnotati onBeanPostProcessor"/><!-- 扫描有注解的文件base-package 包路径--><context:component-scan base-package="tdxy"/><tx:advice id="txAdvice"transaction-manager="transactionManager"> <tx:attributes><!-- 事务执行方式REQUIRED:指定当前方法必需在事务环境中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果当前没有事务,就新建一个事务。
javaweb课程设计 ssh一、教学目标本章节的教学目标是使学生掌握JavaWeb开发中所使用的SSH(Spring、SpringMVC、Hibernate)技术栈的基本原理和应用,通过学习,学生能够:1.理解SSH框架的整合原理和运行机制。
2.熟练使用Spring进行业务对象的管理和事务控制。
3.掌握SpringMVC的请求处理流程,并能设计良好的控制器。
4.学会使用Hibernate进行数据库操作,实现对象的持久化。
5.培养学生独立分析和解决JavaWeb开发中遇到的问题的能力。
二、教学内容本章节的教学内容将按照SSH技术的特点和应用需求进行,主要包括以下部分:1.Spring框架:介绍Spring的背景、核心概念,以及如何使用Spring进行依赖注入、面向切面编程等,同时深入解析Spring的事务管理和安全性控制。
2.SpringMVC框架:讲解SpringMVC的架构和原理,如何搭建SpringMVC应用,以及如何实现请求的映射、参数绑定、视图解析等。
3.Hibernate框架:讲解Hibernate的基本概念,如ORM、HQL等,并通过实例演示如何使用Hibernate进行数据库的增删改查操作。
4.SSH整合:介绍SSH整合的原理和方法,通过案例展示如何将Spring、SpringMVC和Hibernate三者整合在一起,形成一个完整的JavaWeb 应用。
三、教学方法为了提高学生的学习兴趣和主动性,本章节将采用多种教学方法相结合的方式进行教学:1.讲授法:用于讲解SSH技术的基本概念、原理和框架的整合方法。
2.案例分析法:通过分析实际案例,使学生更好地理解SSH技术的应用场景和解决实际问题的能力。
3.实验法:安排课后实验,让学生动手实践,巩固所学知识,培养解决问题的能力。
4.小组讨论法:学生进行小组讨论,分享学习心得,互相解答疑问,提高学习的互动性。
四、教学资源为了支持本章节的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:选择权威、实用的JavaWeb教材,作为学生学习的基础。
*编写环境:*开发工具:Myeclipse6.01*SPRING :spring2.0*STRUTS :struts1.2*HIBERNATE:hibernate3.0*JDK: 1.6*TOMCAT: 6.0*WINDOW641.新建web项目。
2.选中新建项目,右键--》选择“myeclipse”--》添加Struts支持。
3.在弹出的信息框,有必要修改一下图中的地方。
4.上面的操作完成之后,打开我们的项目我们可以看到我们的项目结构发生了变化,引入了一些struts标签和生成了struts-config.xml配置文件。
5.开始添加spring支持,同样选中新建项目,右键--》选择“myeclipse”--》“添加spring 支持”,在弹出的信息框,做如下内容修改:6.点击“next”,直接选择默认,当然也可根据自己的规则做修改。
7.在添加“Hibernate”支持的时候,首先做的工作是创建一个数据源。
这个创建方法有很多中(找百度可得)这里只介绍一种:打开你的myeclipse的右上角的小三角,选择“myeclipsedatabase explorer”在弹出的界面中,在如图位置右键“new”在弹出的界面中做如下修改:修改完成后点击“test driver”成功则继续。
8.暂时回到myeclipse开发界面。
正式开始添加“Hibernate”支持。
在弹出的界面中做如图修改:点击“next”这里如图,选择spring的配置文件。
下一步操作后,做如下图修改操作:下一步之后,界面修改操作,如下图:去掉复选框中的选项,然后点击“finish”完成整个操作。
之后将会直接打开spring的配置文件,然后你核对一下您的数据库连接是否正确。
至此三大支持操作完成,启动没有问题说明框架雏形已经完成。
9.在项目中的WEB-INF下找到web.xml,做如下修改:格式头部分省略,下面是需要新增的代码<!--初始化spring配置参数 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 配置监听 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</list ener-class></listener><!-- 配置spring过滤器解决中文乱码问题 --><filter>Ps :这个时候我们再次启动服务的时候,发现可能会报错:因为我们在刚才已经把spring 的配置文件做了初始化,而在spring 的配置文件中有数据源的连接,而我们的项目中可能还缺少一个包:commons-pool-1.4.jar(/detail/u013806366/7897665 )当我们把这个包放在lib 下,我们再次启动项目的时候,错误信息应该会消失。
Hibernate5用户手册中文版Hibernate用户手册Hibernate-纯java的关系型持久层框Hibernate团队JBoss可视化设计团队5.0.0.FinalCopyright?2011Red Hat,Inc.2015-08-20目录Hibernate用户手册 (1)Hibernate-纯java的关系型持久层框 (1) Hibernate团队 (1)JBoss可视化设计团队 (1)序言 (8)第1章.Architecture(体系架构) (9)1.1.概述 (10)1.2.Contextual sessions(session上下文) (11) 第2章.Domain Model(域模型) (12)2.1.POJO模型 (13)2.1.1.实现无参构造函数 (13)2.1.2.提供identifier(标识)属性 (13)2.1.3.使用非final类 (14)2.1.4.为持久化属性声明get,set方法 (14)2.1.5.实现equals()与hashCode()方法 (14)2.2.Dynamic(动态)模型 (21)第3章Bootstrap(引导、启动 (22)3.1.Native(原生、本地)引导 (22)3.1.1.构建ServiceRegistry (23)3.1.2.构建Metadata (25)3.1.3.构建SessionFactory (27)3.2.JPA引导JPA Bootstrapping (29)3.2.1.JPA兼容模式的引导 (29)3.2.2.Proprietary2-phase引导 (30)第4章持久化Context(上下文) (30)4.1.实体持久化 (31)4.2.删除实体 (32)4.3.获取没有初始化数据的实体 (32)4.4.获取已经初始化数据的实体 (33)4.5.通过natural-id(自然ID)获得实体 (33)4.6.刷新实体状态 (35)4.7.更改托管态或者持久态 (36)4.8.使用游离态数据 (36)4.8.1.复位游离态数据(游离态变成托管态) (37) 4.8.2.合并游离态数据4.9.验证对象的状态 (38)4.10.从JPA访问Hibernate (39)第5章访问数据库 (40)5.1.ConnectionProvider(连接提供器) (40)5.1.1.使用DataSources (41)5.1.2.使用c3p0 (41)5.1.3.使用proxool连接池 (43)5.1.4.使用Hikari (44)5.1.5.使用Hibernate内置的(不支持)的连接池 (45) 5.1.6.用户自定义的连接 (45)5.1.7.ConnectionProvider事务设置 (45)5.2.数据库Dialect(方言) (45)第6章事务与并发控制 (48)6.1.物理事务 (49)6.1.1.JTA配置 (50)6.2.Hibernate事务API (51)6.3.事务模式(与反模式) (55)6.3.1.Session-per-operation(每操作一个会话)反模式 (55) 6.3.2.Session-per-request(每请求一个会话)模式 (56) 6.3.3.Conversations(对话) (57)6.3.4.Session-per-application(每应用一个会话) (58)6.4.常见问题 (58)第7章JNDI (59)第8章锁 (59)8.1.乐观锁 (60)8.1.1.指定版本号 (61)8.1.2.Timestamp(时间戳) (63)8.2.悲观锁 (64)8.2.1.LockMode类 (65)第9章Fetching(抓取) (66)9.1.基础 (66)9.2.应用抓取策略 (68)9.2.1.不抓取 (69)9.2.2.通过查询动态抓取 (70)9.2.3.通过配置文件动态抓取 (71)第10章批处理 (72)10.1.JDBC批处理 (72)第11章缓冲 (73)11.1.配置二级缓存 (73)11.1.1.RegionFactory(注册工厂) (73)11.1.2.缓冲行为 (74)11.2.管理缓冲数据 (75)第十二章12.拦截器和事件 (76)12.1.拦截器(Interceptors) (76)12.2.Native(原生、本地)事件系统 (77)12.2.1.Hibernate声明式安全 (78)12.3.JPA回调 (80)第13章HQL与JPQL (83)13.1.大小写敏感性 (85)13.2.语句(Stataement)类型 (85)13.2.1.Select语句 (86)13.2.2.Update语句 (86)13.2.3.Delete语句 (88)13.2.4.Insert语句 (88)13.3.FROM子句 (89)13.3.1.标识变量 (89)13.3.2.Root(根)实体引用 (90)13.3.3.显式join (91)13.3.4.隐式join(path表达式) (93)13.3.5.集合成员引用 (95)13.3.6.Polymorphism(多态) (97)13.4.表达式 (98)13.4.1.标识变量 (98)13.4.2.路径表达式 (98)13.4.3.文本说明 (98)13.4.4.参数 (100)13.4.5.算术运算 (101)13.4.6.Concatenation(串联)(运算) (102) 13.4.7.聚合函数 (103)13.4.8.Scalar(标量)函数 (103)13.4.9.集合相关的表达式 (106)13.4.10.实体类型 (108)13.4.11.CASE表达式 (109)13.5.SELECT子句 (111)13.6.Predicates(谓词) (112)13.6.1.关系比较 (112)13.6.2.空值谓词 (114)13.6.3.Like谓词 (114)13.6.4.Between谓词 (115) 13.6.5.In谓词 (116)13.6.6.Exists谓词 (118)13.6.7.空集合谓词 (118)13.6.8.集合成员谓词 (118)13.6.9.NOT谓词 (119)13.6.10.AND谓词 (119)13.6.11.OR谓词 (119)13.7.WHERE子句 (119)13.8.分组 (119)13.9.排序 (120)13.10.查询API (121)13.10.1.Hibernate查询API (121) 13.10.2.JPA查询API (125)第14章Criteria (128)14.1.类型化criteria查询 (130) 14.1.1.选择一个实体 (130)14.1.2.选择一个表达式 (131) 14.1.3.选择多个值 (131)14.1.4.选择wrapper(封装) (133) 14.2.Tuple criteria查询 (134) 14.3.FROM子句 (135)14.3.1.Roots(根) (136)14.3.2.Joins (137)14.3.3.抓取 (138)14.4.路径表达式 (139)14.5.使用参数 (139)第15章Native SQL查询(原生SQL查询,本地SQL查询)(139)15.1.使用SQLQuery (140)15.1.1.Scalar(标量)查询 (140)15.1.2.实体查询 (141)15.1.3.处理association(关联)与集合 (142)15.1.4.返回多个实体 (143)15.1.5.返回非托管实体 (146)15.1.6.处理继承 (147)15.1.7.参数 (147)15.2.命名SQL查询 (147)15.2.1.使用return-property显式指定列与别名 (155)15.2.2.使用存储过程查询 (157)15.3.自定义新建、更新、删除的SQL语句 (158)15.4.自定义SQL加载 (162)Chapter16.Multi-tenancy(多租户) (163)16.1.什么是Multi-tenancy(多租户) (163)16.2.多租户数据处理方法 (164)16.2.1.Separate databa(独立数据库) (164)16.2.2.独立的schema (165)16.2.3.数据分区(鉴别器) (166)16.3.Hibernate中的Multi-tenancy(多租户) (167)16.3.1.MultiTenantConnectionProvider (168)16.3.2.CurrentTenantIdentifierResolver (169)16.3.3.缓冲 (169)16.3.4.杂项 (170)16.4.MultiTenantConnectionProvider实现策略 (170)第17章OSGi (173)17.1.OSGi规范与环境 (174)17.2.hibernate-osgi (174)17.3.features.xml (174)17.4.快速入门与演示 (175)17.5.容器管理的JPA (175)17.5.1.企业级OSGi的JPA容器 (175)17.5.2.persistence.xml (176)17.5.3.DataSource(数据源) (176)17.5.4.Bundle包的导入 (177)17.5.5.获取EntityManger(实体管理器) (177) 17.6.非托管JPA (178)17.6.1.persistence.xml (178)17.6.2.Bundle包的导入 (178)17.6.3.获取EntityMangerFactory (179)17.7.非托管Native (180)17.7.1.Bundle包的导入 (180)17.7.2.获取SessionFactory (180)17.8.可选模块 (181)17.9.扩展点 (181)17.10.附加说明 (183)第18章Envers (184)18.1.基础知识 (185)18.2.配置 (186)18.3.额外的映射注释 (189)18.4.选择audit策略 (190)18.5.版本日志 (190)版本日志的数据 (190)18.5.1.在版本控制中跟踪修改的实体名 (193) 18.6.在属性级别上跟踪实体变化 (196)18.7.查询 (197)18.7.1.指定一个版本查询类的实体 (197)18.7.2.按实体类的变化,查询版本 (198)18.7.3.通过指定属性的变化查询实体的版本 (199)18.7.4.按版本查询实体的修改 (200)18.8.条件audit (201)18.9.理解Envers Schema (202)18.10.使用Ant生成schema (203)18.11.映射异常 (205)18.11.1.现在不会将来也不会支持的 (205)18.11.2.现在不会将来会支持的 (205)18.11.3.@OneToMany+@JoinColumn (205)18.12.高级:Audit表分区 (206)18.12.1.audit表分区的好处 (206)18.12.2.选择合适的列为audit表分区 (206)18.12.3.Audit表分区示例 (207)18.13.Envers有关的链接 (209)第19章.数据库可移植性思考 (210)19.1.可移植性基础 (210)19.2.Dialect(方言) (210)19.3.Dialect(方言)解析 (210)19.4.标识符生成 (211)19.5.数据库函数 (212)19.6.类型映射 (213)附录A Legacy Bootstrapping(过时的引导方式) (213) A.1.迁移 (214)附录B Legacy(过时的)Hibernate Criteria查询 (216) B.1.建立Criteria实例 (217)B.2.减小结果集 (217)B.3.排序结果集 (218)B.4.关联 (219)B.5.动态关联抓取 (220)ponents(组件) (220)B.7.集合 (221)B.8.Example查询 (221)B.9.Projections(投影),聚合与分组 (222)B.10.Detached queries(分离式查询)与子查询 (224)B.11.通过natural(自然)ID查询 (226)参考 (227)序言面向对象的开发在处理关系型数据库中的数据时是非常麻烦与消耗资源的。
SpringMVC的搭建一直以来接触到的都是SSH的框架,形成了MVC模式,本来并没有想着去弄另一个MVC模式,但现在springMVC模式很热,所以我也学习一下,首先我声明一下,这个框架我也是在网上找了一些资料才完成的,源文件等也是利用的网上的现成的,但是有对其进行修改。
下面来详细的说一说这个模式的搭建。
首先在spring中是以controller来作为控制器(相当于SSH中的action),其他的和SSH框架没有区别。
因为Spring是基于注解的,所以在整个的模式中都是采用注解的方式来处理,这个项目是用springMVC+hibernate一起来搭建的。
这个项目的搭建我花了很久的时间,也弄了蛮久才成功,希望日后能更加完善!理解更加的深入。
一:整体框架的结构图以及所需的jar包。
这里spring是3.0.1,hibernate是用的3.6,数据库是用的mysql 5.6 ,前提工作是要建立好一个数据库,我这里是名为springmvc的数据库来进行操作,这里是采用的hibernate自动更新的方式,所以可以不需要建表只需要建立起数据库就好。
项目框架的代码结构:二:开始搭建环境。
1,首先把上面所需的包添加进来后,我们要在/WEB-INF目录下的web.xml里面添加spring的监听器,以及相关的配置。
源码如下:<?xml version="1.0"encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><display-name>s3h3</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value> </context-param><listener><listener-class>org.springframework.web.context.ContextLoaderList ener</listener-class></listener><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</se rvlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name><!-- 这里在配成spring,下边也要写一个名为spring-servlet.xml的文件,主要用来配置它的controller --> <url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list></web-app>2,接下来可以编写spring的配置文件,来整合hibernate,主要的配置写在一个专门存放配置文件的源码目录下config文件夹下,这里的applicationContext.xml是spring的主要配置文件,包括数据源等的配置。
《轻量级Java EE应用开发》课程标准一、课程定位(概述)该课程是软件技术专业(软件与设计开发专业方向)的一门专业核心课程,是培养学生成为一名java 软件设计师的一门重要课程。
通过对市场的调研和本专业毕业生的交流,并对企业级软件开发相关工作岗位进行深入的剖析,掌握相关工作岗位的典型工作任务和核心技能,确定本课程是培养学生成为软件企业高技能人才所必备的职业能力的核心课程。
目标是让学生掌握主流的框架技术,能够运用Struts2、Hibernate、Spring框架进行项目的开发,重点培养学生能够开发基于Java EE框架的应用系统的职业能力。
其前导课程为《Java SE》、《网页制作基础》、《CSS+DIV》和《数据库SQL》。
二、设计思路(一)课程设置的依据该课程总体设计思路是以岗位面向为依据、以就业为导向、以能力培养为目标、以项目引领式教学为手段,依据当前企业在软件开发过程中应用到的常用三大框架技术(Struts2、Hibernate、Spring)进行教学内容的规划,主要采用项目驱动的教学方法对教学活动进行全面实施,通过项目式教学让学生更好地掌握常用三大框架技术(Struts2、Hibernate、Spring)相关知识及应用。
以完整的项目开发案例作为每个框架技术学习的对象,通过一个项目由浅到深、由模块到整体结构的逐步深入,组织学生完成这些相应的项目内容来学习相关的知识、培养相应的职业能力、掌握常用三大框架技术(Struts2、Hibernate、Spring)的应用能力和企业级软件开发的能力。
(二)课程内容确定依据该门课程的总学时为108。
以基于工作过程的课程开发理念为指导,以职业能力培养和职业素养养成为重点,根据技术领域和职业岗位(群)的任职要求,融合软件设计师职业资格标准,以三大框架在企业级软件开发的整个流程作为典型工作过程,对课程内容进行序化。
通过教学模式设计、教学方法设计、教学手段的灵活运用、教学目标的开放性设计、教学考核方法改革等,保证了学生专业能力、方法能力和社会能力的全面培养。
达梦数据库的使用及整合SSH达梦数据库(Dameng Database)是中国自主研发的一种高性能、高可用、高可靠的企业级数据库管理系统。
它提供了丰富的数据库功能和性能优化技术,支持海量数据的存储和处理,广泛应用于银行、保险、电信、能源等各行各业。
本文将介绍达梦数据库的使用以及与SSH(Spring+Struts2+Hibernate)整合的方法。
一、达梦数据库的使用1.安装达梦数据库2.创建数据库使用达梦数据库提供的客户端工具(如DM SQL Studio),连接到数据库服务器,创建新的数据库。
可以使用SQL语句或图形界面进行数据库的创建,如:```CREATE DATABASE mydb;```3.创建表和插入数据在创建好的数据库中,创建表并插入数据。
可以使用SQL语句或图形界面进行表的创建和数据的插入,如:```CREATE TABLE mytableid INT PRIMARY KEY,name VARCHAR(50)INSERT INTO mytable (id, name) VALUES (1, 'Alice');INSERT INTO mytable (id, name) VALUES (2, 'Bob');```4.执行查询使用达梦数据库提供的客户端工具,执行查询语句查看数据。
可以使用SQL语句或图形界面进行查询,如:```SELECT * FROM mytable;```执行以上查询语句后,将会显示表中的所有数据。
二、达梦数据库与SSH的整合1.引入达梦数据库的驱动在SSH项目的pom.xml文件中,添加达梦数据库的驱动依赖,例如:```<dependency><artifactId>dmjdbc</artifactId><version>7.2</version></dependency>```2.配置数据源在项目的配置文件(如jdbc.properties)中,配置达梦数据库的连接信息,例如:```jdbc.url=jdbc:dm://localhost:5236/mydbername=your_usernamejdbc.password=your_password```3. 配置Hibernate在项目的配置文件(如hibernate.cfg.xml)中,配置Hibernate的相关信息,例如:```<propertyname="hibernate.dialect">org.hibernate.dialect.DmDialect</proper ty><propertyname="hibernate.connection.url">jdbc:dm://localhost:5236/mydb</p roperty><propertyname="ername">your_username</property> <propertyname="hibernate.connection.password">your_password</property> ```4.编写DAO层代码在SSH项目中,编写DAO层的代码,用于与达梦数据库进行交互。
文章编号:2095-6835(2022)17-0143-03基于Web的气象雷达岗位电子化信息管理系统韩志平(民航华北地区空中交通管理局,北京100621)摘要:主要介绍了基于Web技术、采用Java语言的气象雷达岗位电子化信息管理系统的设计和实现。
系统包括设备运行管理、值班日志管理、零备件管理、系统框架设计、前端网页设计、后台数据处理等。
系统使用了成熟的SSH框架,呈现层采用了JSP动态网页技术,页面用到了CSS(层叠样式表)以及JavaScript技术,系统数据库使用了通用MYSQL数据库,系统界面设计人性化,操作简单,能满足一线岗位人员实际工作需求。
关键词:WEB技术;JAV A;SSH框架;信息管理系统中图分类号:P415.2;TP31文献标志码:A DOI:10.15913/ki.kjycx.2022.17.0441研究背景Java是一种面向对象的程序设计语言,由于其跨平台的优点,使得Java的发展特别迅速,尤其是在网络方面的发展[1]。
进入21世纪,计算机技术迅速向着网络化、集成化方向发展。
传统的单机版应用软件正在逐渐退出舞台,取而代之的是支持网络、支持多种数据信息(多媒体)的新一代网络版应用软件。
本文所采用的是称为浏览器-服务器的B/S结构应用系统,它的特点是在客户端采用了功能强大的浏览器软件作为界面,其优点在于软件开发效率高,客户端不受操作平台的限制,也不受地域的限制,网络传输量少,适用于局域网。
B/S结构下,利用成熟的WWW浏览器技术,结合浏览器的多种Script语言技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。
气象雷达岗位值班日志记录的完整性、及时性对电子值班日志的设计提出了新的需求,设备运行情况、零备件管理等电子化、简便化也是大势所趋。
开发一套气象雷达岗位电子化信息管理系统,作为设备运行中一个补充应用系统,大大减轻了值班人员的压力,便于设备管理,提升服务质量。
2016年最新版JavaEE学科课程大纲黑马程序员官网2016年最新版JavaEE学科课程大纲一、JavaWeb部分第一阶段:JavaWEB 部分一之WEB前端技术1、Html了解HTML语言,HTML语言背景知识,掌握HTML 的整体结构、文件标签、排版标签、块标签、字体标签、列表标签、图形标签、超链接标签、表格标签、表单标签(form 标签、input标签、select标签等)、分区标签、头标签。
(1)CSSCSS介绍、CSS导入方式(内部样式表、内联样式表、外部样式表)、五大CSS选择器(ID选择器、类选择器、元素选择器、属性选择器、伪类等)、样式属性介绍。
(2)JavaScript基础JavaScript编程,JavaScript语法、数据类型、运算符、表达式、流程控制,JavaScript内部对象、数组、字符串、日期时间、数学函数、正则表达式,JavaScript函数、自定义函数、全局函数,BOM介绍、window 对象、location对象、history对象使用。
DHTML编程,理解DOM树,DOM对象,常用DOM对象的属性、方法和事件,编写事件处理程序、使用DOM操作HTML文档、遍历文档树上的节点、搜索文档中特定的元素、修改文档内容、往文档添加新内容、使用DOM操作XML文档。
(3)JQuery基础认识JQuery、选择器介绍、css选择器、jQuery选择器及其优势势、基本选择器、层次选择器、过滤选择器、表单选择器、选择器练习小案例等;JQuery操作DOM:DOM分类、查找元素/属性节点、创造元素/属性/文本节点、插入节点、删除节点、复制节点、替换节点、包裹节点、属性操作、样式操作、遍历节点、CSS-DOM操作;动画和事件:jQuery中的事件、加载DOM、事件绑定、合成事件、事件冒泡、事件对象的属性、移除按钮上注册的事件、模拟操作、JQuery中的动画。
(4)BootStrap响应式页面的的开发与设计,强大的栅格布局,内置的CSS类库,JS插件,快速布局商城页面。
Spring 4 整合Hibernate 5 技术在J2EE开发平台中,spring是一种优秀的轻量级企业应用解决方案。
Spring的核心技术就是IOC控制反转和AOP面向切面编程技术。
下面给出一个项目代码示例对Sping的相关技术进行讲解,该项目代码整合了最新的Spring4.2.5和Hibernate5.1技术,项目代码结构图如下:下面给出详细配置代码[html]view plain copy1.package com.kj.test.domain;2.3.import java.io.Serializable;4.5./**6. * 用户实体类7. * @author KJ8. *9. */10.public class User implements Serializable{11.12. private static final long serialVersionUID = 7178219894611819140L;13. /** 性别 */14. public static final int MAN = 1; //男15. public static final int FEMAN = 2; //女16.17. private Long id;18. /** 姓名 */19. private String name;20. /** 性别 */21. private Integer sex;22. /** 年龄 */23. private Integer age;24.25. public User () {26.27. }28.29. public User (Long id) {30.this.id = id;31. }32.33. public Long getId() {34. return id;35. }36.37. public void setId(Long id) {38.this.id = id;39. }40.41. public String getName() {42. return name;43. }44.45. public void setName(String name) { = name;47. }48.49. public Integer getSex() {50. return sex;51. }52.53. public void setSex(Integer sex) {54.this.sex = sex;55. }56.57. public Integer getAge() {58. return age;59. }60.61. public void setAge(Integer age) {62.this.age = age;63. }64.65.66.}[html]view plain copy1.package com.kj.test.domain;2.3./**4. * 学生实体类5. * @author KJ6. *7. */8.public class Student extends User {9.10. private static final long serialVersionUID = 7178219894611868560L;11.12. /** 学号 */13. private String studentId;14. /** 班级 */15. private NaturalClass naturalClass;16. /**学生信息修改*/17. private StudentInfoModify studentInfoModify;18.19. public Student () {20.21. }22.23. public String getStudentId() {24. return studentId;25. }26.27. public void setStudentId(String studentId) {28.this.studentId = studentId;29. }30.31. public NaturalClass getNaturalClass() {32. return naturalClass;33. }34.35. public void setNaturalClass(NaturalClass naturalClass) {36.this.naturalClass = naturalClass;37. }38.39. public StudentInfoModify getStudentInfoModify() {40. return studentInfoModify;41. }42.43. public void setStudentInfoModify(StudentInfoModify studentInfoModify) {44.this.studentInfoModify = studentInfoModify;45. }46.47.}[html]view plain copy1.package com.kj.test.domain;2.3.import java.io.Serializable;4.import java.util.HashSet;5.import java.util.Set;6.7./**8. * 班级实体类9. * @author KJ10. *11. */12.public class NaturalClass implements Serializable{13.14. private static final long serialVersionUID = 7178219894611819142L;15.16. private Long id;17. /** 名称 */18. private String name;19. /** 学生列表 */20. private Set<Student>students = new HashSet<Student>();21.22. public NaturalClass () {23.24. }25.26. public Long getId() {27. return id;28. }29.30. public void setId(Long id) {31.this.id = id;32. }33.34. public String getName() {35. return name;36. }37.38. public void setName(String name) { = name;40. }41.42. public Set<Student> getStudents() {43. return students;44. }45.46. public void setStudents(Set<Student> students) {47.this.students = students;48. }49.50.}[html]view plain copy1.package com.kj.test.domain;2.3.import java.io.Serializable;4.5./**6. * 学生基本信息修改,信息修改后,需要经过管理员审核,审核通过后方可更新到Student学生实体类中7. * @author KJ8. *9. */10.public class StudentInfoModify implements Serializable {11.12. private static final long serialVersionUID = -2705163477469273274L;13. /** 性别 */14. public static final int MAN = 1; //男15. public static final int FEMAN = 2; //女16.17. private Long id;18. /** 对应学生 */19. private Student student;20. /** 姓名 */21. private String name;22. /** 性别 */23. private Integer sex;24. /** 年龄 */25. private Integer age;26. /** 学号 */27. private String studentId;28. /** 班级 */29. private NaturalClass naturalClass;30.31. public StudentInfoModify() {32.33. }34.35. public StudentInfoModify(Long id) {36.this.id = id;37. }38.39. public Long getId() {40. return id;41. }42.43. public void setId(Long id) {44.this.id = id;45. }46.47. public Student getStudent() {48. return student;49. }50.51. public void setStudent(Student student) {52.this.student = student;53. }54.55. public String getName() {56. return name;57. }58.59. public void setName(String name) { = name;61. }62.63. public Integer getSex() {64. return sex;65. }66.67. public void setSex(Integer sex) {68.this.sex = sex;69. }70.71. public Integer getAge() {72. return age;73. }74.75. public void setAge(Integer age) {76.this.age = age;77. }78.79. public String getStudentId() {80. return studentId;81. }82.83. public void setStudentId(String studentId) {84.this.studentId = studentId;85. }86.87. public NaturalClass getNaturalClass() {88. return naturalClass;89. }90.91. public void setNaturalClass(NaturalClass naturalClass) {92.this.naturalClass = naturalClass;93. }94.95.}User.hbm.xml[html]view plain copy1.<?xml version="1.0"?>2.<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"3."/hibernate-mapping-3.0.dtd">4.<hibernate-mapping>5.<class name="er"table="User">6.<id name="id"column="id">7.<generator class="native"/>8.</id>9.<property name="name"column="name"lazy="false"></property>10.<property name="sex"column="sex"lazy="false"></property>11.<property name="age"column="age"lazy="false"></property>12.</class>13.</hibernate-mapping>Student.hbm.xml[html]view plain copy1.<?xml version="1.0"?>2.<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"3."/hibernate-mapping-3.0.dtd">4.<hibernate-mapping>5.<!-- 继承类的配置:Student实体类继续User类 -->6.<joined-subclass name="com.kj.test.domain.Student"extends="com.kj.test.er"table="Student">7.<key column="id"></key>8.<property name="studentId"column="studentId"lazy="false"></property>9.<!-- 双向多对一关系:通过hibernate既可以从主控方实体加载被控方的实体,也可以从被控方加载对应的主控方实体 -->10.<many-to-one name="naturalClass"column="naturalClassId"lazy="false"></many-to-one>11. <!--12.一对一关系:13.property-ref="student"指定StudentInfoModify类中对应的属性名,lazy="proxy"指定该属性在调用的时候才会被加载,14.cascade="delete"当删除Student对象的时候,对应的studentInfoModify对象也会被级联删除15. -->16.<one-to-one name="studentInfoModify"property-ref="student"lazy="proxy"cascade="delete"></one-to-one>17.<!-- 如果是多对多关系,则新建一个类,这个类中引用多对多关系的两个类即可 -->18.</joined-subclass>19.</hibernate-mapping>StudentInfoModify.hbm.xml[html]view plain copy1.<?xml version="1.0"?>2.<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"3."/hibernate-mapping-3.0.dtd">4.<hibernate-mapping>5.<class name="com.kj.test.domain.StudentInfoModify"table="StudentInfoModify">6.<id name="id"column="id">7.<generator class="native"></generator>8.</id>9.<property name="name"column="name"lazy="false"></property>10.<property name="sex"column="sex"lazy="false"></property>11.<property name="age"column="age"lazy="false"></property>12.<property name="studentId"column="studentId"lazy="false"></property>13.<!-- 单向多对一关联:只能通过主控方加载被控方数据,其中StudentInfoModify实体类是主控方 -->14.<many-to-one name="naturalClass"column="naturalClassId"lazy="false"></many-to-one>15.<!-- 一对一关联 -->16.<many-to-one name="student"column="stuId"unique="true"not-null="true"lazy="false"></many-to-one>17.</class>18.</hibernate-mapping>NaturalClass.hbm.xml[html]view plain copy1.<?xml version="1.0"?>2.<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"3."/hibernate-mapping-3.0.dtd">4.<hibernate-mapping>5.<class name="com.kj.test.domain.NaturalClass"table="NaturalClass">6.<id name="id"column="id">7.<generator class="native"/>8.</id>9.<property name="name"column="name"lazy="false"></property>10.<!-- 双向多对一关系:通过hibernate既可以从主控方实体加载被控方的实体,也可以从被控方加载对应的主控方实体 -->11.<set name="students"inverse="true"lazy="false">12.<key column="naturalClassId"></key><!-- 对应Student类中naturalClass属性对应的column值 -->13.<one-to-many class="com.kj.test.domain.Student"/>14.</set>15.</class>16.</hibernate-mapping>上面是实体类和hibernate映射文件配置接下面的是封装通用hibernate dao接口、service接口和分页工具类通用泛型dao接口类:[html]view plain copy1.package com.kj.test.dao;2.3.import java.io.Serializable;4.import java.util.Collection;5.import java.util.List;6.7.import com.kj.test.util.PageResults;8.import com.kj.test.util.RowMapper;9.10./**11. * @ClassName: IGenericDao12. * @Description: Dao封装接口13. * @author kj14. * @date 2016年5月2日18:00:0015. */16.public interface IGenericDao<T, ID extends Serializable> {17.18. /**19. * <保存实体>20. * <完整保存实体>21. * @param t 实体参数22. */23. public abstract void save(T t);24.25. /**26. * <保存或者更新实体>27. * @param t 实体28. */29. public abstract void saveOrUpdate(T t);30.31. /**32. * <load>33. * <加载实体的load方法>34. * @param id 实体的id35. * @return 查询出来的实体36. */37. public abstract T load(ID id);38.39. /**40. * <get>41. * <查找的get方法>42. * @param id 实体的id43. * @return 查询出来的实体44. */45. public abstract T get(ID id);46.47. /**48. * <contains>49. * @param t 实体50. * @return 是否包含51. */52. public abstract boolean contains(T t);53.54. /**55. * <delete>56. * <删除表中的t数据>57. * @param t 实体58. */59. public abstract void delete(T t);60.61. /**62. * <根据ID删除数据>63. * @param Id 实体id64. * @return 是否删除成功65. */66. public abstract boolean deleteById(ID Id);67.68. /**69. * <删除所有>70. * @param entities 实体的Collection集合71. */72. public abstract void deleteAll(Collection<T> entities);73.74. /**75. * <执行Hql语句>76. * @param hqlString hql77. * @param values 不定参数数组78. */79. public abstract void queryHql(String hqlString, Object... values);80.81. /**82. * <执行Sql语句>83. * @param sqlString sql84. * @param values 不定参数数组85. */86. public abstract void querySql(String sqlString, Object... values);87.88. /**89. * <根据HQL语句查找唯一实体>90. * @param hqlString HQL语句91. * @param values 不定参数的Object数组92. * @return 查询实体93. */94. public abstract T getByHQL(String hqlString, Object... values);95.96. /**97. * <根据SQL语句查找唯一实体>98. * @param sqlString SQL语句99. * @param values 不定参数的Object数组100. * @return 查询实体101. */102. public abstract T getBySQL(String sqlString, Object... values);103.104. /**105. * <根据HQL语句,得到对应的list>106. * @param hqlString HQL语句107. * @param values 不定参数的Object数组108. * @return 查询多个实体的List集合109. */110. public abstract List<T> getListByHQL(String hqlString, Object... values );111.112. /**113. * <根据SQL语句,得到对应的list>114. * @param sqlString HQL语句115. * @param values 不定参数的Object数组116. * @return 查询多个实体的List集合117. */118. public abstract List<T> getListBySQL(String sqlString, Object... values );119.120. /**121. * 由sql语句得到List122. * @param sql123. * @param map124. * @param values125. * @return List126. */127. public List findListBySql(final String sql, final RowMapper map, final Object... values);128.129. /**130. * <refresh>131. * @param t 实体132. */133. public abstract void refresh(T t);134.135. /**136. * <update>137. * @param t 实体138. */139. public abstract void update(T t);140.141. /**142. * <根据HQL得到记录数>143. * @param hql HQL语句144. * @param values 不定参数的Object数组145. * @return 记录总数146. */147. public abstract Long countByHql(String hql, Object... values);148.149. /**150. * <HQL分页查询>151. * @param hql HQL语句152. * @param countHql 查询记录条数的HQL语句153. * @param pageNo 下一页154. * @param pageSize 一页总条数155. * @param values 不定Object数组参数156. * @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合157. */158. public abstract PageResults<T> findPageByFetchedHql(String hql, String countHql, int pageNo, int pageSize, Object... values);159.160.}通用泛型dao实现类[html]view plain copy1.package com.kj.test.dao.impl;2.3.import java.io.Serializable;4.import ng.reflect.ParameterizedType;5.import java.math.BigDecimal;6.import java.sql.Connection;7.import java.sql.PreparedStatement;8.import java.sql.ResultSet;9.import java.sql.SQLException;10.import java.sql.Timestamp;11.import java.sql.Types;12.import java.util.ArrayList;13.import java.util.Collection;14.import java.util.Date;15.import java.util.List;16.17.import org.hibernate.Query;18.import org.hibernate.ScrollableResults;19.import org.hibernate.Session;20.import org.hibernate.SessionFactory;21.import org.hibernate.jdbc.Work;22.import org.springframework.beans.factory.annotation.Autowired;23.24.import com.kj.test.dao.IGenericDao;25.import com.kj.test.util.PageResults;26.import com.kj.test.util.RowMapper;27.28./**29. * @ClassName: GenericDaoImpl30. * @Description: IGenericDao实现31. * @author kj32. * @date 2016年5月2日18:00:0033. *34. */35.@SuppressWarnings({ "rawtypes", "unchecked" })36.public class GenericDaoImpl<T, ID extends Serializable> implements IGenericDao<T, ID> {37.38. @Autowired39. private SessionFactory sessionFactory;40. protected Class<T> entityClass;41.42. public GenericDaoImpl() {43.44. }45.46. protected Class getEntityClass() {47. if (entityClass == null) {48.entityClass = (Class<T>) ((ParameterizedType) getClass()49. .getGenericSuperclass()).getActualTypeArguments()[0];50. }51. return entityClass;52. }53.54. /**55. * <保存实体><完整保存实体>56. *57. * @param t58. * 实体参数59. * @see uncher.util.IBaseDao#save(ng.Object)60. */61. @Override62. public void save(T t) {63. this.getSession().save(t);64. }65.66. /**67. * <保存或者更新实体>68. *69. * @param t70. * 实体71. * @see uncher.util.IBaseDao#saveOrUpdate(ng.Object)72. */73. @Override74. public void saveOrUpdate(T t) {75. this.getSession().saveOrUpdate(t);76. }77.78. /**79. * <load><加载实体的load方法>80. *81. * @param id82. * 实体的id83. * @return 查询出来的实体84. * @see uncher.util.IBaseDao#load(java.io.Serializable)85. */86. @Override87. public T load(ID id) {88. T load = (T) this.getSession().load(getEntityClass(), id);89. return load;90. }91.92. /**93. * <get><查找的get方法>94. *95. * @param id96. * 实体的id97. * @return 查询出来的实体98. * @see uncher.util.IBaseDao#get(java.io.Serializable)99. */100. @Override101. public T get(ID id) {102. T load = (T) this.getSession().get(getEntityClass(), id);103. return load;104. }105.106. /**107. * <contains>108. *109. * @param t110. * 实体111. * @return 是否包含112. * @see uncher.util.IBaseDao#contains(ng.Object) 113. */114. @Override115. public boolean contains(T t) {116. return this.getSession().contains(t);117. }118.119. /**120. * <delete><删除表中的t数据>121. *122. * @param t123. * 实体124. * @see uncher.util.IBaseDao#delete(ng.Object) 125. */126. @Override127. public void delete(T t) {128. this.getSession().delete(t);129. }130.131. /**132. * <根据ID删除数据>133. *134. * @param Id135. * 实体id136. * @return 是否删除成功137. * @see uncher.util.IBaseDao#deleteById(java.io.Serializable)138. */139. @Override140. public boolean deleteById(ID Id) {141. T t = get(Id);142. if (t == null) {143. return false;144. }145. delete(t);146. return true;147. }148.149. /**150. * <删除所有>151. *152. * @param entities153. * 实体的Collection集合154. * @see uncher.util.IBaseDao#deleteAll(java.util.Collection)155. */156. @Override157. public void deleteAll(Collection<T> entities) {158. for (Object entity : entities) {159. this.getSession().delete(entity);160. }161. }162.163. /**164. * <执行Hql语句>165. *166. * @param hqlString167. * hql168. * @param values169. * 不定参数数组170. * @see uncher.util.IBaseDao#queryHql(ng.String, 171. * ng.Object[])172. */173. @Override174. public void queryHql(String hqlString, Object... values) {175. Query query = this.getSession().createQuery(hqlString);176. if (values != null) {177. for (int i = 0; i <values.length; i++) {178. query.setParameter(i, values[i]);179. }180. }181. query.executeUpdate();182. }183.184. /**185. * <执行Sql语句>186. *187. * @param sqlString188. * sql189. * @param values190. * 不定参数数组191. * @see uncher.util.IBaseDao#querySql(ng.String, 192. * ng.Object[])193. */194. @Override195. public void querySql(String sqlString, Object... values) {196. Query query = this.getSession().createSQLQuery(sqlString); 197. if (values != null) {198. for (int i = 0; i <values.length; i++) {199. query.setParameter(i, values[i]);200. }201. }202. query.executeUpdate();203. }204.205. /**206. * <根据HQL语句查找唯一实体>207. *208. * @param hqlString209. * HQL语句210. * @param values211. * 不定参数的Object数组212. * @return 查询实体213. * @see uncher.util.IBaseDao#getByHQL(ng.String, 214. * ng.Object[])215. */216. @Override217. public T getByHQL(String hqlString, Object... values) {218. Query query = this.getSession().createQuery(hqlString); 219. if (values != null) {220. for (int i = 0; i <values.length; i++) {221. query.setParameter(i, values[i]);222. }223. }224. return (T) query.uniqueResult();225. }226.227. /**228. * <根据SQL语句查找唯一实体>229. *231. * SQL语句232. * @param values233. * 不定参数的Object数组234. * @return 查询实体235. * @see uncher.util.IBaseDao#getBySQL(ng.String, 236. * ng.Object[])237. */238. @Override239. public T getBySQL(String sqlString, Object... values) {240. Query query = this.getSession().createSQLQuery(sqlString);241. if (values != null) {242. for (int i = 0; i <values.length; i++) {243. query.setParameter(i, values[i]);244. }245. }246. return (T) query.uniqueResult();247. }248.249. /**250. * <根据HQL语句,得到对应的list>251. *252. * @param hqlString253. * HQL语句254. * @param values255. * 不定参数的Object数组256. * @return 查询多个实体的List集合257. * @see uncher.util.IBaseDao#getListByHQL(ng.String, 258. * ng.Object[])259. */260. @Override261. public List<T> getListByHQL(String hqlString, Object... values) { 262. Query query = this.getSession().createQuery(hqlString);263. if (values != null) {264. for (int i = 0; i <values.length; i++) {265. query.setParameter(i, values[i]);266. }267. }268. return query.list();269. }270.271. /**272. * <根据SQL语句,得到对应的list>273. *275. * HQL语句276. * @param values277. * 不定参数的Object数组278. * @return 查询多个实体的List集合279. * @see uncher.util.IBaseDao#getListBySQL(ng.String, 280. * ng.Object[])281. */282. @Override283. public List<T> getListBySQL(String sqlString, Object... values) { 284. Query query = this.getSession().createSQLQuery(sqlString);285. if (values != null) {286. for (int i = 0; i <values.length; i++) {287. query.setParameter(i, values[i]);288. }289. }290. return query.list();291. }292.293. /**294. * 由sql语句得到List295. *296. * @param sql297. * @param map298. * @param values299. * @return List300. * @see uncher.util.IBaseDao#findListBySql(ng.String,301. * uncher.util.RowMapper, ng.Object[])302. */303. @Override304. public List findListBySql(final String sql, final RowMapper map, 305. final Object... values) {306. final List list = new ArrayList();307. // 执行JDBC的数据批量保存308. Work jdbcWork = new Work() {309. public void execute(Connection connection) throws SQLException {310. PreparedStatement ps = null;311. ResultSet rs = null;312. try {313.ps = connection.prepareStatement(sql);314. for (int i = 0; i <values.length; i++) {315. setParameter(ps, i, values[i]);316. }317.rs = ps.executeQuery();318. int index = 0;319. while (rs.next()) {320. Object obj = map.mapRow(rs, index++);321. list.add(obj);322. }323. } finally {324. if (rs != null) {325. rs.close();326. }327. if (ps != null) {328. ps.close();329. }330. }331. }332. };333. this.getSession().doWork(jdbcWork);334. return list;335. }336.337. /**338. * <refresh>339. *340. * @param t341. * 实体342. * @see uncher.util.IBaseDao#refresh(ng.Object) 343. */344. @Override345. public void refresh(T t) {346. this.getSession().refresh(t);347. }348.349. /**350. * <update>351. *352. * @param t353. * 实体354. * @see uncher.util.IBaseDao#update(ng.Object) 355. */356. @Override357. public void update(T t) {358. this.getSession().update(t);359. }360.361. /**362. * <根据HQL得到记录数>363. *364. * @param hql365. * HQL语句366. * @param values367. * 不定参数的Object数组368. * @return 记录总数369. * @see uncher.util.IBaseDao#countByHql(ng.String, 370. * ng.Object[])371. */372. @Override373. public Long countByHql(String hql, Object... values) {374. Query query = this.getSession().createQuery(hql);375. if (values != null) {376. for (int i = 0; i <values.length; i++) {377. query.setParameter(i, values[i]);378. }379. }380. return (Long) query.uniqueResult();381. }382.383. /**384. * <HQL分页查询>385. *386. * @param hql387. * HQL语句388. * @param countHql389. * 查询记录条数的HQL语句390. * @param pageNo391. * 下一页392. * @param pageSize393. * 一页总条数394. * @param values395. * 不定Object数组参数396. * @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合397. * @see uncher.util.IBaseDao#findPageByFetchedHql(ng.S tring,398. * ng.String, int, int, ng.Object[])399. */400. @Override401. public PageResults<T> findPageByFetchedHql(String hql, String countHql,402. int pageNo, int pageSize, Object... values) {403. PageResults<T>retValue = new PageResults<T>();404. Query query = this.getSession().createQuery(hql);405. if (values != null) {406. for (int i = 0; i <values.length; i++) {407. query.setParameter(i, values[i]);408. }409. }410. int currentPage = pageNo> 1 ? pageNo : 1;411. retValue.setCurrentPage(currentPage);412. retValue.setPageSize(pageSize);413. if (countHql == null) {414. ScrollableResults results = query.scroll();415. st();416. retValue.setTotalCount(results.getRowNumber() + 1);// 设置总记录数417. } else {418. Long count = countByHql(countHql, values);419. retValue.setTotalCount(count.intValue());420. }421. retValue.resetPageNo();422. List<T>itemList = query.setFirstResult((currentPage - 1) * pageSize)423. .setMaxResults(pageSize).list();424. if (itemList == null) {425.itemList = new ArrayList<T>();426. }427. retValue.setResults(itemList);428.429. return retValue;430. }431.432. /**433. * @return the sessionFactory434. */435. public SessionFactory getSessionFactory() {436. return sessionFactory;437. }438.439. /**440. * @param sessionFactory441. * the sessionFactory to set442. */443. public void setSessionFactory(SessionFactory sessionFactory) {444.this.sessionFactory = sessionFactory;445. }446.447. /**448. *449. * @return session450. */451. public Session getSession() {452. // 需要开启事物,才能得到CurrentSession453. return sessionFactory.getCurrentSession();454. }455.456. /**457. *458. * 设置每行批处理参数459. *460. * @param ps461. * @param pos462. * ?占位符索引,从0开始463. * @param data464. * @throws SQLException465. * @see [类、类#方法、类#成员]466. */467. private void setParameter(PreparedStatement ps, int pos, Object data) 468. throws SQLException {469. if (data == null) {470. ps.setNull(pos + 1, Types.VARCHAR);471. return;472. }473. Class dataCls = data.getClass();474. if (String.class.equals(dataCls)) {475. ps.setString(pos + 1, (String) data);476. } else if (boolean.class.equals(dataCls)) {477. ps.setBoolean(pos + 1, ((Boolean) data));478. } else if (int.class.equals(dataCls)) {479. ps.setInt(pos + 1, (Integer) data);480. } else if (double.class.equals(dataCls)) {481. ps.setDouble(pos + 1, (Double) data);482. } else if (Date.class.equals(dataCls)) {483. Date val = (Date) data;484. ps.setTimestamp(pos + 1, new Timestamp(val.getTime()));485. } else if (BigDecimal.class.equals(dataCls)) {486. ps.setBigDecimal(pos + 1, (BigDecimal) data);487. } else {488. // 未知类型489. ps.setObject(pos + 1, data);490. }491.492. }493.494.}service层接口package com.kj.test.service;import com.kj.test.dao.IGenericDao;import er;/*** 用户操作service接口* @author kj*/public interface IUserService extends IGenericDao<User, Long>{//该接口继承了IGenericDao通用接口的所有抽象方法,另可自行定义所需方法}service层实现类package com.kj.test.service.impl;import com.kj.test.dao.impl.GenericDaoImpl;import er;import com.kj.test.service.IUserService;/*** 用户操作service实现类。