durcframework简介

github地址:https://github.com/durcframework/durcframework

demo:https://github.com/durcframework/durcframework.test

框架介绍:

durcframework是一个基于SpringMVC + Mybatis的框架。其设计目的在于提高开发效率,避免做重复的工作。尤其是在做管理后台时,能减少许多代码量。

框架用到的技术点:

1. 采用泛型设计,对数据库的增删改查做了适度的封装。只需少量代码就能完成一个模块的CRUD操作
2. 使用注解来生成查询条件,mybatis文件不需要额外配置,减少了mybatis的代码量。
3. 使用Java代码动态生成查询条件,可以根据不同场景,不同业务来组装查询条件。
4. 可以配合前台做Ajax开发,传输JSON格式数据,也可以使用传统SpringMVC到jsp页面。
5. 后台自动验证功能,支持JSR-303。

使用本框架可以完成的事:

1. 少量代码完成对一张表的增删改查。
2. 数据导出
3. 数据校验

下面是一个学生表的Controller类,这个类完成基本的增删改查操作

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @Controller   
  2. public class StudentCrudController extends CrudController<Student, StudentService> {  
  3.   
  4.     // 模拟表单提交  
  5.     // http://localhost/durcframeworkTest/addStudent.do?name=Lucy&stuNo=No0000197&address=USA&mobile=13345678951&birthday=1987-07-06  
  6.     @RequestMapping("/addStudent.do")  
  7.     public ModelAndView addStudent(Student student) {  
  8.         ModelAndView mav = this.save(student);  
  9.         System.out.println("添加后的主键ID:"+ student.getId());  
  10.         return mav;  
  11.     }  
  12.   
  13.     // http://localhost/durcframeworkTest/listStudent.do  
  14.     @RequestMapping("/listStudent.do")  
  15.     public ModelAndView listStudent(SearchStudentEntity searchStudentEntity) {  
  16.         return this.queryByEntity(searchStudentEntity);  
  17.     }  
  18.   
  19.     // 模拟表单提交,修改姓名为Lily  
  20.     // http://localhost/durcframeworkTest/updateStudent.do?id=39&name=Lily  
  21.     @RequestMapping("/updateStudent.do")  
  22.     public ModelAndView updateStudent(Student student) {  
  23.         return this.update(student);  
  24.     }  
  25.   
  26.     // 传一个id值即可,根据主键删除  
  27.     // http://localhost/durcframeworkTest/delStudent.do?id=39  
  28.     @RequestMapping("/delStudent.do")  
  29.     public ModelAndView delStudent(Student student) {  
  30.         // 通过主键查询某一条记录  
  31.         System.out.println(this.getService().getById(student.getPk()));  
  32.         return this.delete(student);  
  33.     }  
  34. }  


 

StudentCrudController类中的四个方法分别完成了增删改查操作,并且自带分页查询。再来看看Service类和Dao类是怎么样的

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @Service   
  2. public class StudentService extends CrudService { }  

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public interface StudentDao extends BaseDao { }  

Service类和Dao类只需做简单继承即可,应有的功能都封装在父类中了。

本框架采用Maven构建,您需要了解一些Maven知识,在这里就不多提了。




durcframework框架详解


github地址:https://github.com/durcframework/durcframework

demo:https://github.com/durcframework/durcframework.test

-----------------------------

durcframework实质上是对SpringMVC数据操作的一种简易封装.如果您了解SpringMVC,那么您便能快速上手此框架.

下面我们就从每个文件的角度来分析.

