SpringMVC+Mybatis+mybatis-generator快速开发架构

这个是我自己搭建使用的架构,对于中小型项目使用该架构还是没有什么问题的,但是对于大型架构那么这个就不要去使用了,话不多说,直接开始架构步骤吧!


1.首先是Maven pom.xml

使用到的架包主要是spring里面的核心架包,以及mybatis的核心架包,对于数据分页我选择使用了com.github.pagehelper,它是一款mybatis插件,直接在mybaits-config.xml配置即可,这个之后后会介绍,数据源我们使用阿里的druid,权限管理则使用apache shrio。


<dependencies>
    <!-- mybatis与spring集成架包 -->
	    <dependency>
		  <groupId>org.mybatis</groupId>
		  <artifactId>mybatis-spring</artifactId>
		  <version>1.2.3</version>
		</dependency>
		<!--  mybastis架包 -->
		<dependency>
		  <groupId>org.mybatis</groupId>
		  <artifactId>mybatis</artifactId>
		  <version>3.3.0</version>
		</dependency>
		
		<!-- pringmvc 架包 -->
		<dependency>
		  <groupId>org.springframework</groupId>
		  <artifactId>spring-web</artifactId>
		  <version>4.2.4.RELEASE</version>
		</dependency>
		
		<!-- mybatis分页架包 -->
		<dependency>
		  <groupId>com.github.pagehelper</groupId>
		  <artifactId>pagehelper</artifactId>
		  <version>4.1.0</version>
		</dependency>
		
		
		<!-- net.sf.json -->
		<dependency>
		  <groupId>net.sf.json-lib</groupId>
		  <artifactId>json-lib</artifactId>
		  <version>2.4</version>
		</dependency>
		
		<!-- pring webmvc -->
		<dependency>
		  <groupId>org.springframework</groupId>
		  <artifactId>spring-webmvc</artifactId>
		  <version>4.2.4.RELEASE</version>
		</dependency>
		
		<!-- spring-tx -->
		<dependency>
		  <groupId>org.springframework</groupId>
		  <artifactId>spring-tx</artifactId>
		  <version>4.2.4.RELEASE</version>
		</dependency>
		
		<!-- c3p0 -->
		<dependency>
		  <groupId>org.hibernate</groupId>
		  <artifactId>hibernate-c3p0</artifactId>
		  <version>4.3.0.Beta3</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
		<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>druid</artifactId>
		    <version>1.1.0</version>
		</dependency>
		
		<!-- jsp -->
		<dependency>
		  <groupId>javax.servlet.jsp</groupId>
		  <artifactId>jsp-api</artifactId>
		  <version>2.2.1-b03</version>
		</dependency>
		
		<!-- servletAPI -->
 	   <dependency>
		  <groupId>javax.servlet</groupId>
		  <artifactId>servlet-api</artifactId>
		  <version>3.0-alpha-1</version>
		</dependency>
		
		
		<!-- spring jdbc -->
		<dependency>
		  <groupId>org.springframework</groupId>
		  <artifactId>spring-jdbc</artifactId>
		  <version>4.2.4.RELEASE</version>
		</dependency>
		
		<!-- common-fileupload -->
		<dependency>
		  <groupId>commons-fileupload</groupId>
		  <artifactId>commons-fileupload</artifactId>
		  <version>1.3.1</version>
		</dependency>
		
		<!-- aspectjweaver -->
		<dependency>
		  <groupId>org.aspectj</groupId>
		  <artifactId>aspectjweaver</artifactId>
		  <version>1.8.7</version>
		</dependency>
		
		
		<!-- shiro -->
		<dependency>
		  <groupId>org.apache.shiro</groupId>
		  <artifactId>shiro-web</artifactId>
		  <version>1.2.4</version>
		</dependency>
		
		<dependency>
		  <groupId>org.apache.shiro</groupId>
		  <artifactId>shiro-core</artifactId>
		  <version>1.2.4</version>
		</dependency>
		
		<!-- shiro-spring -->
		<dependency>
		  <groupId>org.apache.shiro</groupId>
		  <artifactId>shiro-spring</artifactId>
		  <version>1.2.4</version>
		</dependency>
		
		<!-- shiro-ehcache -->
		<dependency>
		  <groupId>org.apache.shiro</groupId>
		  <artifactId>shiro-ehcache</artifactId>
		  <version>1.2.4</version>
		</dependency>
		
		<!-- Oracle驱动包 -->	
		<dependency>
	    <groupId>com.oracle</groupId>
	    <artifactId>ojdbc6</artifactId>
	    <version>1.0</version>
	</dependency>
	
	<dependency>
	    <groupId>org.mybatis.generator</groupId>
	    <artifactId>mybatis-generator-core</artifactId>
	    <version>1.3.2</version>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/log4j/log4j -->
	<dependency>
	    <groupId>log4j</groupId>
	    <artifactId>log4j</artifactId>
	    <version>1.2.17</version>
	</dependency>
		
	<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
	<dependency>
	    <groupId>org.apache.poi</groupId>
	    <artifactId>poi</artifactId>
	    <version>3.15</version>
	</dependency>

