創建一個SpringBoot + springmvc + hibernateJPA + MyBatis的項目

1.使用Spring Tool Suite 創建一個Spring Starter Project工程

2.修改pom.xml文件:

 <pre class="html" name="code"><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>org.springframework</groupId>
	<artifactId>backendmanage</artifactId>
	<version>0.1.0</version>
	<packaging>war</packaging>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.1.9.RELEASE</version>
	</parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>3.0.1</version><!--$NO-MVN-MAN-VER$-->
			
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.6</version>
		
		</dependency>
		<dependency>
			<groupId>com.microsoft.sqlserver</groupId>
			<artifactId>sqljdbc4</artifactId>
			<version>4.0</version>
			
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>org.scala-lang</groupId>
			<artifactId>scala-library</artifactId>
			<version>2.10.4</version>
		</dependency>
		<dependency>
		  <groupId>org.mybatis</groupId>
		  <artifactId>mybatis</artifactId>
		  <version>3.2.7</version>
		</dependency>
		<dependency>
		  <groupId>org.mybatis</groupId>
		  <artifactId>mybatis-spring</artifactId>
		  <version>1.1.0</version>
		</dependency>
	</dependencies>

	<properties>
		<start-class>com.sonymobile.sonyselect.music.Application</start-class>
	</properties>

	<build>
		<finalName>web-music</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>spring-milestone</id>
			<url>https://repo.spring.io/libs-release</url>
		</repository>

		<repository>
			<id>org.jboss.repository.releases</id>
			<name>JBoss Maven Release Repository</name>
			<url>https://repository.jboss.org/nexus/content/repositories/releases</url>
		</repository>
	</repositories>

	<pluginRepositories>
		<pluginRepository>
			<id>spring-milestone</id>
			<url>https://repo.spring.io/libs-release</url>
		</pluginRepository>
	</pluginRepositories>

</project>

3.運行maven install, maven build

4.創建Application.java

/**
 * Copyright (c) 2014 Sony Mobile Communications Inc.
 * All rights, including trade secret rights, reserved.
 */
package com.sonychina.backend;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@ComponentScan
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages = "com.sonychina.backend.repository")
public class Application extends SpringBootServletInitializer {

	public static void main(String[] args) {
		SpringApplication app = new SpringApplication(Application.class);
		app.run(args);
		//SpringApplication.run(Application.class, args);
	}
	
	@Override
    	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        		return application.sources(Application.class);
    	}
}

5.配置文件

application.properties

spring.profiles.active=dev

application-dev.properties 

spring.datasource.url=jdbc:sqlserver://SEMCW14246:1433;DatabaseName=PlayNow_New
spring.datasource.username=sa
spring.datasource.password=hello123
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
# spring.jpa.hibernate.ddl-auto=update
spring.datasource.test-on-borrow=true
spring.datasource.test-while-idle=true
spring.datasource.validation-query=SELECT 1;
spring.jpa.hibernate.ddl-auto=none
spring.jpa.generate-ddl=true
spring.jpa.properties.hibernate.show_sql=true
spring.thymeleaf.cache=false

6.創建工具類

GenericsUtils.java

package com.test.backend.utility;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 一個處理泛型繼承類的泛型參數的工具類
 * @since 2015.7.14
 *
 */
public class GenericsUtils {
	/**   
	      * 通過反射,獲得定義Class時聲明的父類的範型參數的類型.   
	      * 如public BookManager extends GenricManager<Book>   
	      *   
	      * @param clazz The class to introspect   
	      * @return the first generic declaration, or <code>Object.class</code> if cannot be determined   
	      */  
	     public static Class<?> getActualReflectArgumentClass(Class<?> clazz) {  
	         return getActualReflectArgumentClass(clazz, 0);  
	     }  
	   
	     /**   
	      * 通過反射,獲得定義Class時聲明的父類的範型參數的類型.   
	      * 如public BookManager extends GenricManager<Book>   
	      *   
	      * @param clazz clazz The class to introspect   
	      * @param index the Index of the generic ddeclaration,start from 0.   
	      */  
	     public static Class<?> getActualReflectArgumentClass(Class<?> clazz, int index) throws IndexOutOfBoundsException {  
	   
	         Type genType = clazz.getGenericSuperclass();  
	         System.out.println("--------------Generic Super class type:" + genType.toString());
	   
	         if (!(genType instanceof ParameterizedType)) { 
	        	 if(index == 1){
	        		 return genType.getClass();
	        	 }
	        	 
	        	 return getActualReflectArgumentClass(genType.getClass(),index + 1);
	         }  
	   
	         Type[] params = ((ParameterizedType) genType).getActualTypeArguments();  
	   
	         if (index >= params.length || index < 0) {  
	             return Object.class;  
	         }  
	         if (!(params[index] instanceof Class)) {  
	             return Object.class;  
	         }  
	         return (Class<?>) params[index];  
	     }  

}

 

MapResultHandler.java

package com.test.backend.utility;

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

import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;