web.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app id="starter" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  5.   
  6.     <servlet>  
  7.         <servlet-name>dispatcherServlet</servlet-name>  
  8.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  9.         <init-param>  
  10.             <param-name>contextConfigLocation</param-name>  
  11.             <param-value>  
  12.                 classpath*:/spring/servlet/servlet-config.xml  
  13.             </param-value>  
  14.         </init-param>  
  15.         <load-on-startup>1</load-on-startup>  
  16.     </servlet>  
  17.     <servlet-mapping>  
  18.         <servlet-name>dispatcherServlet</servlet-name>  
  19.         <url-pattern>*.do</url-pattern>  
  20.     </servlet-mapping>  
  21.       
  22.     <context-param>  
  23.         <param-name>contextConfigLocation</param-name>  
  24.         <param-value>  
  25.             classpath*:/applicationContext.xml  
  26.         </param-value>  
  27.     </context-param>  
  28.   
  29.     <listener>  
  30.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  31.     </listener>  
  32.       
  33.     <listener>       
  34.         <listener-class>org.durcframework.common.RequestContextListener</listener-class>       
  35.     </listener>    
  36.       
  37.     <!-- 统一编码 -->  
  38.     <filter>  
  39.         <filter-name>characterEncodingFilter</filter-name>  
  40.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  41.         <init-param>  
  42.             <param-name>encoding</param-name>  
  43.             <param-value>UTF-8</param-value>  
  44.         </init-param>  
  45.         <init-param>  
  46.             <param-name>forceEncoding</param-name>  
  47.             <param-value>true</param-value>  
  48.         </init-param>  
  49.     </filter>  
  50.     <filter-mapping>  
  51.         <filter-name>characterEncodingFilter</filter-name>  
  52.         <url-pattern>/*</url-pattern>  
  53.     </filter-mapping>  
  54.   
  55.     <session-config>  
  56.         <session-timeout>20</session-timeout>  
  57.     </session-config>  
  58.   
  59.     <welcome-file-list>  
  60.         <welcome-file>index.jsp</welcome-file>  
  61.     </welcome-file-list>  
  62. </web-app>  


web.xml文件并没有特别的地方,都是SpringMVC的一些基本配置.

<listener>     
        <listener-class>org.durcframework.common.RequestContextListener</listener-class>     
 </listener> 

这个监听器是个辅助配置,不是必须的.

SpringMVC的servlet配置文件我把他放在了*:/spring/servlet/servlet-config.xml里面

SpringMVC配置文件:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  3.     xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  6.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  7.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  8.         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  9.         http://www.springframework.org/schema/tx <a target=_blank href="http://www.springframework.org/schema/tx/spring-tx-3.0.xsd'>      ">http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  10.   
  11.           
  12.   
  13. </a>    <!-- 支持spring mvc新的注解类型 详细spring3.0手册 15.12.1 mvc:annotation-driven -->  
  14.     <mvc:annotation-driven />  
  15.   
  16.     <!-- 扫描controller   
  17.         use-default-filters="false"只扫描@Controller  
  18.     -->  
  19.     <context:component-scan base-package="durcframework.test"  
  20.         use-default-filters="false">  
  21.         <context:include-filter expression="org.springframework.stereotype.Controller"  
  22.             type="annotation" />  
  23.     </context:component-scan>  
  24.       
  25.       
  26.     <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀,在requestmapping输入的地址后自动调用该类进行视图解析 -->  
  27.     <bean id="viewResolver"  
  28.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  29.         <property name="viewClass"  
  30.             value="org.springframework.web.servlet.view.JstlView" />  
  31.         <property name="prefix" value="/WEB-INF/jsp/" />  
  32.         <property name="suffix" value=".jsp" />  
  33.     </bean>  
  34.   
  35.       
  36.     <bean class="org.durcframework.common.SpringContext" />  
  37.     <bean class="org.durcframework.common.WebExceptionResolver" />  
  38.       
  39. </beans>  

可以看见这里也没有特殊的配置.

顺便提一下<context:component-scan>中加了<context:include-filter expression="org.springframework.stereotype.Controller"type="annotation" />这样启动的时候Spring会只扫描有@Controller注解的java文件,而不是去扫描所有java文件.这样走可以适当的加快启动速度.

<bean class="org.durcframework.common.SpringContext" />加上这句话就可以在开发中通过SpringContext.getBean('')获取注入的类

<bean class="org.durcframework.common.WebExceptionResolver" />这个是处理异常信息的

数据源

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  3.     xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  6.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  7.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  8.         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  9.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  10.   
  11.   
  12.     <!--   
  13.     通常来说,只需要修改initialSize、minIdle、maxActive。  
  14.     如果用Oracle,则把poolPreparedStatements配置为true,  
  15.     mysql可以配置为false。分库分表较多的数据库,建议配置为false。  
  16.      -->  
  17.     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">   
  18.       <!-- 基本属性 url、user、password -->  
  19.       <property name="url" value="${jdbc.jdbcUrl}" />  
  20.       <property name="username" value="${jdbc.user}" />  
  21.       <property name="password" value="${jdbc.password}" />  
  22.       <!-- 配置初始化大小、最小、最大 -->  
  23.       <property name="initialSize" value="${jdbc.initialPoolSize}" />  
  24.       <property name="minIdle" value="${jdbc.miniPoolSize}" />   
  25.       <property name="maxActive" value="${jdbc.maxPoolSize}" />  
  26.       <!-- 配置获取连接等待超时的时间 -->  
  27.       <property name="maxWait" value="60000" />  
  28.       <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
  29.       <property name="timeBetweenEvictionRunsMillis" value="60000" />  
  30.       <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
  31.       <property name="minEvictableIdleTimeMillis" value="300000" />  
  32.       <property name="validationQuery" value="SELECT 'x'" />  
  33.       <property name="testWhileIdle" value="true" />  
  34.       <property name="testOnBorrow" value="false" />  
  35.       <property name="testOnReturn" value="false" />  
  36.       <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->  
  37.       <property name="poolPreparedStatements" value="false" />  
  38.       <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />  
  39.       <!-- 配置监控统计拦截的filters -->  
  40.       <property name="filters" value="stat" />   
  41.   </bean>  
  42.   
  43.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  44.         <property name="dataSource" ref="dataSource" />  
  45.         <property name="configLocation">  
  46.             <value>classpath:mybatis/mybatisConfig.xml</value>  
  47.         </property>  
  48.         <property name="mapperLocations">  
  49.             <list>  
  50.                 <value>classpath:durcframework_mybatis/expressionBlock.xml</value>  
  51.                 <value>classpath:mybatis/mapper/*.xml</value>  
  52.             </list>  
  53.         </property>  
  54.     </bean>  
  55.     <!-- 事务 -->     
  56.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    
  57.         <property name="dataSource" ref="dataSource"/>    
  58.     </bean>    
  59.         
  60.      <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">    
  61.         <property name="transactionManager" ref="transactionManager"/>    
  62.     </bean>    
  63.     <!-- mybatis的spring插件 -->  
  64.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  65.         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>  
  66.         <property name="basePackage" value="durcframework.test.*.dao" />  
  67.     </bean>  
  68.       
  69.       
  70.     <!-- 事务配置 -->  
  71.     <!-- 打开注释开启声明式事务,并不是所有方法都需要事务,具体要看项目需求以及团队规范  
  72.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  73.         <tx:attributes>  
  74.             <tx:method name="save*" propagation="REQUIRED"/>  
  75.             <tx:method name="del*" propagation="REQUIRED"/>  
  76.             <tx:method name="update*" propagation="REQUIRED"/>  
  77.             <tx:method name="add*" propagation="REQUIRED"/>  
  78.             <tx:method name="query*" propagation="REQUIRED" read-only="true"/>  
  79.             <tx:method name="*Tran" propagation="REQUIRED"/>  
  80.         </tx:attributes>  
  81.     </tx:advice>  
  82.   
  83.     <aop:config>  
  84.         <aop:pointcut id="interceptorPointCuts" expression="execution(* *..service.*.*(..))" />  
  85.         <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />  
  86.     </aop:config>  
  87.     -->  
  88.   
  89. </beans>  

这是一个数据源配置,包括事务处理,没有其它特殊配置.

applicationContext.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  3.     xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  6.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  7.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  8.         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  9.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  10.   
  11.   
  12.     <context:property-placeholder location="classpath:/server.properties" />  
  13.   
  14.     <!-- spring context配置文件 -->  
  15.     <!-- 不要扫描durcframework.test包下的Controller类 -->  
  16.     <context:component-scan base-package="durcframework.test">  
  17.         <context:exclude-filter expression="org.springframework.stereotype.Controller"  
  18.             type="annotation" />  
  19.     </context:component-scan>  
  20.   
  21.     <import resource="classpath*:/spring/data/*.xml" />  
  22.       
  23. </beans>  


<context:component-scan>加了<context:exclude-filter expression="org.springframework.stereotype.Controller"type="annotation"/>这样表示不扫描有@Controller注解的文件

 

mybatis配置

这里拿student表来说明

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >  
  3. <mapper namespace="durcframework.test.student.dao.StudentDao">  
  4.   
  5.     <resultMap id="queryResultMap" type="durcframework.test.student.entity.Student">  
  6.         <result column="id" property="id" jdbcType="INTEGER" />  
  7.         <result column="name" property="name" jdbcType="VARCHAR" />  
  8.         <result column="politicsStatus" property="politicsStatus"  
  9.             jdbcType="INTEGER" />  
  10.         <result column="nationality" property="nationality" jdbcType="VARCHAR" />  
  11.         <result column="stuNo" property="stuNo" jdbcType="VARCHAR" />  
  12.         <result column="gender" property="gender" jdbcType="TINYINT" />  
  13.         <result column="department" property="department" jdbcType="INTEGER" />  
  14.         <result column="address" property="address" jdbcType="VARCHAR" />  
  15.         <result column="mobile" property="mobile" jdbcType="VARCHAR" />  
  16.         <result column="registDate" property="registDate" jdbcType="TIMESTAMP" />  
  17.         <result column="birthday" property="birthday" jdbcType="TIMESTAMP" />  
  18.     </resultMap>  
  19.   
  20.   
  21.     <select id="find" parameterType="org.durcframework.expression.ExpressionQuery"  
  22.         resultMap="queryResultMap">  
  23.         SELECT  
  24.         t.ID AS id  
  25.         ,t.NAME AS name  
  26.         ,t.POLITICS_STATUS AS politicsStatus  
  27.         ,t.NATIONALITY AS nationality  
  28.         ,t.STU_NO AS stuNo  
  29.         ,t.GENDER AS gender  
  30.         ,t.DEPARTMENT AS department  
  31.         ,t.ADDRESS AS address  
  32.         ,t.MOBILE AS mobile  
  33.         ,t.REGIST_DATE AS registDate  
  34.         ,t.BIRTHDAY AS birthday  
  35.   
  36.         FROM student t  
  37.         <include refid="expressionBlock.where" />  
  38.         <if test="paramMap.mobile != null">  
  39.             AND t.mobile = #{paramMap.mobile,jdbcType=VARCHAR}  
  40.         </if>  
  41.         <choose>  
  42.             <when test="sortname == null">  
  43.                 ORDER BY ID desc  
  44.             </when>  
  45.             <otherwise>  
  46.                 ORDER BY #{sortname,jdbcType=VARCHAR} ${sortorder}  
  47.             </otherwise>  
  48.         </choose>  
  49.         <if test="!isQueryAll">  
  50.             LIMIT  
  51.             #{firstResult,jdbcType=INTEGER},#{pageSize,jdbcType=INTEGER}  
  52.         </if>  
  53.     </select>  
  54.   
  55.     <select id="findTotalCount" parameterType="org.durcframework.expression.ExpressionQuery"  
  56.         resultType="java.lang.Integer">  
  57.         SELECT count(*) FROM student t  
  58.         <include refid="expressionBlock.where" />  
  59.     </select>  
  60.       
  61.     <insert id="save" parameterType="durcframework.test.student.entity.Student" keyProperty="id" keyColumn="id" useGeneratedKeys="true">  
  62.         INSERT INTO student  
  63.         (NAME,POLITICS_STATUS,NATIONALITY,STU_NO,GENDER,DEPARTMENT,ADDRESS,MOBILE,REGIST_DATE,BIRTHDAY)  
  64.         VALUES(  
  65.         #{name,jdbcType=VARCHAR}  
  66.         ,#{politicsStatus,jdbcType=INTEGER}  
  67.         ,#{nationality,jdbcType=VARCHAR}  
  68.         ,#{stuNo,jdbcType=VARCHAR}  
  69.         ,#{gender,jdbcType=TINYINT}  
  70.         ,#{department,jdbcType=INTEGER}  
  71.         ,#{address,jdbcType=VARCHAR}  
  72.         ,#{mobile,jdbcType=VARCHAR}  
  73.         ,#{registDate,jdbcType=TIMESTAMP}  
  74.         ,#{birthday,jdbcType=TIMESTAMP}  
  75.         )  
  76.     </insert>  
  77.       
  78.     <update id="update" parameterType="durcframework.test.student.entity.Student">  
  79.         UPDATE student SET  
  80.         NAME = #{name,jdbcType=VARCHAR}  
  81.         ,POLITICS_STATUS = #{politicsStatus,jdbcType=INTEGER}  
  82.         ,NATIONALITY = #{nationality,jdbcType=VARCHAR}  
  83.         ,STU_NO = #{stuNo,jdbcType=VARCHAR}  
  84.         ,GENDER = #{gender,jdbcType=TINYINT}  
  85.         ,DEPARTMENT = #{department,jdbcType=INTEGER}  
  86.         ,ADDRESS = #{address,jdbcType=VARCHAR}  
  87.         ,MOBILE = #{mobile,jdbcType=VARCHAR}  
  88.         ,REGIST_DATE = #{registDate,jdbcType=TIMESTAMP}  
  89.         ,BIRTHDAY = #{birthday,jdbcType=TIMESTAMP}  
  90.   
  91.         WHERE ID = #{id,jdbcType=INTEGER}  
  92.     </update>  
  93.       
  94.       
  95.     <select id="get" resultMap="queryResultMap" parameterType="java.io.Serializable">  
  96.         SELECT t.ID AS id  
  97.         ,t.NAME AS name  
  98.         ,t.POLITICS_STATUS AS politicsStatus  
  99.         ,t.NATIONALITY AS nationality  
  100.         ,t.STU_NO AS stuNo  
  101.         ,t.GENDER AS gender  
  102.         ,t.DEPARTMENT AS department  
  103.         ,t.ADDRESS AS address  
  104.         ,t.MOBILE AS mobile  
  105.         ,t.REGIST_DATE AS registDate  
  106.         ,t.BIRTHDAY AS birthday  
  107.   
  108.         FROM student t  
  109.         WHERE ID = #{id,jdbcType=INTEGER}  
  110.     </select>  
  111.       
  112.     <delete id="del" parameterType="durcframework.test.student.entity.Student">  
  113.         DELETE FROM student  
  114.         WHERE ID = #{id,jdbcType=INTEGER}  
  115.     </delete>  
  116.       
  117. </mapper>  


四条语句对应的增删改查,不难理解

其中<include refid="expressionBlock.where" />定义在框架里面,用处是拼接条件.具体代码可以在durcframework项目中查看

Entity文件

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class Student extends BaseEntity {  
  2.   
  3.     @Min(1)  
  4.     private Integer id;  
  5.     @Size(message="学生姓名",max=50)  
  6.     @NotEmpty(message="学生姓名不能为空")  
  7.     private String name;  
  8.     private Integer politicsStatus = 1;  
  9.     private String nationality = "汉族";  
  10.     @Size(message="学号长度不能超过20",max=20)  
  11.     @NotEmpty(message="学号不能为空")  
  12.     private String stuNo;  
  13.     private Byte gender = 1;  
  14.     private Integer department = 16;  
  15.     @Size(message="请输入正确的地址",max=200)  
  16.     private String address;  
  17.     @Pattern(message="请输入正确的手机号",regexp="^[1]\\d{10}$")  
  18.     private String mobile;  
  19.     private Date registDate = new Date();  
  20.     private Date birthday;  
  21.       
  22.     @Override  
  23.     protected boolean isNeedValidate() {  
  24.         // 开启验证  
  25.         return true;  
  26.         // 关闭验证  
  27. //      return false;  
  28.     }  
  29.     ...get/set  
  30. }  


是student表对应的实体类,注解是用来验证的支持JSR-303

DAO文件

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * DAO类,只需简单继承父类即可 
  3.  */  
  4. public interface StudentDao extends BaseDao<Student> {  
  5. }  

 

