- 浏览: 58674 次
- 性别:
- 来自: 厦门
文章分类
最新评论
通向架构师的道路(第二十一天)万能框架spring(三)之SSH
一、前言
我们有了Spring+JdbcTemplate和Spring+iBatis并结合maven的基础,搭建一个SSX这样的框架现在就和玩一样的简单了,今天我们将搭建一个使用Struts1.3,Srping3, Hibernate3的SSH1的开发框架,大家跟着我一步步走,会发觉在程序跑通后自己再动手搭建一遍这个框架,只需要30分钟。
二、SSH框架
仔细看这个框架,稍微有点不一样了。
1)Spring3是通过一个hibernate template来和hibernate的dao层结合起来并且管理起hibernate的相关事务的。因此我们自己写了一个BaseHibernateDaoSupport来用spring统一管理hibernate的事务。
2)Hibernate和Spring的结合非常方便,我们只需要写一个hibernate.xml就可以了,datasource.xml中把原先的iBatis的相关配置全部去掉它,什么都不需要加事务还是维持原有的配置不变即可,对于我们来说需要改动的是dao层,还有把service层稍微做些小调整(一两句话的调整,非常简单),可能是我看到过的最简单的一种SSX的结合方式,远比iBatis和spring的结合要easy多了。
3)Hibernate3开始可以使用jpa或者还是传统的hbm.xml文件这样的描述方式,在此我们坚持使用JPA的Annotation方式来声明我们的model而不是使用*.hbm.xml这样的方式。
注意:所有的包(package name)都要从原来的org.sky.ssi变成org.sky.ssh喽?
三、搭建SSH框架
3.1建立工程
我们还是使用maven来建立我们的工程,我们工程的名字叫myssh。
建完后照着翻外篇《第十九天》中的“四、如何让Maven构建的工程在eclipse里跑起来”对工程进行设置。
3.2 maven库设置
嘿嘿嘿嘿,不需要任何设置,直接把beta工程中的pom.xml文件拷贝入myssh工程中就可以用了,里面相关的spring,struts, hibernate的包我都已经事先配合了。
如果你是个图完美的的,你可以把pom.xml文件中的iBatis相关的jar给去除。
3.3 开始配置Hibernate与spring结合
打开/src/main/resources/spring/datasource下的datasource.xml,把所有的关于iBatis的设置全部去除,把org.sky.ssi这样的包名全部改成org.sky.ssh。
我们在myssh工程中需要增加一个工具类,一个xml和几个用到的hibernate的model的映射,下面来看。
src/main/resources/spring/hibernate/hibernate.xml文件
我们在src/main/resources/spring目录下增加一个目录叫hibernate,在这个hibernate目录下我们创建一个hibernate.xml文件。
其内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/dtd/spring-beans.dtd "> <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="packagesToScan" value="org.sky.ssh.dao.impl.*.*" /> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="annotatedClasses"> <list> <value>org.sky.ssh.model.TLogin</value> <value>org.sky.ssh.model.TStudent</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.generate_statistics">true</prop> <prop key="hibernate.connection.release_mode">auto</prop> <prop key="hibernate.autoReconnect">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.connection.autocommit">true</prop> </props> </property> </bean> </beans> |
<property name="packagesToScan"value="org.sky.ssh.dao.impl.*.*" />
这句就是代表所有的hibernate的sessionFactory自动被注入到我们的myssh工程的dao层中去,即在dao层中我们只要通过BaseHibernateDaoSupport.getSession()就可以进行相关的hibernate的数据库操作了.
我们还注意到了在src/main/resources/spring/hibernate/hibernate.xml文件中有这样的hibernate的model的映射:
<property name="annotatedClasses"> <list> <value>org.sky.ssh.model.TLogin</value> <value>org.sky.ssh.model.TStudent</value> </list> </property> |
这就是基于annotation的jpa的hibernate的model层的写法,这边的几个<value>括起来的东西就是一个个java的.class,这些java文件都是基于jpa的annotation写法。
当然,如果表结构简单,你可以直接手写这些java类,但是如果一个表结构很复杂,几十个字段主键还有组合主键这样的形式存在,那么手写这个jpa就会变得有点困难。
一般我们在开发项目时都是通过先建表,再建类的,对吧?
因此在这里我们其实是可以借助相关的工具通过数据库表来生成我们的hibernate的这些model类的。
利用eclipse从表逆向生成java的jpa(hibernate)类
准备工做
1.必须要有eclipse3.7及升级后的database, jpa feature,如:eclipse wtp版
2.建立数据源
根据下面操作,请切换到j2ee视图,然后先打开datasource explorer窗口
下一步
填入自定义的oracledriver名
点JARList这个tab(需要加载一个oracle的driver,即ojdbc6.jar)
可以去oracleclient端安装的路径的jdbc\lib中找到该JAR,注意上图中两个红圈处标出的路径与jar名
点OK返回下面这个对话框
填入servername, username, password等信息,你懂的(别忘了勾上save password)
选TestConnection
点OK,NEXT, FINISH完成
看,这边一下子把所有的schema都列出来了,但是我们知道oracle的schema就是username,因此我们用bookstore(这个只是示例,这边因该用你连接数据库的username)的schema只需要显示bookstore的相关数据库object就够我们用了。
看,右键点击你的connection选Properties然后在下面的对话框中选DefaultSchema Filter
在上面的对话框中把Disablefilter放开,然后在Startswith the characters填入你的oracle用户名(schema名),必须大写。
点OK
返回后右键点connection选Refresh,看,是不是只列出来就是你要的东西了(相当于pl/sql里从all objects切换成my objects)
这个东西还可以在没有安装oracle客户端的情况下,拿ECLIPSE来当oracle的客户端用。
建立JPA(Hibernate)工程
在hibernate3里我们把hibernate的annoation方式称为全注解即JPA,因此我们不需要使用hibernate3以前的那种xml文件的配置的方式。
新建JPA工程
这边我们使用的工程名为myssh_model
工程名起名规范,比如说你的工程叫MyProject,那么你的HIBERNATE是ForMyProject工程的,因此你的hibernate即JPA工程就应该叫MyProject_model
根据上图勾选后NEXT,NEXT到下面这一步(千万不要手快然后直接去点那个FINISH按钮啊,我们还没完呢)
根据上图勾选
点FINISH
在弹出框时选Yes
生成的JPA工程
右键单击工程,在JPATools里选GenerateEntities from Tables,这个你懂的。。。
下面,灵的东西要来了。。。
点一下Connection下的这个有“黄色铰链”的按钮(connection),这时下方的下拉列表会显示你当前的jpa工程使用的dbconnection中的Table,看到米有?
注意,把这个Updateclass list in persistence.xml去掉,因为我们用的是纯annotation,不希望再用xml配置方式了,要不然生成出来的工程会出错的,点Next
如果表与表之间有foreignkey的关系,它都能帮你识别出来
Next
保持所有的CLASS的主键为none,我们在后面为每个表分别指定主键的形势,因为有些主键是用的是sequence,有的主键是要通过界面手输进来的,不是sequence,有的主键甚至是复合主键。
别忘了把package填上,注意package的命名规范(规则)养成良好习惯
点NEXT
下面为每个CLASS指定主键的生成方式。
对于T_LOGIN表来说我们的PK让它保持为默认。
对于T_STUDENT表来说,我们的主键是用一个oracle的 sequence来生成的,这个oracle的sequence命为:
因此当你为一个jpa指定了sequence的PK时,在做插入动作时,该表的PK会自动从在这一步指定的sequence中去读取nextval值,相当于执行了一步:select SEQ_STUDENT_NO.nextval from dual;这样的操作.
把每个JPA的主键指定完毕后可以点Finish了
Look,快来看上帝哦,JPA类被自动生成了,但编译有问题,因为我们没有给工程指定lib包,jpa工程需要用到以下lib包
我已经同时上传到我的博客的资源上了。
于是,在工程下建一个文件夹叫lib,把这些jar全放lib目录里然后加入classpath
编译通过后,我们就可以把这些java拷入我们需要用到hibernate工程的project里了,拷进去后别忘了改一处地方:
以下是我原有工程中有一个jpa,因此我在spring/hibernate/hibernate.xml文件中需要把一个jpa纳入spring的管理,但现在我拷进去一堆jpa都要纳入spring管理,怎么办?就是把这个文件打开,找到
<property name=”annotatedClasses”>处
然后看到<List><value>了吗?自己把一个个JPA加进去吧,然后就可以去爽了。
<property name="annotatedClasses"> <list> <value>org.sky.ssh.model.TLogin</value> <value>org.sky.ssh.model.TStudent</value> </list> </property> |
org.sky.ssh.dao.BaseHibernateDaoSupport.java文件
package org.sky.ssh.dao; import javax.annotation.Resource; import org.hibernate.SessionFactory; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class BaseHibernateDaoSupport extends HibernateDaoSupport { @Resource(name = "hibernateSessionFactory") public void setSF(SessionFactory sessionFactory) { super.setSessionFactory(sessionFactory); } } |
四、SSH框架的使用
我们现在可以开始使用我们的SSH框架了。
4.1修改DAO层代码
org.sky.ssh.dao.LoginDAO
package org.sky.ssh.dao; public interface LoginDAO { public long validLogin(String loginId, String loginPwd) throws Exception; } |
org.sky.ssh.dao.impl.LoginDAOImpl
package org.sky.ssh.dao.impl; import org.sky.ssh.dao.BaseHibernateDaoSupport; import org.sky.ssh.dao.LoginDAO; import org.springframework.stereotype.Repository; import org.hibernate.Query; @Repository public class LoginDAOImpl extends BaseHibernateDaoSupport implements LoginDAO { public long validLogin(String loginId, String loginPwd) throws Exception { Long count = new Long(0); String sql = "select count(tl.loginId) from TLogin as tl where tl.loginId=:loginId and tl.loginPwd=:loginPwd "; Query query = super.getSession().createQuery(sql); query.setString("loginId", loginId); query.setString("loginPwd", loginPwd); count = (Long) query.list().get(0); return count; } } |
org.sky.ssh.dao.StudentDAO
package org.sky.ssh.dao; import org.sky.ssh.model.TStudent; import org.sky.ssh.dbo.StudentDBO; import org.sky.ssh.student.form.*; import java.util.*; public interface StudentDAO { public List<TStudent> getAllStudent() throws Exception; public void addStudent(String studentName) throws Exception; public void delStudent(TStudent std) throws Exception; } |
org.sky.ssh.dao.impl.StudentDAOImpl
package org.sky.ssh.dao.impl; import java.util.ArrayList; import java.util.List; import org.hibernate.Query; import org.sky.ssh.dao.BaseHibernateDaoSupport; import org.sky.ssh.dao.StudentDAO; import org.sky.ssh.model.TStudent; import org.springframework.stereotype.Repository; @Repository public class StudentDAOImpl extends BaseHibernateDaoSupport implements StudentDAO { public List<TStudent> getAllStudent() throws Exception { List<TStudent> stdList = new ArrayList<TStudent>(); String sql = "from TStudent as s"; Query query = super.getSession().createQuery(sql); stdList = query.list(); return stdList; } public void addStudent(String studentName) throws Exception { TStudent std = new TStudent(); std.setStudentName(studentName); this.getHibernateTemplate().save(std); } public void delStudent(TStudent std) throws Exception { this.getHibernateTemplate().delete(std); } } |
对Service层的接口作相应的调整,把原来在iBatis中使用Map传值的地方改一下即可,对吧?
Hibernate的DAO是我看到过的最简单的DAO写法,连脑子都不需要多动。
4.2 启动我们的框架
确保我们的StudentServiceImpl类中有如下语句:
public void delStudent(String[] stdNo) throws Exception { for (String s : stdNo) { TStudent std = new TStudent(); std.setStudentNo(Long.parseLong(s)); studentDAO.delStudent(std); throw new Exception("force system to throw a exception"); } } |
在eclipse中启动tomcat
在IE中输入:http://localhost:8080/myssh/,页面自动跑到登录界面
输入alpha/aaaaaa登录成功后我们增加两个用户:test2与test3
在主界面上勾选test2与test3点删除按钮。
页面出错
看数据库层面
数据记录还在,说明我们的springservice层与hibernatedao层已经结合成功。
在StudentServiceImpl类中将:throw new Exception("force system to throw a exception");这句注释掉.
重新启动tomcat后登录并勾选test2与test3,然后点删除按钮.
删除成功。
查看数据库层记录
数据删除也成功了,结束今天的教程。
五、附录
Hibernate的dialect大全
DB2 | org.hibernate.dialect.DB2Dialect |
DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
MySQL | org.hibernate.dialect.MySQLDialect |
MySQL with InnoDB | org.hibernate.dialect.MySQLInnoDBDialect |
MySQL with MyISAM | org.hibernate.dialect.MySQLMyISAMDialect |
Oracle (any version) | org.hibernate.dialect.OracleDialect |
Oracle 9i/10g | org.hibernate.dialect.Oracle9Dialect |
Sybase | org.hibernate.dialect.SybaseDialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
Microsoft SQL Server | org.hibernate.dialect.SQLServerDialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
Informix | org.hibernate.dialect.InformixDialect |
HypersonicSQL | org.hibernate.dialect.HSQLDialect |
Ingres | org.hibernate.dialect.IngresDialect |
Progress | org.hibernate.dialect.ProgressDialect |
Mckoi SQL | org.hibernate.dialect.MckoiDialect |
Interbase | org.hibernate.dialect.InterbaseDialect |
Pointbase | org.hibernate.dialect.PointbaseDialect |
FrontBase | org.hibernate.dialect.FrontbaseDialect |
Firebird | org.hibernate.dialect.FirebirdDialect |
相关推荐
IncompatibleClassChangeError(解决方案).md
智慧工地,作为现代建筑施工管理的创新模式,以“智慧工地云平台”为核心,整合施工现场的“人机料法环”关键要素,实现了业务系统的协同共享,为施工企业提供了标准化、精益化的工程管理方案,同时也为政府监管提供了数据分析及决策支持。这一解决方案依托云网一体化产品及物联网资源,通过集成公司业务优势,面向政府监管部门和建筑施工企业,自主研发并整合加载了多种工地行业应用。这些应用不仅全面连接了施工现场的人员、机械、车辆和物料,实现了数据的智能采集、定位、监测、控制、分析及管理,还打造了物联网终端、网络层、平台层、应用层等全方位的安全能力,确保了整个系统的可靠、可用、可控和保密。 在整体解决方案中,智慧工地提供了政府监管级、建筑企业级和施工现场级三类解决方案。政府监管级解决方案以一体化监管平台为核心,通过GIS地图展示辖区内工程项目、人员、设备信息,实现了施工现场安全状况和参建各方行为的实时监控和事前预防。建筑企业级解决方案则通过综合管理平台,提供项目管理、进度管控、劳务实名制等一站式服务,帮助企业实现工程管理的标准化和精益化。施工现场级解决方案则以可视化平台为基础,集成多个业务应用子系统,借助物联网应用终端,实现了施工信息化、管理智能化、监测自动化和决策可视化。这些解决方案的应用,不仅提高了施工效率和工程质量,还降低了安全风险,为建筑行业的可持续发展提供了有力支持。 值得一提的是,智慧工地的应用系统还围绕着工地“人、机、材、环”四个重要因素,提供了各类信息化应用系统。这些系统通过配置同步用户的组织结构、智能权限,结合各类子系统应用,实现了信息的有效触达、问题的及时跟进和工地的有序管理。此外,智慧工地还结合了虚拟现实(VR)和建筑信息模型(BIM)等先进技术,为施工人员提供了更为直观、生动的培训和管理工具。这些创新技术的应用,不仅提升了施工人员的技能水平和安全意识,还为建筑行业的数字化转型和智能化升级注入了新的活力。总的来说,智慧工地解决方案以其创新性、实用性和高效性,正在逐步改变建筑施工行业的传统管理模式,引领着建筑行业向更加智能化、高效化和可持续化的方向发展。
123
asdjhfjsnlkdmv
该代码实现了基于机器学习的车辆价格预测模型,利用不同回归算法(如线性回归、随机森林回归和 KNN 回归)对车辆的当前价格(current price)进行预测。代码首先进行数据加载与预处理,包括删除无关特征、归一化处理等;然后使用不同的机器学习模型进行训练,并评估它们的表现(通过 R²、MAE、MSE 等指标);最后通过可视化工具对模型预测效果进行分析。目的是为车辆价格预测任务找到最合适的回归模型。 适用人群: 数据科学家和机器学习工程师:对于需要进行回归建模和模型选择的从业者,尤其是对车辆数据或类似领域有兴趣的。 企业数据分析师:在汽车行业或二手车市场中,需要对车辆价格进行预测和分析的专业人员。 机器学习学习者:希望学习如何使用 Python 实现机器学习模型、数据预处理和评估的初学者或中级学习者。 使用场景及目标: 汽车定价与估值:用于为汽车或二手车定价,尤其是当需要预测车辆的当前市场价格时。 汽车行业市场分析:通过数据分析和回归预测,帮助汽车销售商、经销商或市场分析师预测未来的市场价格趋势。 二手车市场:为二手车买卖双方提供价格参考,帮助制定合理的交易价格。
基于模型预测控制(mpc)的车辆道,车辆轨迹跟踪,道轨迹为五次多项式,matlab与carsim联防控制
StoreError解决办法.md
白色精致风格的个人简历模板下载.zip
白色宽屏风格的房产介绍服务网站模板下载.zip
基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目),本资源中的源码都是经过本地编译过可运行的,评审分达到98分,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、毕业设计、期末大作业和课程设计使用需求,如果有需要的话可以放心下载使用。 基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于
白色宽屏风格的生物医疗实验室企业网站模板.rar
C# 操作Access数据库
NSFileSystemError如何解决.md
白色简洁风格的商户销售统计图源码下载.zip
白色简洁风格的室内设计整站网站源码下载.zip
侧吸式油烟机sw16可编辑全套技术资料100%好用.zip
在 MATLAB 中进行人脸识别可以通过使用内置的工具箱和函数来实现。MATLAB 提供了计算机视觉工具箱(Computer Vision Toolbox),其中包含了用于图像处理、特征提取以及机器学习的函数,可以用来构建一个人脸识别系统。下面是一个简化的教程,介绍如何使用 MATLAB 进行人脸识别。 ### 准备工作 1. **安装必要的工具箱**:确保你已经安装了“计算机视觉工具箱”和“深度学习工具箱”。如果没有,可以通过 MATLAB 的附加功能管理器安装它们。 2. **获取数据集**:准备一个包含不同个体的人脸图像的数据集。你可以自己收集图片,或者使用公开的数据集如 AT&T Faces Database 或 LFW (Labeled Faces in the Wild) 数据集。 3. **安装预训练模型(可选)**:如果你打算使用深度学习方法,MATLAB 提供了一些预训练的卷积神经网络(CNN)模型,比如 AlexNet, GoogLeNet 等,可以直接加载并用于特征提取或分类。 ### 步骤指南 #### 1. 加载人脸检测器 ```matlab face
白色宽屏风格的建筑设计公司企业网站源码下载.zip
智慧工地,作为现代建筑施工管理的创新模式,以“智慧工地云平台”为核心,整合施工现场的“人机料法环”关键要素,实现了业务系统的协同共享,为施工企业提供了标准化、精益化的工程管理方案,同时也为政府监管提供了数据分析及决策支持。这一解决方案依托云网一体化产品及物联网资源,通过集成公司业务优势,面向政府监管部门和建筑施工企业,自主研发并整合加载了多种工地行业应用。这些应用不仅全面连接了施工现场的人员、机械、车辆和物料,实现了数据的智能采集、定位、监测、控制、分析及管理,还打造了物联网终端、网络层、平台层、应用层等全方位的安全能力,确保了整个系统的可靠、可用、可控和保密。 在整体解决方案中,智慧工地提供了政府监管级、建筑企业级和施工现场级三类解决方案。政府监管级解决方案以一体化监管平台为核心,通过GIS地图展示辖区内工程项目、人员、设备信息,实现了施工现场安全状况和参建各方行为的实时监控和事前预防。建筑企业级解决方案则通过综合管理平台,提供项目管理、进度管控、劳务实名制等一站式服务,帮助企业实现工程管理的标准化和精益化。施工现场级解决方案则以可视化平台为基础,集成多个业务应用子系统,借助物联网应用终端,实现了施工信息化、管理智能化、监测自动化和决策可视化。这些解决方案的应用,不仅提高了施工效率和工程质量,还降低了安全风险,为建筑行业的可持续发展提供了有力支持。 值得一提的是,智慧工地的应用系统还围绕着工地“人、机、材、环”四个重要因素,提供了各类信息化应用系统。这些系统通过配置同步用户的组织结构、智能权限,结合各类子系统应用,实现了信息的有效触达、问题的及时跟进和工地的有序管理。此外,智慧工地还结合了虚拟现实(VR)和建筑信息模型(BIM)等先进技术,为施工人员提供了更为直观、生动的培训和管理工具。这些创新技术的应用,不仅提升了施工人员的技能水平和安全意识,还为建筑行业的数字化转型和智能化升级注入了新的活力。总的来说,智慧工地解决方案以其创新性、实用性和高效性,正在逐步改变建筑施工行业的传统管理模式,引领着建筑行业向更加智能化、高效化和可持续化的方向发展。
履带车底盘sw16全套技术资料100%好用.zip