您的位置:首页 > 编程语言 > Java开发

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

2015-07-16 16:07 1081 查看
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] instanceo
4000
f 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,到此打住,以上内容仅供参考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息