注意DAO类是一个接口而不是class,继承BaseDao<Student>其中带有泛型参数Student,表示对Student表操作

BaseDao中增删改查已经封装好了,因此子类也具有同样功能


Service

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @Service  
  2. public class StudentService extends CrudService<Student, StudentDao> {      
  3. }  

Service层继承了CrudService<Student, StudentDao>,表示这个Service具有增删改查功能

其中两个泛型参数,Student表示操作的表,StudentDao表示把这个类注入到Service中

启动时会自动把StudentDao注入到StudentService中


Controller

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @Controller  
  2. public class StudentCrudController extends CrudController<Student, StudentService> {  
  3.       
  4.     // 模拟表单提交  
  5.     // http://localhost/durcframeworkTest/addStudent.do?name=Lucy&stuNo=No0000197&address=USA&mobile=13345678951&birthday=1987-07-06  
  6.     @RequestMapping("/addStudent.do")  
  7.     public ModelAndView addStudent(Student student) {  
  8.         ModelAndView mav = this.save(student);  
  9.         System.out.println("添加后的主键ID:"+ student.getId());  
  10.         return mav;  
  11.     }  
  12.       
  13.     // http://localhost/durcframeworkTest/listStudent.do  
  14.     @RequestMapping("/listStudent.do")  
  15.     public ModelAndView listStudent(SearchStudentEntity searchStudentEntity) {  
  16.         return this.queryByEntity(searchStudentEntity);  
  17.     }  
  18.       
  19.     // 模拟表单提交,修改姓名为Lily  
  20.     // http://localhost/durcframeworkTest/updateStudent.do?id=39&name=Lily  
  21.     @RequestMapping("/updateStudent.do")  
  22.     public ModelAndView updateStudent(Student student) {  
  23.         return this.update(student);  
  24.     }  
  25.       
  26.     // 传一个id值即可,根据主键删除  
  27.     // http://localhost/durcframeworkTest/delStudent.do?id=39  
  28.     @RequestMapping("/delStudent.do")  
  29.     public ModelAndView delStudent(Student student) {  
  30.         // 通过主键查询某一条记录  
  31.         System.out.println(this.getService().get(student.getId()));  
  32.         return this.delete(student);  
  33.     }  
  34.       
  35. }  