2.spring配置文件

在bean.xml中主要是dataSource等实例进行配置,在加上 service与dao层的对象实例,其中我将service与dao层进行文件分离而已,这样层次清洗,代码如下!

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-4.2.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
         http://www.springframework.org/schema/tx 
         http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
         
    	
    
    	<context:property-placeholder location="classpath:jdbc.properties"/>
    
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
       
        <property name="url" value="${jdbc.url}" />  
	    <property name="username" value="${jdbc.username}" />  
	    <property name="password" value="${jdbc.password}" />  
	        
	    <!-- 配置初始化大小、最小、最大 -->  
	    <property name="initialSize" value="20" />  
	    <property name="minIdle" value="10" />   
	    <property name="maxActive" value="100" />  
	   
	    <!-- 配置获取连接等待超时的时间 -->  
	    <property name="maxWait" value="60000" />  
	   
	    <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
	    <property name="timeBetweenEvictionRunsMillis" value="60000" />  
	   
	    <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
	    <property name="minEvictableIdleTimeMillis" value="300000" />  
	    
	    <property name="validationQuery" value="SELECT 'x'" />  
	    <property name="testWhileIdle" value="true" />  
	    <property name="testOnBorrow" value="false" />  
	    <property name="testOnReturn" value="false" />  
	   
	    <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->  
	    <property name="poolPreparedStatements" value="true" />  
	    <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />  
	   
	    <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 -->  
	    <property name="filters" value="stat" />
        
    </bean>
    
    <bean id="druid-stat-interceptor"
        class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
    </bean>
    <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
        scope="prototype">
        <property name="patterns">
            <list>
                <value>com.goldenbridge.official.service.*</value>
                <value>com.goldenbridge.official.dao.*</value>
            </list>
        </property>
    </bean>
    <aop:config>
        <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut" />
    </aop:config>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 声明式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"
        proxy-target-class="true" />

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>  
    </bean>
    
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">   
          <constructor-arg index="0" ref="sqlSessionFactory" />   
    </bean>

	<!-- 打开Spring的Annotation支持 -->
		<context:annotation-config />
	
	<import resource="classpath:goldenbridge-dao.xml"/>
	<import resource="classpath:goldenbridge-service.xml"/>
	<import resource="classpath:goldenbridge-cxf.xml"/>
    <!--<import resource="classpath:goldenbridge-shiro.xml"/>
	 <import resource="classpath:goldenbridge-cxf.xml"/> -->
	
	
</beans>

3.myabits-generator配置

mybatis-generator配置文件如下

主要配置数据源的地址,以及生成的JavaBean、Mapper接口、以及Mapper.xml文件位置所在路径


