web框架 Spring+SpringMvc+Jpa 纯注解搭建
0.jar包依赖 maven pom.xml
- <properties>
- <spring_version>4.3.25.RELEASE</spring_version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${spring_version}</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>3.1.0</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.9.10</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-jpa</artifactId>
- <version>1.11.23.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-entitymanager</artifactId>
- <version>3.6.10.Final</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-validator</artifactId>
- <version>4.1.0.Final</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>6.0.6</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${spring_version}</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>RELEASE</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
1.可被 servlet3.0 容器自动扫描加载的配置文件,位置不限,作用同 web.xml
- package com.sw946.spring_demo.config;
- import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
- public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
- protected Class<?>[] getRootConfigClasses() { // spring容器的配置文件
- return new Class[]{SpringConfig.class};
- }
- protected Class<?>[] getServletConfigClasses() { // springMVC容器的配置文件
- return new Class[]{MvcConfig.class};
- }
- protected String[] getServletMappings() { // 被DisatcjerServlet接管的请求路径
- return new String[]{"/"};
- }
- }
2.spring容器的配置文件,管理 除被springMvc容器管理(如控制器) 以外的所有对象,可防止织入事务切面时不生效的情况发生
- package com.sw946.spring_demo.config;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.servlet.config.annotation.EnableWebMvc;
- //申明为spring配置文件,spring若开启注解扫描,将会将此类作为spring容器配置的一部分
- @Configuration
- //开启注解扫描功能,并设置扫描范围,排除springMvc的配置文件和Controller组件
- @ComponentScan(basePackages = {"com.sw946.spring_demo"},excludeFilters = @ComponentScan.Filter({EnableWebMvc.class, Controller.class}))
- public class SpringConfig {
- }
3.springMvc容器的配置文件,仅管理自定义的控制器,与spring容器为互补
- package com.sw946.spring_demo.config;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.ComponentScan.Filter;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
- import org.springframework.web.servlet.config.annotation.EnableWebMvc;
- import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
- @Configuration
- //开启springMvc注解扫描功能
- @EnableWebMvc
- //仅扫描有@Controller注解的类纳入容器管理
- @ComponentScan(basePackages = "com.sw946.spring_demo",includeFilters = @Filter(Controller.class),useDefaultFilters = false)
- public class MvcConfig extends WebMvcConfigurerAdapter {
- @Override
- public void configureViewResolvers(ViewResolverRegistry registry) { //配置视图解析器(可选)
- registry.jsp("/", ".jsp");
- }
- //配置静态资源处理器,将对 / 路径下的静态资源请求映射为 对文件夹 classpath:/static/的请求,相比于默认静态资源处理器可指定映射到WEB-INFO的文件夹中(servlet默认规则下此目录不可访问)
- @Override
- public void addResourceHandlers(ResourceHandlerRegistry registry) {
- registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
- }
- }
4.JPA(数据持久化层)的配置文件,本例使用hibernate + mysql, 持久化框架和数据均可替换,配置思路相同
- package com.sw946.spring_demo.config;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
- import org.springframework.jdbc.datasource.DriverManagerDataSource;
- import org.springframework.orm.jpa.JpaTransactionManager;
- import org.springframework.orm.jpa.JpaVendorAdapter;
- import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
- import org.springframework.orm.jpa.vendor.Database;
- import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
- import org.springframework.transaction.PlatformTransactionManager;
- import org.springframework.transaction.annotation.EnableTransactionManagement;
- import javax.sql.DataSource;
- @Configuration
- //开启jpa注解扫描,并给定范围,jpa会为继承了JpaRepository接口的接口生成实现类
- @EnableJpaRepositories(basePackages = "com.sw946.spring_demo.repository")
- //开启事务管理功能
- @EnableTransactionManagement
- public class JpaConfig {
- @Bean
- public DataSource productDB() { //配置数据源,按实际要连接的数据库配置
- DriverManagerDataSource ds = new DriverManagerDataSource();
- ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
- ds.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC");
- ds.setUsername("admin");
- ds.setPassword("admin");
- return ds;
- }
- @Bean
- public JpaVendorAdapter jpaVendorAdapter() { //配置ORM框架,这里为hibernate
- HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
- adapter.setDatabase(Database.MYSQL);
- adapter.setShowSql(true);
- adapter.setGenerateDdl(false);
- adapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");
- return adapter;
- }
- @Bean
- public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){ //配置实体管理器工厂
- LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
- emf.setDataSource(dataSource);
- emf.setJpaVendorAdapter(jpaVendorAdapter);
- emf.setPackagesToScan("com.sw946.spring_demo.entity"); //给定实体类的扫描范围,会扫描@Entity注解的类
- return emf;
- }
- @Bean
- public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean factoryBean) {
- //配置事务管理器,依赖于实体管理器
- return new JpaTransactionManager(factoryBean.getObject());
- }
- }
框架配置完成,下面为使用示例:
a.控制器(注意包的位置,根据扫描范围配置建立)
- package com.sw946.spring_demo.controller;
- import com.sw946.spring_demo.repository.GradeRepository;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- @Controller
- public class HomeController {
- @Autowired
- private GradeRepository gradeRepository;
- @RequestMapping("/home")
- @ResponseBody
- public String home() {
- return gradeRepository.findLaster().toString();
- }
- }
b.持久层(因示例简单,忽略服务层)
- package com.sw946.spring_demo.repository;
- import com.sw946.spring_demo.entity.Grade;
- import org.springframework.data.jpa.repository.JpaRepository;
- import org.springframework.data.jpa.repository.Query;
- import org.springframework.stereotype.Repository;
- import java.util.List;
- @Repository
- public interface GradeRepository extends JpaRepository<Grade,String>{
- List<Grade> findByIdLessThan(String id); //方法名查询,jpa提供
- //JPql、原生sql查询
- @Query(nativeQuery=true, value = "select * from grade order by id desc limit 0,1")
- Grade findLaster();
- }
- package com.sw946.spring_demo.entity;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import java.util.Date;
- @Entity
- public class Grade {
- @Id
- private String id;
- private String name;
- @Column(name = "create_time")
- private Date createTime;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getCreateTime() {
- return createTime;
- }
- public void setCreateTime(Date createTime) {
- this.createTime = createTime;
- }
- @Override
- public String toString() {
- return "Grade{" +
- "id='" + id + '\'' +
- ", name='" + name + '\'' +
- ", createTime=" + createTime +
- '}';
- }
- }
c.数据库表
- CREATE TABLE `grade` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(50) DEFAULT NULL,
- `create_time` datetime DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
- INSERT INTO `grade` (`id`, `name`, `create_time`) VALUES ('', '', '2019-11-18 15:50:41');
- INSERT INTO `grade` (`id`, `name`, `create_time`) VALUES ('', '', '2019-11-18 17:32:56');
tomcat运行,访问 127.0.0.1:端口号/home ,即可看到数据库返回的json字符串,框架搭建完成!
web框架 Spring+SpringMvc+Jpa 纯注解搭建的更多相关文章
- spring+springMVC+JPA配置详解(使用缓存框架ehcache)
SpringMVC是越来越火,自己也弄一个Spring+SpringMVC+JPA的简单框架. 1.搭建环境. 1)下载Spring3.1.2的发布包:Hibernate4.1.7的发布包(没有使用h ...
- Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World(转发)
[JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World 来源:http://blog.csdn.net/zhshulin/article/de ...
- Spring SpringMVC SpringBoot SpringCloud 注解整理大全
Spring SpringMVC SpringBoot SpringCloud 注解整理 才开的博客所以放了一篇以前整理的文档,如果有需要添加修改的地方欢迎指正,我会修改的φ(๑˃∀˂๑)♪ Spri ...
- 【Spring Data 系列学习】Spring Data JPA @Query 注解查询
[Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...
- SSM框架——Spring+SpringMVC+Mybatis的搭建教程
一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP. S ...
- Maven 搭建 SSM框架——Spring+SpringMVC+Mybatis的搭建教程
一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP.Sp ...
- [JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World
来源:http://blog.csdn.net/zhshulin/article/details/37956105?utm_source=tuicool&utm_medium=referral ...
- SSM框架—Spring+SpringMVC+MyBatis
1.环境搭建 1.1概念 Spring是一个Java应用的开源框架,Bean/Context/Core/IOC/AOP/MVC等是其重要组件,IOC控制反转,AOP面向切面编程,各种注入方式,实现方式 ...
- spring+springmvc+ibatis整合注解方式实例【转】
源自-----> http://shaohan126448.iteye.com/blog/2033563 (1)web.xml文件(Tomcat使用) 服务器根据配置内容初始化spring框架, ...
随机推荐
- 创建本地repo源
1,保留rpm包 yum 安装时保留包至指定目录 编辑/etc/yum.conf 将keepcache的值设置为1: 2,使用插件 1,yum-plugin-downloadonly插件 sudo y ...
- 【杂题】[LibreOJ #6608] 无意识的石子堆【容斥原理】【FFT】
Description Solution 943718401=225*2^22+1 显然每行必须有两个,我们不妨枚举有k列有2个石子,那么有2(n-k)列有1个石子. \[Ans=\sum\limit ...
- MCMC & 贝叶斯
用MCMC做参数估计
- unittest详解(七) 自动生成测试报告
用例执行完成后,执行结果默认是输出在屏幕上,其实我们可以把结果输出到一个文件中,形成测试报告. unittest自带的测试报告是文本形式的,如下代码: import unittest if __nam ...
- Spark-PySpark sql各种内置函数
_functions = { 'lit': 'Creates a :class:`Column` of literal value.', 'col': 'Returns a :class:`Colum ...
- UE4 使用VaRest的最佳实践
背景介绍: 用Node.js,express,Mongo搭建了一个简单后台,为项目提供REST风格的API服务. 第一个查询是通过Get进行,返回一个json字符串. 在虚幻里使用VaRest来进行访 ...
- APUE学习之进程控制 - fork 与 vfork
最后编辑: 2019-11-6 版本: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 一.进程标识 每一个进程都有一个唯一的非 ...
- sqli-libs(3)
今天我们来讲解 sqli-libs(3) 有括号的单引号报错 首先我们来查看加入'看报错了 在加‘’ 没报错 证明 存在注入 然后我们看加入’的报错回显的是什么 和我们的sqli-libs(1)的报 ...
- maven web项目的web.xml报错The markup in the document following the root element must be well-formed.
maven项目里面的web.xml开头约束是这样的 <?xml version="1.0" encoding="UTF-8"?> <web-a ...
- opencv_将图像上的4个点按逆时针排序
1:代码如下: #include "stdafx.h" #include "cxcore.h" #include "cvcam.h" #in ...