/**
 * 一個處理MyBatis的sql查詢返回結果類型的handler類
 * @since 2015.7.14
 *
 */
public class MapResultHandler implements ResultHandler{
	private final List<Map<String, Object>> mappedResults = new ArrayList<Map<String, Object>>(); 
	private Long count = new Long(0);
	           
    @Override  
    public void handleResult(ResultContext context) { 
    	try{
    		@SuppressWarnings("unchecked")
			Map<String, Object> map = (Map<String, Object>) context.getResultObject();   
    		mappedResults.add(map);
    	} catch(Exception e){
    		count = Long.valueOf(context.getResultObject().toString());
    	}
    }   
       
    public List<Map<String, Object>> getMappedResults() {   
        return mappedResults;   
    }   

    public Long getCount(){
    	return count;
    }
}


MyBatisUtil.java

package com.test.backend.utility;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

/**
 * MyBatis SqlSession獲取工具類,提供SqlSession生成,是一個安全的單例類
 * @since 2015.7.13
 *
 */
public class MyBatisUtil {
		
	private SqlSessionFactory sqlSessionFactory;
	private static MyBatisUtil myBatisUtil;
	
	private MyBatisUtil(DataSource dataSource){
		
		System.out.println("--------------------------myBatis initialize-----------------------");
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource); 
		PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();           
		try {
			//System.out.println(this.getClass().getResource("/MyBatisMapper.xml").toURI().toString());
			sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/MyBatisMapper.xml"));
			//System.out.println(sqlSessionFactoryBean.getObject() + ":" + dataSource);
			sqlSessionFactory = sqlSessionFactoryBean.getObject();
		} catch (Exception e) {
			throw new RuntimeException("MyBatis SqlSessionFactory init Error:" + e.getMessage());
		}
	}
	
	public static MyBatisUtil getInstance(DataSource dataSource){
		synchronized (dataSource) {
			if(myBatisUtil == null){
				myBatisUtil = new MyBatisUtil(dataSource);
			}
		}
		return myBatisUtil;
	}
	
	public SqlSession getSession() throws Exception{		
		return sqlSessionFactory.openSession(); 
	}
}

 

7.配置MyBatis的mapper文件,並創建MyBatisDao基類

MyBatisMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sonychina.statistic" >
  <!-- <sql id="Base_Column_List" >id, sonyselectid</sql>
  <select id="selectUserById" resultMap="com.sonychina.backend.entity.test.User" parameterType="java.lang.String" >
    select <include refid="Base_Column_List" />
    from t_user
    where user_id = #{userId,jdbcType=CHAR}
  </select> -->
  <select id="getUserCount" resultType="java.lang.Long">
  	select count(1) from pn_userinfo
  </select>
  <select id="getUser" resultType="com.sonychina.backend.entity.test.User" parameterType="java.lang.Integer" >
    select id, sonyselectid
      from pn_userinfo
     where id = #{id}
  </select>
  
  <select id="getUserMapList" resultType="java.util.HashMap">
    select id, sonyselectid
      from pn_userinfo
  </select>
  
  <insert id="saveUser" parameterType="com.sonychina.backend.entity.test.User" useGeneratedKeys="true"
    keyProperty="id">
  	insert into pn_userinfo (sonyselectid) values(#{sonySelectId})
  </insert>
  <!-- 
  <insert id="insertSelective" parameterType="me.gacl.domain.User" >
    insert into t_user
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="userId != null" >
        user_id,
      </if>
      <if test="userName != null" >
        user_name,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="userId != null" >
        #{userId,jdbcType=CHAR},
      </if>
      <if test="userName != null" >
        #{userName,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
   -->
   <cache eviction="LRU" flushInterval="86400000" size="256" readOnly="false"/>
</mapper>


MyBatisBaseDao

package com.test.backend.dao.base;

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

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;

import com.sonychina.backend.global.Constants;
import com.sonychina.backend.utility.GenericsUtils;
import com.sonychina.backend.utility.MapResultHandler;
import com.sonychina.backend.utility.MyBatisUtil;

public class MyBatisBaseDao<T>{
    private Class<T> type;
    private SqlSession session;
    
    @SuppressWarnings("unchecked")
	public MyBatisBaseDao(DataSource dataSource){
		type = (Class<T>) GenericsUtils.getActualReflectArgumentClass(this.getClass());
		System.out.println("------------- BaseMybatisDao initialize--------------------------");
		System.out.println("------------- T:" + type.toString());
		try {
			MyBatisUtil myBatisUtil = MyBatisUtil.getInstance(dataSource);
			session = myBatisUtil.getSession();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    
    private String getMethodPath(String methodType){
        return getMethodPath(methodType, "");
    }
    
    private String getMethodPath(String methodType, String methodSuffix){
        return Constants.MYBATIS_MAPPER_PRIX + methodType + type.getSimpleName() + methodSuffix;
    }
    
    public void save(T obj) {
        session.insert(getMethodPath("save"), obj);
    }

    public void delete(T obj) {
        session.delete(getMethodPath("delete"), obj);
    }

    public void update(T obj) {
        session.update(getMethodPath("update"), obj);
        //HashMap<String,Object> map = null;
    }

    public T get(Integer id) {
        return session.selectOne(getMethodPath("get"),id);
    }
    
    public List<T> getList(T entity){
    	return session.selectList(getMethodPath("get", "List"), entity);
    }
    
    public List<Map<String, Object>> getMapList(HashMap<String, Object> map){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(getMethodPath("get", "MapList"), map, mh);
    	return mh.getMappedResults();
    }
    
    public List<Map<String, Object>> getMapList(T entity){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(getMethodPath("get", "MapList"), entity, mh);
    	return mh.getMappedResults();
    }

    public Long getCount(){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(getMethodPath("get", "Count"), mh);
    	return mh.getCount();
    }
}


一個簡單的UserDaoImpl

/**
 * Copyright (c) 2014 Communications Inc.
 * All rights, including trade secret rights, reserved.
 */
package com.test.backend.dao.test;

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

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.sonychina.backend.dao.base.MyBatisBaseDao;
import com.sonychina.backend.entity.test.User;

@Component
public class UserDaoImpl<T extends com.sonychina.backend.entity.test.User> extends MyBatisBaseDao<User> implements UserDao {
	
	@Autowired
	public UserDaoImpl(DataSource dataSource) {
		super(dataSource);
	}

	@Override
	public User get(Integer id) {
		System.out.println("-----------getUserId:" + id + "[dao start]");
		User user = null;
		try{
			user = super.get(id);
		}catch(Exception e){
			e.printStackTrace();
		}
		return user;
	}

	@Override
	public void save(User user) {
		// TODO Auto-generated method stub
		super.save(user);
	}

	@Override
	public void delete(com.sonychina.backend.entity.test.User obj) {
		// TODO Auto-generated method stub
		
	}
	
	public Long getCount(){
		return super.getCount();
	}
	
	public List<Map<String, Object>> getMapList(){
		return super.getMapList(new User());
	}
}


8.使用JPA

BannerRepository.java

package com.test.backend.repository.test;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import com.sonychina.backend.entity.test.Banner;



public interface BannerRepository extends JpaRepository<Banner, Long> {
	
	@Modifying
	@Query("update Banner m set m.name=?1 where m.id=?2")
	public void update(String bannerName, Long id);

}

BannerServiceImpl.java

package com.test.backend.service.testHibernate;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.sonychina.backend.entity.test.Banner;
import com.sonychina.backend.repository.test.BannerRepository;

@Service
public class BannerServiceImpl implements BannerService {
	
	@Resource
	private BannerRepository bannerRepository;
	
	@Override
	public void saveBanner(Banner banner) {
		bannerRepository.save(banner);
	}

	@Override
	public Banner findBannerById(Long id) {
		return bannerRepository.getOne(id);
	}

	@Override
	public void updateBanner(String bannerName, Long id) {
		bannerRepository.update(bannerName, id);
	}

}


9.自定義SpringMVC的攔截器,但不破壞Spring Boot的默認加載和封裝

GlobalWebConfiguration.java

package com.test.backend.global;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.sonychina.backend.interceptor.TestUrlInterceptor;

@Configuration
public class GlobalWebConfiguration extends WebMvcConfigurerAdapter {
	
	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addFormatters(FormatterRegistry registry) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation returns {@code null}
	 */
	@Override
	public Validator getValidator() {
		return null;
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configurePathMatch(PathMatchConfigurer configurer) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
		
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public MessageCodesResolver getMessageCodesResolver() {
		return null;
	}
	
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new TestUrlInterceptor());
	}
	
	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
	}
	
}


TestUrlInterceptor.java

package com.test.backend.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class TestUrlInterceptor implements HandlerInterceptor {
	
	public TestUrlInterceptor(){
		System.out.println("--------------- TestUrlInterceptor initialize -------------");
	}
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
		throws Exception {
		
		if(request.getRequestURI().equals("/error")){
			System.out.println("------------------error path");
			//request.getRequestDispatcher("/invalidPage");
			response.sendRedirect("/invalidPage");
		}
		System.out.println("--------------TestUrlInterceptor work-----------------" + request.getRequestURI());
		
		return true;
	}
	
	/**
	 * This implementation is empty.
	 */
	@Override
	public void postHandle(
			HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
			throws Exception {
		
		if(modelAndView == null){
			modelAndView = new ModelAndView("error");
			throw new Exception("not find this path!!!!!");
		}
		System.out.println("-------------- TestUrlInterceptor post url -----------------" + modelAndView.getViewName());
	}
	
	/**
	 * This implementation is empty.
	 */
	@Override
	public void afterCompletion(
			HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		if(ex != null){
			System.out.println("-------------- TestUrlInterceptor completion -----------------" + ex.getMessage());
		}
	}
}


ok,到此打住,以上內容僅供參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章