创建一个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,到此打住,以上内容仅供参考。
相关文章推荐
- 浅析Mybatis 在CS程序中的应用
- 解决Hibernate JPA中insert插入数据后自动执行select last_insert_id()
- SpringMVC+MyBatis项目总结(一)
- SpringMVC+MyBatis项目总结(二)
- MyBatis返回结果不稳定
- MyBatis通过反射建立一个对象的过程。
- springMVC+spring+Mybatis
- SpringMVC+mybatis+Spring框架整合+简单实现的demo
- Spring+mybatis+shiro+freemarker+ehcache+ldap+mongo
- 继续钟爱JdbcTemplate
- 基于全注解的Spring3.1 mvc、myBatis3.1、Mysql的轻量级项目
- Mybatis的几点小结
- 懒到极致:对mybatis的进一步精简
- [续] 懒到极致:对mybatis的进一步精简
- MyBatis Geneator 详解
- 深入了解MyBatis参数
- XML Referenced file contains errors
- mybatis执行批量更新batch update 的方法(oracle,mysql)