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