1.搭建项目
1.1 创建父工程和子工程
1.1.1 创建父项目
不选择任何骨架,点击next
组名+项目名称
父工程创建成功后,建议删除其中的src文件夹,结构如下:
配置pom.xml 通过座标导入jar包:
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<struts2.version>2.3.24</struts2.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<shiro.version>1.2.3</shiro.version>
<cxf.version>3.0.1</cxf.version>
<c3p0.version>0.9.1.2</c3p0.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.37</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- shiro -->
<!-- apache shiro dependencies -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- struts2 begin -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts2.version}</version>
<exclusions>
<exclusion>
<artifactId>javassist</artifactId>
<groupId>javassist</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<!-- struts2 end -->
<!-- hibernate begin -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.1.Final</version>
</dependency>
<!-- hibernate end -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- Javamail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.4</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.1</version>
<scope>test</scope>
</dependency>
<!-- <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency> -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
因为我们使用的阿里的maven仓库是没有oracle驱动的,所以我们需要将ojdbc14.jar
手动上传到我们的本地仓库中
mvn install:install-file -Dfile="E:\ojdbc14.jar" -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar
依赖的jar下载完后,可以在external libraries中看到依赖的外部jar
1.1.2 创建子项目
1.jx_web工程是war工程,所以采用webapp
1.其余的都是jar工程,所以都不用选择骨架
在new→module时不要选中Create from archetype,点击next,然后填一个ArtifactId(项目名),然后一直next就行了
注意:pom文件中要添加<packaging>jar</packaging>
1.2 子工程间的依赖关系
到上一步结束,我们已经有了父工程和子工程,但各个子工程之间是没有任何关系的,此时我们需要建立子工程之间的依赖关系
Project Structure > Modules
参照上面的操作,我们依次给service和web都添加依赖
1.3 页面的导入
将页面导入jx_web项目中webapp中:
2.web.xml以及其他配置文件的
2.1 jx_web的web.xml修改
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!--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</listener-class>
</listener>
<!--2.懒加载 OpenSessionInviewFilter noSession or session is closed-->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Shiro Security filter filter-name这个名字的值将来还会在spring中用到 -->
<!-- <filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> -->
<!--3.struts2核心控制器-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--CharacterEncodingFilter进行编码过滤-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
详解:
1.spring配置文件的加载的监听器
(可参考spring第二天spring的web集成)
原始的读取spring核心配置,初始化spring容器的方法:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
缺点:
在创建Spring容器同时,需要对容器中对象初始化。而每次初始化容器的时候,都创建了新的容器对象,消耗了资源,降低了性能。
解决思路:
保证容器对象只有一个
解决方案:
将Spring容器绑定到Web Servlet容器上,让Web容器来管理Spring容器的创建和销毁。
分析:
ServletContext在Web服务运行过程中是唯一的, 其初始化的时候,会自动执行ServletContextListener 监听器 (用来监听上下文的创建和销毁),具体步骤为:
编写一个ServletContextListener监听器,在监听ServletContext到创建的时候,创建Spring容器,并将其放到ServletContext的属性中保存(setAttribute(Spring容器名字,Spring容器对象) )。 我们无需手动创建该监听器,因为Spring提供了一个叫ContextLoaderListener的监听器,它位于spring-web-4.2.4.RELEASE.jar中。
这个监听器会在监听ServletContext创建的时候,默认加载/WEB-INF/applicationContext.xml
这个路径的文件,所以我们还需要通过<context-param>标签改下核心配置的路径
2.OpenSessionInViewFilter
(可参考spring第五天_延迟加载问题 OpenSessionInView方案)
Hibernate后技术的核心是Session,session有两种创建方式
- openSession(每次获取的session都是不同)
- getCurrentSession(需要先将session绑定到当前线程中)
为了保证事务的一致性,我们必须确保同一个线程中获取session是同一个(HibernateTemplete底层用了getCurrentSession)
如果使用openSession我们就要手动关闭session(如果不关闭,session就会一直存在,造成资源的浪费),而使用getCurrentSession则无需手动关闭session,在进行事务提交时,会自动关闭session.
所以也就会发生一个问题,我们通常在service的方法中添加事务,例如userService.findById(id)
,在方法开始之初,session开启事务,而在方法结束时,事务提交,同时session关闭,因为session已经关闭了,而此时如果在action获取值,会由于延迟加载,无法获取到对象属性,所以我们需要把session的关闭延长至action
3.struts2核心控制器
(可参考struts2第一天)
2.2 Spring核心配置文件
在不同的模块中配置自己的spring配置,同时web子模块中添加spring的总文件
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
在Spring的主配置文件applicationContext.xml文件中,进行如下配置:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" />
<property name="user" value="itcast" />
<property name="password" value="itcast" />
</bean>
<!-- 2.sessionFactory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- 3.事务管理器-->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 4.txAdvice-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*"/>
<tx:method name="insert*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 5.aop-->
<aop:config> bean(*Service)
<aop:pointcut id="pointcut" expression="execution(* cn.itcast.jx.service.*Service.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
</aop:config>
1.ComboPooledDataSource:c3p0连接池的数据源
2.LocalSessionFactoryBean:spring集成Hibernate
可参考spring第五天_spring整合Hibernate
作用是将session工厂交给spring管理(这是spring整合hibernate的核心),之前的sessionFactory是在hibernate.cfg.xml文件中维护的
3.HibernateTransactionManager
可参考spring第四天_spring的事务管理机制
spring为Hibernate提供的事务管理器
4.txAdvice(通知)
就是在aop编程中的通知,简单来讲就是定义了对方法进行了怎么样的加强
5.aop
aop编程思想,需要配置通知(如何增强)和切面(对谁增强)
2.3 Hibernate核心配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.Oracle10gDialect
</property>
<property name="show_sql">true</property>
<property name="format_sql">false</property>
<property name="hbm2ddl.auto">update</property>
<!--校验模式 JPA java persistent api-->
<property name="javax.persistence.validation.mode">none</property>
</session-factory>
</hibernate-configuration>
2.4 Struts2配置
并且根据业务的模块,再分别创建三个模块对应的struts-*.xml文件,并且在主的struts.xml文件中包含这三个文件,具体配置如下:
struts-cargo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.ui.theme" value="simple"/>
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 船运模块 -->
<package name="cargo" namespace="/cargo" extends="struts-default">
</package>
</struts>
struts-stat.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.ui.theme" value="simple"/>
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 数据统计模块 -->
<package name="stat" namespace="/stat" extends="struts-default">
</package>
</struts>
struts-cargo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.ui.theme" value="simple"/>
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 系统管理模块 -->
<package name="sysadmin" namespace="/sysadmin" extends="struts-default">
</package>
</struts>
在主的struts.xml文件中进行如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.ui.theme" value="simple"/>
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.encoding" value="UTF-8" />
<package name="default" namespace="/" extends="struts-default">
</package>
<!-- 分模块开发 -->
<include file="struts/struts-sysadmin.xml"></include>
<include file="struts/struts-cargo.xml"></include>
<include file="struts/struts-stat.xml"></include>
</struts>
3.SSH框架的运行(登录功能的测试)
进行到上面一步后,我们可以测试下简单的登录功能(不涉及到dao层以及hibernate框架)
3.1 Action的编写
在jx_web项目中,创建登录的action,此时,由于系统在编写的过程中,需要大量的使用系统信息,所以,在编写的过程中,我们独立了一个BaseAction作为所有的Action的父类,未来,各个Action只需要继承BaseAction即可。
具体的项目架构如下:
3.2 Action的配置
配置Action,在spring的applicationContext-action.xml
中的配置如下:
<bean id="loginAction" class="cn.itcast.jx.action.LoginAction" scope="prototype"></bean>
<bean id="homeAction" class="cn.itcast.jx.action.HomeAction" scope="prototype"></bean>
因为web.xml在初始化时只会读取src下的applicationContext.xml,不会读取这个applicationContext-action.xml,所以我们需要引入
在src下的applicationContext.xml
中引入
<!-- 6加载其他的spring配置文件 -->
<import resource="classpath:spring/applicationContext-dao.xml"/>
<import resource="classpath:spring/applicationContext-service.xml"/>
<!-- <import resource="classpath:spring/applicationContext-action.xml"/> -->
在struts.xml中的配置如下:
<package name="default" namespace="/" extends="struts-default">
<action name="login" method="login" class="loginAction">
<result name="login">/WEB-INF/pages/sysadmin/login/login.jsp</result>
<result name="success">/WEB-INF/pages/home/fmain.jsp</result>
</action>
<action name="homeAction_*" method="{1}" class="homeAction">
<result name="fmain">/WEB-INF/pages/home/fmain.jsp</result>
<result name="title">/WEB-INF/pages/home/title.jsp</result>
<result name="toleft">/WEB-INF/pages/${moduleName}/left.jsp</result>
<result name="tomain">/WEB-INF/pages/${moduleName}/main.jsp</result>
</action>
</package>
此处因为(spring整合struts2)将action的创建交给spring管理,所以可以直接 class=‘bean的名称’
测试运行
启动tomcat,运行,观察结果
4.模块之间依赖的问题
我们在web的applicationContext.xml
中引入dao模块的applicationContext-dao.xml
,报红
通过dependencies建立的模块依赖,只有一层,所用web模块中只能获取到service模块的内容,无法获取到dao模块的内容
两种解决方式
-
1.还是通过dependencies(这种方式只能在idea工具中,互相依赖,无法对各个模块进行打包)
dao依赖util,domain,exception
service依赖dao,util,domain,exception
web依赖service,dao,util,domain,exception -
2.对模块进行打包,安装到maven仓库,然后再各个模块依次引入自己需要的jar包
比如pom.xml(jx_dao)
<dependencies>
<dependency>
<groupId>cn.itcast.jx</groupId>
<artifactId>jx_util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.itcast.jx</groupId>
<artifactId>jx_domain</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.itcast.jx</groupId>
<artifactId>jx_exception</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
5.dao类的导入和配置
5.1 导入工具类
5.2 Dao中类的导入
在项目中,对数据库的操作存在着相似性,所以我们对DAO进行了封装,在开发过程中,编写了如下的抽象类,统一的对数据库进行操作,存放的位置如下:
5.3 DAO的配置
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="sqlDao" class="cn.jx.dao.common.SqlDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="baseDao" class="cn.jx.dao.impl.BaseDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
这边由于在dao模块的applicationContext-dao.xml
中引用web模块applicationContext.xml
中定义的对象,所以也会报红
6.电子报运(telexport)模块
6.1 编写jsp
第一步:首先,在home/title.jsp页面添加“电子报运”模块
第二步:在WEB-INF/pages文件夹中添加telexport文件夹,(将其他模块的文件夹复制一份就ok了),具体目录结构如下如下:
第三步:修改left页面,代码如下:
第四步:运行观察结果:
6.2 数据库建模和实体类编写
--创建部门表
CREATE TABLE dept_p (
DEPT_ID varchar2(40) PRIMARY KEY NOT NULL,
DEPT_NAME varchar2(40) default NULL,
PARENT_ID varchar2(40) default NULL,
STATE number(11) default NULL
);
comment on column dept_p.STATE is '1代表启用,0代表停用,默认为1';
insert into dept_p (DEPT_ID, DEPT_NAME, PARENT_ID, STATE) values ('100', '杰信商贸集团', NULL, 1);
insert into dept_p (DEPT_ID, DEPT_NAME, PARENT_ID, STATE) values ('3d00290a-1af0-4c28-853e-29fbf96a2722', '市场部', '100', 1);
insert into dept_p (DEPT_ID, DEPT_NAME, PARENT_ID, STATE) values ('4028827c4fb6202a014fb6209c730000', '杰信总裁办', NULL, 1);
insert into dept_p (DEPT_ID, DEPT_NAME, PARENT_ID, STATE) values ('4028827c4fb633bd014fb64467470000', '杰信', NULL, NULL);
insert into dept_p (DEPT_ID, DEPT_NAME, PARENT_ID, STATE)values ('4028827c4fb645b0014fb64668550000','船运部cgx', '4028827c4fb6202a014fb6209c730000', 1);
insert into dept_p (DEPT_ID, DEPT_NAME, PARENT_ID, STATE) values ('73f3fa2f-66a2-4d16-8306-78d89003031b', '网络部', '100', 1);
insert into dept_p (DEPT_ID, DEPT_NAME, PARENT_ID, STATE) values ('97f88a8c-90fc-4d52-aed7-2046f62fb498', '总经办', '100', 1);
insert into dept_p (DEPT_ID, DEPT_NAME, PARENT_ID, STATE) values ('aeb1c7d3-9a54-4f73-b0ec-0325b83aef45', '船运部', '100', 1);
commit;
select * from DEPT_P;
6.3 部门的CRUD的准备工作
创建cn.itcast.jx.domain包,在包中创建Dept类,具体代码如下:
package cn.itcast.jx.domain;
public class Dept{
private String id; //编号
private String deptName;//部门名称
private Dept parent;//父部门 自关联
private Integer state;//状态
//getter和setter方法
......
}
【第二步】创建Dept.hbm.xml文件,具体配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.jx.domain">
<class name="Dept" table="DEPT_P">
<id name="id" column="DEPT_ID">
<generator class="uuid"></generator>
</id>
<property name="deptName" column="DEPT_NAME"></property>
<property name="state" column="STATE"></property>
<!-- 自关联 子部门与父部门 多对一 -->
<many-to-one name="parent" class="Dept" column="PARENT_ID"></many-to-one>
</class>
</hibernate-mapping>
【提示】
- 自关联的配置:
- parent表示当前子部门的父亲,一个父部门可以拥有多个子部门,而一个子部门只能属于一个父部门,对于子部门而言是多对一的关系,所以,我们按照多对一的关系配置 自关联 关系:
具体配置如下:
<!-- 自关联 子部门与父部门 多对一 -->
<many-to-one name="parent" class="Dept" column="PARENT_ID"></many-to-one>
配置Dept.hbm.xml
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 2.Hibernate的属性 -->
<property name="hibernateProperties">
<props>
<!-- 设置方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<!-- 设置打印sql语句 -->
<prop key="hibernate.show_sql">true</prop>
<!-- 格式化sql语句 -->
<prop key="hibernate.format_sql">true</prop>
<!-- 自动建表 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="mappingLocations">
<list>
<value>classpath:cn/itcast/jx/domain/*.hbm.xml</value>
</list>
</property>
</bean>