<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE generatorConfiguration
   PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
   "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
	<context id="oracleTables">
		<commentGenerator>
			<property name="suppressDate" value="true" />
			<property name="suppressAllComments" value="true" />
			<property name="mergeable" value="true"></property>
		</commentGenerator>
		<jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"
			connectionURL="jdbc:oracle:thin:@192.168.2.254:1521:orcl" userId="certific"
			password="certific">

		</jdbcConnection>
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

		<javaModelGenerator targetPackage="com.goldenbridge.certificicsystem.model"
			targetProject="src/main/java">
			<property name="enableSubPackages" value="true" />
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
		<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
			<property name="enableSubPackages" value="true" />
		</sqlMapGenerator>
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="com.goldenbridge.certificicsystem.mapper"
			targetProject="src/main/java">
			<property name="enableSubPackages" value="true" />
		</javaClientGenerator>
		<table tableName="NEWS_INFO" domainObjectName="NewsInfo"></table>
	</context>
</generatorConfiguration>


myabits-generaotr运行主要依赖maven的org.mybatis.generator插件,pom.xml的插件配置代码如下!

<plugins>
    <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
         <configuration>
            <verbose>true</verbose>
            <overwrite>true</overwrite>
        </configuration>
        <dependencies>
        	<dependency>
		    <groupId>org.mybatis.generator</groupId>
		    <artifactId>mybatis-generator-core</artifactId>
		    <version>1.3.2</version>
		</dependency>
		<dependency>
	    <groupId>com.oracle</groupId>
	    <artifactId>classes12</artifactId>
	    <version>10.2.0.2.0</version>
	</dependency>
		<!-- https://mvnrepository.com/artifact/log4j/log4j -->
		<dependency>
		    <groupId>log4j</groupId>
		    <artifactId>log4j</artifactId>
		    <version>1.2.17</version>
		</dependency>
  </dependencies>
    </plugin>

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>1.7</source>
        <target>1.7</target>
        <encoding>UTF-8</encoding>
      </configuration>
    </plugin>
    </plugins>

运行方式则为:mybatis-generate:generator

4. mybatis配置

这个没什么好说的,主要是将mybatis-generator生成的Mapper.xml导入进去,以及配置PageHelper分页信息,代码如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	    <settings>
	        
	        <setting name="logImpl" value="STDOUT_LOGGING" />
	    </settings>
		<plugins>
				 <!-- com.github.pagehelper为PageHelper类所在包名 -->
		    <plugin interceptor="com.github.pagehelper.PageHelper">
		        <property name="dialect" value="oracle"/>
		        <!-- 该参数默认为false -->
		        <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
		        <!-- 和startPage中的pageNum效果一样-->
		        <property name="offsetAsPageNum" value="true"/>
		        <!-- 该参数默认为false -->
		        <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
		        <property name="rowBoundsWithCount" value="true"/>
		        <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
		        <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
		        <property name="pageSizeZero" value="true"/>
		        <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
		        <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
		        <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
		        <property name="reasonable" value="true"/>
		        <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
		        <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
		        <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
		        <property name="params" value="pageNum=start;pageSize=limit;pageSizeZero=zero;reasonable=heli;count=contsql"/>
		    </plugin>
	</plugins>
	<!-- 实体接口映射资源 -->
	<!--
		说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml
	-->
	
	<mappers>
	
		<mapper resource="mapper/NewsInfoMapper.xml"/>

	</mappers>

</configuration>  

5.SpringMVC配置

springmvc配置不多说,文件如下

<?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:mvc="http://www.springframework.org/schema/mvc" 
    	xsi:schemaLocation="http://www.springframework.org/schema/beans   
      http://www.springframework.org/schema/beans/spring-beans-4.0.xsd    
      http://www.springframework.org/schema/context    
      http://www.springframework.org/schema/context/spring-context-4.0.xsd    
      http://www.springframework.org/schema/mvc    
      http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
      
	 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
	 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
	    <property name="messageConverters">  
	        <list>  
	            <bean class="com.goldenbridge.certificicsystem.utils.UTF8StringHttpMessageConverter" />  
	        </list>  
	    </property> 
	    <property name="webBindingInitializer">
			<bean
				class="com.goldenbridge.certificicsystem.utils.MyWebBindingInitializer" />
		</property> 
	</bean>
	 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	 	<property name="defaultEncoding" value="utf-8"></property>
	 	<property name="maxUploadSize" value="102857600"></property>
	 </bean>
	 <context:component-scan base-package="com.goldenbridge.certificicsystem.controller" />
</beans>

web.xml配置如下

