创建一个SpringBoot + springmvc + hibernateJPA + MyBatis的项目

1.使用Spring Tool Suite 创建一个Spring Starter Project工程

2.修改pom.xml文件:

 


	4.0.0

	org.springframework
	backendmanage
	0.1.0
	war

	
		org.springframework.boot
		spring-boot-starter-parent
		1.1.9.RELEASE
	

	
		
			org.springframework.boot
			spring-boot-starter-web
		
		
			org.springframework.boot
			spring-boot-starter-tomcat
			provided
		
		
			org.springframework.boot
			spring-boot-starter-thymeleaf
		
		
			org.springframework.boot
			spring-boot-starter-data-jpa
		
		
			com.h2database
			h2
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
		
			org.apache.httpcomponents
			httpclient
			3.0.1
			
		
		
			commons-codec
			commons-codec
			1.6
		
		
		
			com.microsoft.sqlserver
			sqljdbc4
			4.0
			
		
		
			commons-io
			commons-io
			2.4
		
		
			org.scala-lang
			scala-library
			2.10.4
		
		
		  org.mybatis
		  mybatis
		  3.2.7
		
		
		  org.mybatis
		  mybatis-spring
		  1.1.0
		
	

	
		com.sonymobile.sonyselect.music.Application
	

	
		web-music
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	

	
		
			spring-milestone
			https://repo.spring.io/libs-release
		

		
			org.jboss.repository.releases
			JBoss Maven Release Repository
			https://repository.jboss.org/nexus/content/repositories/releases
		
	

	
		
			spring-milestone
			https://repo.spring.io/libs-release
		
	

 
  

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   
	      *   
	      * @param clazz The class to introspect   
	      * @return the first generic declaration, or Object.class if cannot be determined   
	      */  
	     public static Class getActualReflectArgumentClass(Class clazz) {  
	         return getActualReflectArgumentClass(clazz, 0);  
	     }  
	   
	     /**   
	      * 通过反射,获得定义Class时声明的父类的范型参数的类型.   
	      * 如public BookManager extends GenricManager   
	      *   
	      * @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> mappedResults = new ArrayList>(); 
	private Long count = new Long(0);
	           
    @Override  
    public void handleResult(ResultContext context) { 
    	try{
    		@SuppressWarnings("unchecked")
			Map map = (Map) context.getResultObject();   
    		mappedResults.add(map);
    	} catch(Exception e){
    		count = Long.valueOf(context.getResultObject().toString());
    	}
    }   
       
    public List> 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




  
  
  
  
  
  
  
  	insert into pn_userinfo (sonyselectid) values(#{sonySelectId})
  
  
   


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{
    private Class type;
    private SqlSession session;
    
    @SuppressWarnings("unchecked")
	public MyBatisBaseDao(DataSource dataSource){
		type = (Class) 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 map = null;
    }

    public T get(Integer id) {
        return session.selectOne(getMethodPath("get"),id);
    }
    
    public List getList(T entity){
    	return session.selectList(getMethodPath("get", "List"), entity);
    }
    
    public List> getMapList(HashMap map){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(getMethodPath("get", "MapList"), map, mh);
    	return mh.getMappedResults();
    }
    
    public List> 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 extends MyBatisBaseDao 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> 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 {
	
	@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}
	 * 

This implementation is empty. */ @Override public void addFormatters(FormatterRegistry registry) { } /** * {@inheritDoc} *

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

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

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

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

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

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

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

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

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

This implementation is empty. */ @Override public void addViewControllers(ViewControllerRegistry registry) { } /** * {@inheritDoc} *

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

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,到此打住,以上内容仅供参考。

你可能感兴趣的:(web开发问题)