类似Service,Controller也只需要做简单继承即可,Service会自动注入到Controller中.这四个方法对应了增删改查.

查询类

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class SearchStudentEntity extends SearchEasyUI{  
  2.   
  3.     private Integer schId;  
  4.     private String schName;  
  5.     private Integer schPoliticsStatus;  
  6.     private String schNationality;  
  7.     private String schStuNo;  
  8.     private Integer[] schGender;  
  9.     private Integer schDepartment;  
  10.     private String schAddress;  
  11.     private String schMobile;  
  12.     private Date schRegistDateStart;  
  13.     private Date schRegistDateEnd;  
  14.     private Date schBirthday;  
  15.   
  16.     public void setSchId(Integer schId) {  
  17.         this.schId = schId;  
  18.     }  
  19.   
  20.     @ValueField(column = "id")  
  21.     public Integer getSchId() {  
  22.         return this.schId;  
  23.     }  
  24.   
  25.     public void setSchName(String schName) {  
  26.         this.schName = schName;  
  27.     }  
  28.   
  29.     @ValueField(column = "name",equal="like")  
  30.     public String getSchName() {  
  31.         return this.schName;  
  32.     }  
  33.   
  34.     public void setSchPoliticsStatus(Integer schPoliticsStatus) {  
  35.         this.schPoliticsStatus = schPoliticsStatus;  
  36.     }  
  37.   
  38.     @ValueField(column = "politicsStatus")  
  39.     public Integer getSchPoliticsStatus() {  
  40.         return this.schPoliticsStatus;  
  41.     }  
  42.   
  43.     public void setSchNationality(String schNationality) {  
  44.         this.schNationality = schNationality;  
  45.     }  
  46.   
  47.     @ValueField(column = "nationality")  
  48.     public String getSchNationality() {  
  49.         return this.schNationality;  
  50.     }  
  51.   
  52.     public void setSchStuNo(String schStuNo) {  
  53.         this.schStuNo = schStuNo;  
  54.     }  
  55.   
  56.     @ValueField(column = "stu_No")  
  57.     public String getSchStuNo() {  
  58.         return this.schStuNo;  
  59.     }  
  60.   
  61.     @ListField(column = "gender")  
  62.     public Integer[] getSchGender() {  
  63.         return schGender;  
  64.     }  
  65.   
  66.     public void setSchGender(Integer[] schGender) {  
  67.         this.schGender = schGender;  
  68.     }  
  69.   
  70.     public void setSchDepartment(Integer schDepartment) {  
  71.         this.schDepartment = schDepartment;  
  72.     }  
  73.   
  74.     @ValueField(column = "department")  
  75.     public Integer getSchDepartment() {  
  76.         return this.schDepartment;  
  77.     }  
  78.   
  79.     public void setSchAddress(String schAddress) {  
  80.         this.schAddress = schAddress;  
  81.     }  
  82.   
  83.     @ValueField(column = "address")  
  84.     public String getSchAddress() {  
  85.         return this.schAddress;  
  86.     }  
  87.   
  88.     public void setSchMobile(String schMobile) {  
  89.         this.schMobile = schMobile;  
  90.     }  
  91.   
  92.     @ValueField(column = "mobile")  
  93.     public String getSchMobile() {  
  94.         return this.schMobile;  
  95.     }  
  96.       
  97.     @ValueField(column="regist_date",equal=">=")  
  98.     public Date getSchRegistDateStart() {  
  99.         return schRegistDateStart;  
  100.     }  
  101.   
  102.     public void setSchRegistDateStart(Date schRegistDateStart) {  
  103.         this.schRegistDateStart = schRegistDateStart;  
  104.     }  
  105.   
  106.     @ValueField(column="regist_date",equal="<")  
  107.     public Date getSchRegistDateEnd() {  
  108.         if(schRegistDateEnd != null){  
  109.             return DateUtil.getDateAfterDay(schRegistDateEnd, 1);  
  110.         }  
  111.         return schRegistDateEnd;  
  112.     }  
  113.   
  114.     public void setSchRegistDateEnd(Date schRegistDateEnd) {  
  115.         this.schRegistDateEnd = schRegistDateEnd;  
  116.     }  
  117.   
  118.     public void setSchBirthday(Date schBirthday) {  
  119.         this.schBirthday = schBirthday;  
  120.     }  
  121.   
  122.     @ValueField(column = "birthday")  
  123.     public Date getSchBirthday() {  
  124.         return this.schBirthday;  
  125.     }  
  126.   
  127. }  

