一. 整合开发版
S2SH 框架已经搭建好了,但想要快速的开发,形成一个简单的规范,还需要继续努力,例如,简化一下Dao层, 分页查询一下, 简化一下分页等。 这里,进行一个整体性的操作。
二. 引入Jar 包
在第十章的49个jar 包之上,添加一个测试的jar包: spring-test-4.2.4.RELEASE.jar,共50个了。
三. 配置三. 配置文件文件
三.一 jdbc.properties (改变数据库连接属性)
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/spring jdbc.username=root jdbc.password=abc123
三.二 log4j.properties (改变rootLogger的值)
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=c:\mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=info, stdout
三.三 hibernate.cfg.xml (改变相应的约束文件)
<?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> <!-- 关于Hibernate的相应配置 --> <!-- 引入方言 --> <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.format_sql">true</property> <!-- 引入相应的约束文件 ctrl点击时可以正确进入--> <mapping resource="com/yjl/pojo/User.hbm.xml"/> </session-factory> </hibernate-configuration>
三.四 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.devMode" value="true" /> <!-- 把扩展名配置为action --> <constant name="struts.action.extension" value="action" /> <!-- 设置主题为默认,即为标签本来的样子,不用struts2中设置好的标签 --> <constant name="struts.ui.theme" value="simple"></constant> <!-- 设置编码格式为utf-8,避免出现乱码的情况 --> <constant name="struts.i18n.encoding" value="utf-8"></constant> <!--静态资源路径--> <constant name="struts.action.excludePattern" value="/JS/.*?" /> <!-- 引入相应的文件 --> <include file="struts2/struts-user.xml"></include> </struts>
三.五 struts2 文件夹下(添加多个action对应的映射文件)
<?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> <package name="user" extends="struts-default" namespace="/"> <action name="User_*" class="userAction" method="{1}"> <result name="list">user.jsp</result> </action> </package> </struts>
三.六 applicationContext.xml (改变注解扫描包路径)
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.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"> <!-- 采用注解的方式进行 --> <!-- 开启注解扫描 --> <context:component-scan base-package="com.yjl"></context:component-scan> <!-- 引入配置文件 前面要加上classpath--> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClassName}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 创建sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocations" value="classpath:hibernate.cfg.xml"></property> </bean> <!-- 创建Hibernate模板 --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 开启注解事务管理 --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
三.七 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"> <display-name>SSH整合</display-name> <!-- 配置spring 启动时的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置启动参数 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置全局编码格式 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置struts2的过滤器 --> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <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> </filter> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-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>
四. dao 层工具类
四.一 BaseDao 接口
package com.yjl.util; import java.io.Serializable; import java.util.List; /** @author:yuejl @date: 2019年5月27日 下午5:35:41 @Description 基本的dao类型转换 */ public interface BaseDao<T> { /** * @param t pojo插入对象 * @return 添加对象 */ void addEntity(T t); /** * * @param id 主键编号 * @return 根据id编号删除当前对象 */ void deleteEntity(Serializable id); /** * * @param id 主键编号 * @return 根据id编号删除当前对象 */ void deleteEntity(T t); /** * @param t pojo更新对象 * @return 更新对象 */ void updateEntity(T t); /** * @param t 保存或者是更新的对象 * @return 保存或者是更新,如果没有该对象,就保存,如果有,就更新。 */ void saveOrUpdateEntity(T t); /** * @param id 主键编号 * @return 根据id编号查询当前对象,是唯一值. */ T getEntityById(Serializable id); /** * * @param hql hql查询语句,用? 进行占位. * @param params 参数 * @return 返回唯一确定的结果,得到的是唯一值。 */ T getEntity(String hql,Object []params); /** * * @param hql hql查询语句,用? 进行占位. * @param params 参数 * @return 返回唯一确定的结果,得到的是唯一值。 */ T getEntity(String hql,List<Object> params); /** * @param ids 主键编号集合,in 的形式 * @return 根据id编号集合,查询所有的对象集合信息。 */ List<T> findEntitysByIds(Serializable []ids); /** * @return 查询所有的对象信息 */ List<T> findAllEntitys(); /** * * @param hql hql查询语句,用? 进行占位. * @param params 参数 * @return 返回所有的结果,得到全部的记录。 */ List<T> findEntitysByHql(String hql,Object []params); /** * * @param hql hql查询语句,用? 进行占位. * @param params 参数 * @return 返回所有的结果,得到全部的记录。 */ List<T> findEntitysByHql(String hql,List<Object> params); /** * * @param hql hql查询语句,用? 进行占位. * @param params 参数 * @param currentPage 当前页 * @param pageSize 每页的数目 * @return 返回分页的结果,得到全部的记录 */ List<T> findEntitysByHql(String hql, Object[] params, int currentPage, int pageSize); /** * * @param hql hql查询语句,用? 进行占位. * @param params 参数 * @param currentPage 当前页 * @param pageSize 每页的数目 * @return 返回分页的结果,得到全部的记录 */ List<T> findEntitysByHql(String hql, List<Object> params, int currentPage, int pageSize); /** * @param qh queryHelper 对象 * @return 返回所有的结果,得到全部的记录。 */ List<T> findEntitysByHql(QueryHelper qh); /** * * @param currentPage 当前页 * @param pageSize 每页的数目 * @param ph 分页查询帮助类 * @return 返回分页查询的结果 */ PageBean<T> page(int currentPage,int pageSize,QueryHelper qh); /** * @return 返回全部结果的数目 */ Long count(); /** * * @param hql hql语句 * @return 返回数目 */ Long count(String hql); /** * * @param hql hql语句 * @param params 参数 * @return 返回数目 */ Long count(String hql,Object []params); /** * * @param hql hql语句 * @param params 参数 * @return 返回数目 */ Long count(String hql,List <Object> params); /** * * @param qh queryHelper 对象 * @return 返回数目 */ Long count(QueryHelper qh); /** * * @param hql hql语句 * @return 查询唯一值,包括基本类型的单值或者String 类型值。 */ Object queryUnique(String hql); /** * * @param hql hql语句 * @param params 参数 * @return 查询唯一值,包括基本类型的单值或者String 类型值。 */ Object queryUnique(String hql,Object []params); /** * * @param hql hql语句 * @param params 参数 * @return 查询唯一值,包括基本类型的单值或者String 类型值。 */ Object queryUnique(String hql,List<Object> params); }
四.二 BaseDaoImpl 实现类
package com.yjl.util; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.transaction.annotation.Transactional; /** @author:yuejl @date: 2019年5月27日 下午5:39:14 @Description 类的相关描述 */ //注意,注解只能是Transactional @Transactional @SuppressWarnings("all") public class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } /** * @return 获取当前的session */ protected Session getSession(){ return sessionFactory.getCurrentSession(); } private Class<T> clazz; //使用反射技术得到它的真实类型 public BaseDaoImpl(){ //获取当前类的泛型父类的类型 ParameterizedType p=(ParameterizedType)(this.getClass().getGenericSuperclass()); //获取它的参数,只有一个为0. Map有两个 clazz=(Class<T>) p.getActualTypeArguments()[0]; System.out.println("生成实体对象------>"+clazz); } @Override public void addEntity(T t) { getSession().save(t); } @Override public void deleteEntity(Serializable id) { T t=getEntityById(id); deleteEntity(t); } @Override public void deleteEntity(T t) { try{ getSession().delete(t); }catch(Exception e){ System.out.println("没有查询出此数据,删除失败"); } } @Override public void updateEntity(T t) { getSession().update(t); } @Override public void saveOrUpdateEntity(T t) { getSession().saveOrUpdate(t); } @Override public T getEntityById(Serializable id) { if(id==null){ return null; } return getSession().get(clazz,id); } @Override public T getEntity(String hql, Object[] params) { List<T> allList=findEntitysByHql(hql,params); if(allList!=null&&allList.size()>0){ return allList.get(0); } return null; } @Override public T getEntity(String hql, List<Object> params) { return getEntity(hql,params.toArray()); } @Override public List<T> findAllEntitys() { return getSession().createQuery("From "+clazz.getSimpleName()).list(); } @Override public List<T> findEntitysByIds(Serializable[] ids) { //如果传进来的值为空,则返回空的集合,而不是null if(ids==null||ids.length==0){ return new ArrayList<T>(); }else{ //用注释线可以将代码换行,分开去写 return getSession().createQuery(// "FROM "+clazz.getSimpleName()+" WHERE id IN (:ids)")// .setParameterList("ids",ids)// .list(); } } @Override public List<T> findEntitysByHql(String hql, Object[] params) { Query query=getQuery(hql,params); return query.list(); } @Override public List<T> findEntitysByHql(String hql, List<Object> params) { return findEntitysByHql(hql,params.toArray()); } @Override public List<T> findEntitysByHql(String hql, Object[] params, int currentPage, int pageSize) { Query query=getQuery(hql,params,currentPage,pageSize); return query.list(); } @Override public List<T> findEntitysByHql(String hql, List<Object> params, int currentPage, int pageSize) { return findEntitysByHql(hql,params.toArray(),currentPage,pageSize); } @Override public List<T> findEntitysByHql(QueryHelper qh) { return findEntitysByHql(qh.getListQueryHql(), qh.getParams()); } @Override public Long count() { return count("select count(*) From "+clazz.getSimpleName()); } @Override public Long count(String hql) { return count(hql,new Object[]{}); } @Override public Long count(String hql, Object[] params) { Query query=getQuery(hql,params); return ((Number)query.uniqueResult()).longValue(); } @Override public Long count(String hql, List<Object> params) { return count(hql,params.toArray()); } @Override public Long count(QueryHelper qh) { return count(qh.getListQueryHql(),qh.getParameters()); } @Override public PageBean<T> page(int currentPage, int pageSize, QueryHelper qh) { //查询所有的数据 List<T> allList=findEntitysByHql(qh.getListQueryHql(), qh.getParams(),currentPage,pageSize); //查询数目 long recordCount=count(qh.getCountQueryHql(),qh.getParams()); return new PageBean<T>(currentPage,pageSize,recordCount,allList); } @Override public Object queryUnique(String hql) { return queryUnique(hql,new Object[]{}); } @Override public Object queryUnique(String hql, Object[] params) { Query query=getQuery(hql,params); return query.uniqueResult(); } @Override public Object queryUnique(String hql, List<Object> params) { return queryUnique(hql,params.toArray()); } /** * 不需要分页的查询语句,即查询单个值 * @param hql hql的查询语句 * @param args 所需要的参数 * @return 返回一个新得到的Query */ private Query getQuery(String hql,Object []args){ Query query=getSession().createQuery(hql); if(args!=null&&args.length>0){ for (int i = 0; i < args.length; i++) { query.setParameter(i,args[i]); } } return query; } /** * 分页查询时的Query语句 * @param pageIndex 页的索引 * @param pageSize * @param hql hql查询语句 * @param args hql语句所需要的参数 * @return 返回分页查询所需要的Query对象. */ private Query getQuery(String hql,Object []args,int pageIndex, int pageSize){ Query query=getQuery(hql,args); query.setMaxResults(pageSize); int first=(pageIndex-1)*pageSize; query.setFirstResult(first); return query; } }