这个是我自己搭建使用的架构,对于中小型项目使用该架构还是没有什么问题的,但是对于大型架构那么这个就不要去使用了,话不多说,直接开始架构步骤吧!
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";
}
代码差不多就这么多了,小伙伴赶紧动手试试吧!