其中SimpleCORSFilter主要是为了允许跨域访问而配置的

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
      <welcome-file>pages/index.html</welcome-file>
  </welcome-file-list>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- Spring 的监听器可以通过这个上下文参数来获取beans.xml的位置 -->

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:beans.xml</param-value>
  </context-param>
  
  
  <servlet>
  		<servlet-name>certificicsystem</servlet-name>
  		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  		<servlet-name>certificicsystem</servlet-name>
  		<url-pattern>/</url-pattern>
  </servlet-mapping>
  
  <filter>  
    <filter-name>encodingFilter</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>encodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
  </filter-mapping>
  
  <filter> 
  	<filter-name>DruidWebStatFilter</filter-name>  
        <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>  
      </filter>  
      <filter-mapping>  
        <filter-name>DruidWebStatFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
      </filter-mapping>      
	 <servlet>  
        <servlet-name>DruidStatView</servlet-name>  
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>DruidStatView</servlet-name>  
        <url-pattern>/druid/*</url-pattern>  
    </servlet-mapping>
    
    
    <filter>  
     <filter-name>SimpleCORSFilter</filter-name>  
     <filter-class>com.goldenbridge.certificicsystem.utils.SimpleCORSFilter</filter-class>  
  </filter>  
  <filter-mapping>  
      <filter-name>SimpleCORSFilter</filter-name>  
      <url-pattern>/*</url-pattern>  
  </filter-mapping>
    
</web-app>


以上核心配置文件就到这里结束了


6.底层核心代码

为了是开发更加的简单,不用再去为每个Bean对象去写一套底层的crud的dao层代码,我通过泛型与反射技术编写了一套通用的底层代码BaseDao,主要封装了crud等方法,之后通过类继承的方式集成BaseDao则就可以自动实现,代码如下

BaseDao.java

package com.goldenbridge.certificicsystem.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

import com.goldenbridge.certificicsystem.model.PageBean;

public interface BaseDao<T,S> {
	
	PageBean findByExample(PageBean<T> pagebean,S arg0);
	
	T getBeanById(String id);
	
	T getByName(String name);
	
	T getByExample(S arg0);
	
	void insert(T t);
	
	void update(T t);
	
	void delete(String id);
	
	void deleteByExample(S s);
	
	List<T> findAll();
	
	List<T> findListByExample(S s);
	
	SqlSession getSession();
	
	int count(S s);
	
	
	String getSequencesByName(String name);

	Map<String, Object> executeSql(String sql,String value[]);
}

BaseDaoImpl.java

package com.goldenbridge.certificicsystem.dao.impl;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils;

import com.github.pagehelper.PageHelper;
import com.goldenbridge.certificicsystem.dao.BaseDao;
import com.goldenbridge.certificicsystem.model.PageBean;

public class BaseDaoImpl<T,S> extends BeanFactoryAnnotationUtils implements BaseDao<T, S>{
	
	@Resource SqlSessionTemplate sqlSession;
	
	protected Class clazz_t,clazz_s;
	protected Object object;
	protected T t;
	protected S s;
	protected Method method;
	protected Class mapperclass;
	
	public BaseDaoImpl(){
		ParameterizedType pt = null;
		try {
			pt =  (ParameterizedType) this.getClass().getGenericSuperclass();
		} catch (Exception e1) {
			pt =  (ParameterizedType) this.getClass().getSuperclass().getGenericSuperclass();
		}
		
		clazz_t = (Class) pt.getActualTypeArguments()[0];
		clazz_s = (Class) pt.getActualTypeArguments()[1];
		//String mapperClassName = clazz_t.getName()+"Mapper";
		String classname = clazz_t.getName();
		classname = classname.substring(0,classname.lastIndexOf("."));
		classname = classname.substring(0,classname.lastIndexOf(".")+1);
		String mapperClassName = classname +"mapper."+ clazz_t.getSimpleName() + "Mapper";
		try {
			mapperclass = Class.forName(mapperClassName);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public PageBean<T> findByExample(PageBean<T> pagebean,S arg0){//根据条件查询集合分页
			List<T> list = null;
			try {
				object = sqlSession.getMapper(mapperclass);
				method = object.getClass().getDeclaredMethod("selectByExample", clazz_s);
				PageHelper.startPage(pagebean.getPagenow(), pagebean.getPagesize());
				list = (List<T>) method.invoke(object, arg0);
				pagebean.setList(list);
				method = object.getClass().getDeclaredMethod("countByExample", clazz_s);
				Integer count = (Integer) method.invoke(object, arg0);
				pagebean.setCount(count);
				object = null;
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				method = null;
			}
			return pagebean;
	}
	
	public T getBeanById(String id){//通过id查询对象
		T t = null;
			try {
				object = sqlSession.getMapper(mapperclass);
				method = object.getClass().getDeclaredMethod("selectByPrimaryKey", id.getClass());
				t = (T) method.invoke(object, id);
				object = null;
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				method = null;
			}
			
		return t;
		
	}
	
	
	
	public int count(S s){//插入方法
		int resutl = 0;
		try {
			object = sqlSession.getMapper(mapperclass);
			method = object.getClass().getDeclaredMethod("countByExample", s.getClass()); //通过反射获取方法对象
			resutl = (int) method.invoke(object, s); //执行方法
			object = null;
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
		
		return resutl;
	}
	
	public void insert(T t){//插入方法
		try {
			object = sqlSession.getMapper(mapperclass);
			method = object.getClass().getDeclaredMethod("insert", t.getClass()); //通过反射获取方法对象
			method.invoke(object, t); //执行方法
			object = null;
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
	}
	
	public void update(T t){
		try {
			object = sqlSession.getMapper(mapperclass);
			method = object.getClass().getDeclaredMethod("updateByPrimaryKeySelective", clazz_t);//getDeclaredMethod()获取类的方法实例
			method.invoke(object, t);//invoke执行这个方法
			object = null;
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
		
		
	}
	
	public void delete(String id){
		try {
			object = sqlSession.getMapper(mapperclass);
			method = object.getClass().getDeclaredMethod("deleteByPrimaryKey", id.getClass());
			method.invoke(object, id);
			object = null;
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
	}

/*
	public void setBeanFactory(BeanFactory arg0) throws BeansException { //获取spring容器
		this.beanFactory = arg0;
		
		ParameterizedType pt =  (ParameterizedType) this.getClass().getSuperclass().getGenericSuperclass();
		clazz_t = (Class) pt.getActualTypeArguments()[0];
		clazz_s = (Class) pt.getActualTypeArguments()[1];
		System.out.println(clazz_t+":"+clazz_s);
		try {
			t = (T) clazz_t.newInstance();
			s = (S) clazz_s.newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
		String className = clazz_t.getSimpleName();
		String indexstart = className.substring(0, 1);
		className = indexstart.toLowerCase()+className.substring(1);
		object = beanFactory.getBean(className+"Mapper");
		
	}
*/
	public List<T> findAll() {
		List<T> list = null;
		try {
			object = sqlSession.getMapper(mapperclass);
			method = object.getClass().getDeclaredMethod("selectByExample", clazz_s);
			
			list = (List<T>) method.invoke(object,clazz_s.newInstance());
			object = null;
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
		return list;
	}

	public T getByName(String name) {
		T t = null;
		try {
			object = sqlSession.getMapper(mapperclass);
			method = object.getClass().getDeclaredMethod("selectByExample", clazz_s);
			Object S_Example = clazz_s.newInstance();
			Method s_method = clazz_s.getDeclaredMethod("createCriteria");
			Object Criteria = s_method.invoke(S_Example);
			Method[] methods = Criteria.getClass().getMethods();
			Method EqualToName = Criteria.getClass().getMethod("andNameEqualTo", String.class);
			
			EqualToName.invoke(Criteria, name);
			List<T> list = (List<T>) method.invoke(object, S_Example);
			if(list != null && list.size() > 0){
				t = list.get(0);
			}
			object = null;
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
		return t;
	}
	
	public List<T> findListByExample(S arg0) {//根据条件查询集合
		List<T> list = null;
		try {
			object = sqlSession.getMapper(mapperclass);
			method = object.getClass().getDeclaredMethod("selectByExample", clazz_s);
			list = (List<T>) method.invoke(object, arg0);
			object = null;
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
		return list;
	}
	
	
	@Override
	public void deleteByExample(S s) {
		try {
			object = sqlSession.getMapper(mapperclass);
			method = object.getClass().getDeclaredMethod("deleteByExample", clazz_s);
			method.invoke(object, s);
			object = null;
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
		
	}

	@Override
	public T getByExample(S arg0) {
		T result = null;
		List<T> list = null;
		try {
			object = sqlSession.getMapper(mapperclass);
			method = object.getClass().getDeclaredMethod("selectByExample", clazz_s);
			list = (List<T>) method.invoke(object, arg0);
			if(list !=null && list.size() > 0)
				result = list.get(0);
			object = null;
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method = null;
		}
		return result;
	}
	
	@Override
	public SqlSession getSession() {
		return sqlSession;
	}

	@Override
	public String getSequencesByName(String name) {
		String result = sqlSession.selectOne("com.goldenbridge.certificicsystem.mapper.BaseUtils.getSequencesByName", name);
		/*Connection conn = sqlSession.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select "+name+".NEXTVAL FROM DUAL";
		try {
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			if(rs.next()){
				result = rs.getString("NEXTVAL");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(rs != null){
					rs.close();
					rs = null;
				}
				if(ps != null){
					ps.close();
					ps = null;
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}*/
		
		return result;
	}
	
	@Override
	public Map<String, Object> executeSql(String sql,String values[]){
		Map<String, Object> result=new HashMap<String, Object>();
		Connection conn = sqlSession.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			if(rs.next()){
				for(String value:values){
					if(StringUtils.isNotBlank(rs.getString(value.toUpperCase()))){
						result.put(value, rs.getString(value.toUpperCase()));
					}
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(rs != null){
					rs.close();
					rs = null;
				}
				if(ps != null){
					ps.close();
					ps = null;
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result;
	}
}

如果需要创建Bean的Dao层代码,则只需要集成BaseDao就行了,里面的泛型对象文JavaBean与JavaBeanExample,这两个对象都是mybatis-generator生成的,不用手动创建,代码如下!

Dao层

NewsInfoDao.java

package com.goldenbridge.certificicsystem.dao;

import com.goldenbridge.certificicsystem.model.NewsInfo;
import com.goldenbridge.certificicsystem.model.NewsInfoExample;

public interface NewsInfoDao extends BaseDao<NewsInfo, NewsInfoExample>{

}
NewsInfoDaoImpl.java

package com.goldenbridge.certificicsystem.dao.impl;

import com.goldenbridge.certificicsystem.dao.NewsInfoDao;
import com.goldenbridge.certificicsystem.model.NewsInfo;
import com.goldenbridge.certificicsystem.model.NewsInfoExample;

public class NewsInfoDaoImpl extends BaseDaoImpl<NewsInfo, NewsInfoExample> implements NewsInfoDao{

}

Service层

在Service层一样,这里只需要基层Dao层就行了,代码就不粘贴了!


Controller层

该层与平时使用SpringMVC一样没什么其他区别,代码类型如下!


package com.goldenbridge.certificicsystem.controller;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.goldenbridge.certificicsystem.model.CgbRole;
import com.goldenbridge.certificicsystem.model.CgbRoleExample;
import com.goldenbridge.certificicsystem.model.CgbUser;
import com.goldenbridge.certificicsystem.model.PageBean;
import com.goldenbridge.certificicsystem.service.IAuthorityService;
import com.goldenbridge.certificicsystem.service.ICgbRoleService;
import com.goldenbridge.certificicsystem.utils.JSONTools;






import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

@Controller
@RequestMapping(value="/role")
public class RoleController {

	
	@Resource IAuthorityService authorityService;
	@Resource ICgbRoleService cgbRoleService;
	
	@RequestMapping(value="/menulist")
	public @ResponseBody String getMenuList() {
		JSONArray object = cgbRoleService.getAuthorityList(null);
		return object.toString();
	}
	
	
	/**
	 * @param sysRole
	 * @param request
	 * @return
	 */
	@RequestMapping(value="/add",method=RequestMethod.POST)
	public @ResponseBody String add(@ModelAttribute CgbRole sysRole,HttpServletRequest request){
		try {
			CgbRoleExample cgbRoleExample = new CgbRoleExample();
			cgbRoleExample.createCriteria().andRolenameEqualTo(sysRole.getRolename());
			CgbRole cgbRole=cgbRoleService.getByExample(cgbRoleExample);
			if(cgbRole !=null ){
				return JSONTools.formatJSONObjectToString(0, "角色名称项目", null);
			}
			cgbRoleService.addRole(sysRole, request);
			return JSONTools.formatJSONObjectToString(1, "操作成功!", null);
		} catch (Exception e) {
			e.printStackTrace();
			return JSONTools.formatJSONObjectToString(0, "操作异常", null);
		}
	}
	
	@RequestMapping(value="/search",method=RequestMethod.POST)
	public @ResponseBody String Search(int pagenow,HttpSession session){
		
		try {
			PageBean<CgbRole> pagebean = new PageBean<CgbRole>();
			pagebean.setPagenow(pagenow);
			CgbUser sysUser = (CgbUser) session.getAttribute("sysUser");
			cgbRoleService.search(pagebean,sysUser);
			return JSONTools.formatJSONObjectToString(1, "成功", pagebean);
		} catch (Exception e) {
			e.printStackTrace();
			return JSONTools.formatJSONObjectToString(0, "失败", null);
		}
	}
	
	@RequestMapping(value="/authority",method=RequestMethod.GET)
	public @ResponseBody String authority(HttpSession session){
		CgbUser sysUser = (CgbUser) session.getAttribute("sysUser");
		JSONObject jsonObject = cgbRoleService.getObjectAuthorityList(sysUser);
		return jsonObject.toString();
	}
	
	/**
	 * pengweikang 20161028 跳转到修改页面
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/{id}/update",method=RequestMethod.GET)
	public String toupdate(@PathVariable String id){
		return "role/update";
	}


代码差不多就这么多了,小伙伴赶紧动手试试吧!





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
mybatis也能方向生成代码,能方向生成实体类(po)、mapper接口和Mapper接口映射文件,能减少我们代码的工作量。详细步骤如下 1、下载mybatis生成架包工具MyBatis_Generator_1.3.1.zip,解压架包把features、plugins文件夹下的架包分别拷贝到eclipse安装目录下的features、plugins文件夹。重启eclipse就行。 解压后图片如下: Eclipse路径如图: 拷贝替换如图: 2、创建generatorConfig.xml文件,安装好mybatis 就能创建generatorConfig.xml 3、配置generatorConfig.xml配置文件,详细如下 [html] view plain copy <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <!-- <classPathEntry location="D:\\rep\\mysql\\mysql-connector-java\\5.1.19\\mysql-connector-java-5.1.19.jar" /> --> <classPathEntry location="D:\\repo\\com\\oracle\\ojdbc14\\10.2.0.1.0\\ojdbc14-10.2.0.1.0.jar" /> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressAllComments" value="true" /> <property name="suppressDate" value="true" /> </commentGenerator> <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:orcl4" userId="xxx" password="xxxx" /> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> </javaTypeResolver> <javaModelGenerator targetPackage="com.pcmall.domain.sale.order" targetProject="pos-service/src/main/java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <sqlMapGenerator targetPackage="mybatis.mapper.sale.order" targetProject="pos-service/src/main/resources"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <javaClientGenerator targetPackage="com.pcmall.dao.sale.order" targetProject="pos-service/src/main/java" type="XMLMAPPER"> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <table tableName="hs_zxzflx" enableSelectByExample="false" enableDeleteByExample="false" enableCountByExample="false" selectByExampleQueryId="true" enableUpdateByExample="false"> <!-- <generatedKey column="ID" sqlStatement="oracle" identity="true" /> --> </table> </context> </generatorConfiguration> 4、右击generatorConfig.xml 点击Generate MyBatis/iBATIS Artifacts 生成对应接口、接口映射文件、实体类 5、查看结果
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值