Spring 4 整合 Hibernate 5 技术

合集下载

Hibernate+Spring多数据库解决方案

Hibernate+Spring多数据库解决方案

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 配置详解

spring4.x + hibernate4.x 配置详解

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:指定当前方法必需在事务环境中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果当前没有事务,就新建一个事务。

Springboot+SpringCloud实战(微课版)06-第六章

Springboot+SpringCloud实战(微课版)06-第六章
① 在pom.xml文件中导入JPA依赖,如程序清单6-20所示。
Springboot整合JPA
② 在application.yml文件中配置数据源信息和JPA信息,其中JPA配置中的hibernate配置 ddl-auto: update表示会根据@Entity实体类自动更新数据库表的结构,如程序清单6-21所 示。
① 在pom.xml文件中添加Druid依赖。 ② 在application.yml文件中通过type属性配置使用的数据源为DruidDataSource
SpringBoot整合数据源
SpringBoot整合数据源
③ 创建一个配置类DataSourceConfig并添加@Configuration注解,使用@Bean注解在Spring容 器中创建一个DataSource Bean 进行管理,如程序清单6-10所示。
SpringBoot整合数据源
2.添加配置 数据源相关配置可以在核心配置文件application.properties中配置(如程序清单6-2所示),也可以 在application.yml文件中配置(如程序清单6-3所示)。
SpringBoot整合数据源
补充说明:数据源的driverClassName 会根据mysql-connector-java依赖的版本而变化,在mysqlconnector-java 5中driverClassName 为com.mysql.jdbc.Driver,而在mysql-connectorjava 6及以上版本中driverClassName 为com.mysql.cj.jdbc.Driver,并且要求在url中需要配置 serverTimezone(时区信息),serverTimezone可配置UTC、Asia/Shanghai等。配置完以上信息 之后,我们就可以在代码中使用默认的数据源进行数据库的相关操作。

javaweb课程设计ssh

javaweb课程设计ssh

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教材,作为学生学习的基础。

JAVA培训机构教学大纲

JAVA培训机构教学大纲
Linux的RPM软件包管理:RPM包的介绍、RPM安装、卸载等操作
Linux网络:Linux网络的介绍、Linux网络的配置和维护
Linux上常见软件的安装:安装JDK、安装Tomcat、安装mysql
linux部署自己的java web实战项目
14
JSON和JAVA对象互相转化
JSON/GSON等类库
3
Struts2
55口弋$2核心控制流程、Ognl、Ation、Interceptor、Result、FreeMarker、Struts2标记、
Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提 交等)。Sptring整合Struts
4
Hibernate
ORM概念、Hibernate核心API、Hibernate实体映射技巧、HQL查询、OSCache及Hibernate缓存技术;Spring整合Hibernate
3
数据库设计
设计的三大范式;PowerDesigner的使用;
4
JDBC技术
JDBC基础;Statement、PreparedStatement、ResultSet结果集对象等。
5
数据库连接池技术
Pool池的思想;连接池技术;C3P0、proxool连接池等;使用设计模式开发连接池;详 细扩展与测试池效率;
2
Oracle数据库
Oracle体系结构及系统管理、Oracle数据库高级编程、数据库设计基础
3
JDBC
JDBC核心API(Connection、Satement、ResultSet)、JDBC优化技术(缓存技术、批处理 技术、连接池技术)
4
Xml

轻量级Java EE企业应用实战(第3版)——Struts

轻量级Java EE企业应用实战(第3版)——Struts

目录
目录
第1章 Java EE应用和开发环境 1 1.1 Java EE应用概述 2 1.1.1 Java EE应用的分层模型 2 1.1.2 Java EE应用的组件 3 1.1.3 Java EE应用的结构和优势 4 1.1.4常用的Java EE服务器 4 1.2轻量级Java EE应用相关技术 5 1.2.1 JSP、Servlet 3.0和JavaBean及替代技术 5 1.2.2 Struts 2.2及替代技术 5 1.2.3 Hibernate 3.6及替代技术 6 1.2.4 Spring 3.0及替代技术 6
封面(1张)本书重点介绍如何整合Struts 2.2+Spring 3.0+Hibernate 3.6进行Java EE开发,主要包括三 部分。第一部分介绍Java EE开发的基础知识,以及如何搭建开发环境。第二部分详细讲解Struts 2.2、Spring 3.0和Hibernate 3.6三个框架的用法,介绍三个框架时,从Eclipse IDE的使用来上手,一步步带领读者深入三 个框架的核心。这部分内容是讲授“疯狂Java实训”的培训讲义,因此是本书的重点部分,既包含了多年开发经 历的领悟,也融入了丰富的授课经验。第三部分示范开发了一个包含7个表、表之间具有复杂的关联映射、继承映 射等关系,且业务也相对复杂的工作流案例,希望让读者理论实际,将三个框架真正运用到实际开发中去,该案 例采用目前最流行、最规范的Java EE架构,整个应用分为领域对象层、DAO层、业务逻辑层、MVC层和视图层, 各层之间分层清晰,层与层之间以松耦合的方法组织在一起。该案例既提供了IDE无关的、基于Ant管理的项目源 码,也提供了基于Eclipse IDE的项目源码,最大限度地满足读者的需求。

整合struts1+spring+hibernate框架完成简单的登录

整合struts1+spring+hibernate框架完成简单的登录

*编写环境:*开发工具: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用户手册中文版

Hibernate5用户手册中文版

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)序言面向对象的开发在处理关系型数据库中的数据时是非常麻烦与消耗资源的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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实现类。

相关文档
最新文档