@ValueField注解表示单值查询,支持like模糊查询,即name = 'jim'

@ListField表示多值查询,即xxx in (y,z)

项目整体结构图:

 

 

后台准备工作,请查看:http://blog.csdn.net/thc1987/article/details/33721833

前台页面:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@ include file="../../taglib.jsp" %>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8. <title>学生管理</title>  
  9. <style type="text/css">  
  10.     .stu_cont{padding: 1px;}  
  11.     .fitem{margin: 4px;}  
  12. </style>  
  13. </head>  
  14. <body>  
  15. <div class="stu_cont">  
  16.   
  17.     <div id="toolbar">  
  18.         <a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true" onclick="newUser()">添加学生</a>  
  19.     </div>  
  20.     <table id="dg" title="学生信息" class="easyui-datagrid"  
  21.             url="${ctx}listStudent.do"  
  22.             toolbar="#toolbar" pagination="true"  
  23.             rownumbers="false" fitColumns="true" singleSelect="true">  
  24.         <thead>  
  25.             <tr>  
  26.                 <th data-options="field:'stuNo',sortable:true,width:20">学号</th>  
  27.                 <th data-options="field:'name',width:20">姓名</th>  
  28.                 <th data-options="field:'gender',width:20,formatter:formatGender">性别</th>  
  29.                 <th data-options="field:'nationality',width:20">名族</th>  
  30.                 <th data-options="field:'address',width:50,formatter:formatAddr">家庭地址</th>  
  31.                 <th data-options="field:'mobile',width:20">手机号</th>  
  32.                 <th data-options="field:'birthday',width:20">出生日期</th>  
  33.                 <th data-options="field:'registDate',sortable:true,width:20">入学时间</th>  
  34.                 <th data-options="field:'_operate',width:80,align:'center',formatter:formatOper">操作</th>  
  35.             </tr>  
  36.         </thead>  
  37.     </table>  
  38.       
  39.     <div id="dlg" class="easyui-dialog" style="width:500px;height:380px;padding:10px 20px"  
  40.             closed="true" modal="true" buttons="#dlg-buttons">  
  41.         <form id="fm" method="post" novalidate>  
  42.             <div class="fitem">  
  43.                 <label>学号:</label>  
  44.                 <input name="stuNo" class="easyui-validatebox" required="true">  
  45.             </div>  
  46.             <div class="fitem">  
  47.                 <label>姓名:</label>  
  48.                 <input name="name" class="easyui-validatebox" required="true">  
  49.             </div>  
  50.             <div class="fitem">  
  51.                 <label>性别:</label>  
  52.                 <select class="easyui-combobox" name="gender" style="width:100px;" required="true">  
  53.                     <option value="1" selected></option>  
  54.                     <option value="0"></option>  
  55.                 </select>  
  56.             </div>  
  57.             <div class="fitem">  
  58.                 <label>名族:</label>  
  59.                 <input name="nationality">  
  60.             </div>  
  61.             <div class="fitem">  
  62.                 <label>政治面貌:</label>  
  63.                 <select class="easyui-combobox" name="politicsStatus" style="width:100px;" required="true">  
  64.                     <option value="0" selected>群众</option>  
  65.                     <option value="1">共青团员</option>  
  66.                     <option value="2">党员</option>  
  67.                 </select>  
  68.             </div>  
  69.             <div class="fitem">  
  70.                 <label>手机号:</label>  
  71.                 <input name="mobile">  
  72.             </div>  
  73.             <div class="fitem">  
  74.                 <label>联系地址:</label>  
  75.                 <input name="address">  
  76.             </div>  
  77.             <div class="fitem">  
  78.                 <label>出生日期:</label>  
  79.                 <input name="birthday" class="easyui-datebox">  
  80.             </div>  
  81.             <div class="fitem">  
  82.                 <label>入学时间:</label>  
  83.                 <input name="registDate" class="easyui-datebox" required="true">  
  84.             </div>  
  85.               
  86.         </form>  
  87.     </div>  
  88.     <div id="dlg-buttons">  
  89.         <a href="#" class="easyui-linkbutton" iconCls="icon-ok" onclick="saveUser()">保存</a>  
  90.         <a href="#" class="easyui-linkbutton" iconCls="icon-cancel" onclick="javascript:$('#dlg').dialog('close')">取消</a>  
  91.     </div>  
  92.       
  93. </div>  
  94. <jsp:include page="../../easyui_lib.jsp"></jsp:include>  
  95. <script type="text/javascript">  
  96. var url;  
  97. function newUser(){  
  98.     $('#dlg').dialog('open').dialog('setTitle','添加学生');  
  99.     $('#fm').form('clear');  
  100.     url = '${ctx}addStudent.do';  
  101. }  
  102. function editUser(index){  
  103.     $('#dg').datagrid('selectRow',index);  
  104.     var row = $('#dg').datagrid('getSelected');  
  105.     if (row){  
  106.         $('#dlg').dialog('open').dialog('setTitle','修改学生信息');  
  107.         $('#fm').form('clear').form('load',row);  
  108.         url = '${ctx}updateStudent.do?id='+row.id;  
  109.     }  
  110. }  
  111. function saveUser(){  
  112.     $('#fm').form('submit',{  
  113.         url: url,  
  114.         onSubmit: function(){  
  115.             return $(this).form('validate');  
  116.         },  
  117.         success: function(result){  
  118.             var result = eval('('+result+')');  
  119.             if (result.success){  
  120.                 $('#dlg').dialog('close');      // close the dialog  
  121.                 $('#dg').datagrid('reload');    // reload the user data  
  122.             } else {  
  123.                 var errorMsg = result.errorMsg;  
  124.                 errorMsg = errorMsg || buildValidateError(result)  
  125.                 $.messager.show({  
  126.                     title: 'Error',  
  127.                     msg: errorMsg,  
  128.                     style:{  
  129.                         right:'',  
  130.                         top:document.body.scrollTop+document.documentElement.scrollTop,  
  131.                         bottom:''  
  132.                     }  
  133.                 });  
  134.             }  
  135.         }  
  136.     });  
  137. }  
  138.   
  139. function buildValidateError(result){  
  140.     var validateErrors = result.validateErrors;  
  141.     return validateErrors.join('<br>')  
  142. }  
  143.   
  144. function removeUser(index){  
  145.     $('#dg').datagrid('selectRow',index);  
  146.     var row = $('#dg').datagrid('getSelected');  
  147.     if (row){  
  148.         $.messager.confirm('Confirm','确定要删除该学生('+row.name+')的信息吗?',function(r){  
  149.             if (r){  
  150.                 $.post('${ctx}delStudent.do',{id:row.id},function(result){  
  151.                     if (result.success){  
  152.                         $('#dg').datagrid('reload');    // reload the user data  
  153.                     } else {  
  154.                         $.messager.show({   // show error message  
  155.                             title: 'Error',  
  156.                             msg: result.errorMsg  
  157.                         });  
  158.                     }  
  159.                 },'json');  
  160.             }  
  161.         });  
  162.     }  
  163. }  
  164. function formatOper(val,row,index){  
  165.     return '<a href="#" onclick="editUser('+index+')">修改</a>'+  
  166.         ' | <a href="#" onclick="removeUser('+index+')">删除</a>';  
  167. }  
  168. function formatGender(val,row){  
  169.     return val == 1 ? '男' : '女';  
  170. }  
  171. function formatAddr(val,row){  
  172.     val = val || "";  
  173.     if(val.length>20) {  
  174.         var showAddr = (val||'').substring(0,10) + "...";  
  175.         return '<div title="'+val+'">'+showAddr+'</div>';  
  176.     }else{  
  177.         return val;  
  178.     }  
  179. }  
  180. </script>  
  181. </body>  
  182. </html>  


代码不是很多,效果图:

 

 

 

源代码以及更多例子请访问github:https://github.com/durcframework/durcframework.test

框架源代码:https://github.com/durcframework/durcframework


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值