公司最近的项目一部分是在使用MyBatis,还有一部分使用SpringJPA,jpa平时没怎么用过,今天闲来无事做个增删改查的demo,记录下来。
环境;jdk 1.8
编辑器: IDEA
数据库:postgresql
首先贴上项目所需要的依赖
<?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>
<packaging>war</packaging>
<groupId>study.taihua.eh</groupId>
<artifactId>SIMS</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<jsp-version>2.1</jsp-version>
<jsp-about-scope>provided</jsp-about-scope>
<servlet-version>2.5</servlet-version>
<fastjson-version>1.2.47</fastjson-version>
<jackson-version>2.9.5</jackson-version>
<postgresql-version>42.2.2</postgresql-version>
<spring-version>4.3.11.RELEASE</spring-version>
<hibernate-version>5.0.11.Final</hibernate-version>
<!--<hibernate-jpa-version>1.0.0.Final</hibernate-jpa-version>-->
<druid-version>1.1.10</druid-version>
<spring-data-version>1.11.7.RELEASE</spring-data-version>
<junit-version>4.12</junit-version>
<junit-scope>test</junit-scope>
<javassist-version>3.11.0.GA</javassist-version>
<aspect-version>1.9.0</aspect-version>
</properties>
<dependencies>
<!--jsp相关-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-version}</version>
<scope>${jsp-about-scope}</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>${jsp-about-scope}</scope>
<version>${servlet-version}</version>
</dependency>
<!--转换json字符串所需要,此处使用fastjson,阿里大神们开发的-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson-version}</version>
</dependency>
<!--@ResponseBody注解所需要的json转换工具-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql-version}</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>${junit-scope}</scope>
</dependency>
<!--hibernate依赖-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate-version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate-version}</version>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
<!--读取字节码文件,当然,我也不知道他是干啥的-->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>${javassist-version}</version>
</dependency>
<!--springMVC相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<!--引入spring-data-jpa-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring-data-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/sims</path>
<port>8080</port>
</configuration>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<!--源码采用1.8-->
<source>1.8</source>
<!--打包使用1.8-->
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
我想说的是,大家在配置jpa的依赖的时候一定要考虑jar包版本问题,要根据spring-data-jpa的版本去配置spring其他jar的版本,不然,报的错误会让你欲仙欲死.如果实在担心版本选的不好,就按照我这个配置文件来就可以,这是我经过很多多次试验and百度其他大神的配置总结出来的,信誉有保证(随着功能的增加,我会更新这个配置)
我写的demo是个web工程,所以,先给你看一下目录结构和web.xml
工程目录结构:
对目录结构做个解释(见名知意的小伙伴可以后撤------------------------------------)
Contorller:即springMVC的controller层,相应前台浏览器请求
Entity:传统信息系统开发中MVC中的M(Model),代表实体类,在JPA中用Entity
Service:你猜猜是干嘛的。。。。。
Repository:对数据库的操作(曾经的Dao,在jpa里面他叫Repository)
-------------------------------------------------------我是帅帅的分割线------------------------------------------------------------------------------------------
接下来是web.xml的配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--通过上下文参数指定spring配置文件的位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext*.xml</param-value>
</context-param>
<!--spring框架的监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置springmvc前端控制器-->
<servlet>
<servlet-name>sims</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--可以不配置contextConfigLocation,但是框架会默认配置文件在:WEB-INF/servlet的name+"-servlet.xml"-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sims</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置文件很简单,不解释了
但是,我们现在要创建一些配置文件,文件目录结构如图
配置文件中都有注释,就暂时不解释了,直接贴代码:
首先是数据库连接信息文件pg.properties
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/taihua
jdbc.username=postgres
jdbc.password=123456
jdbc.initialSize=1
jdbc.minIdle=1
jdbc.maxActive=20
jdbc.maxWait=6000
然后是spring的相关配置文件
applicationContext-service :没啥太大作用,就是为了扫描service
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.sims.Service"/>
</beans>
applicationContext-dao:关于操作数据库的一些配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--加载属性文件,进行数据库链接-->
<context:property-placeholder location="classpath:db/pg.properties"/>
<!--注解事务开启-->
<tx:annotation-driven/>
<!--配置jpa仓库-->
<jpa:repositories base-package="com.sims.Repository" repository-impl-postfix="Impl"
transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>
<!--用于指定持久化实现厂商类,如hibernate为:org.hibernate.ejb.HibernateProvider 类。-->
<bean id="persistenceProvider" class="org.hibernate.jpa.HibernatePersistenceProvider"/>
<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="false"/>
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQL91Dialect"/>
<property name="database" value="POSTGRESQL"/>
<property name="showSql" value="true"/>
</bean>
<!--jpa实体管理器工厂-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!--指定实体类的位置-->
<property name="packagesToScan" value="com.sims.Entity"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!--开启spring事务管理器-->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="${jdbc.initialSize}" />
<property name="minIdle" value="${jdbc.minIdle}" />
<property name="maxActive" value="${jdbc.maxActive}" />
<property name="maxWait" value="${jdbc.maxWait}" />
</bean>
</beans>
最后是springmvc的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描controller层-->
<context:component-scan base-package="com.sims.Controller"/>
<!--配置注解驱动-->
<mvc:annotation-driven/>
<!--对静态资源放行-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/images/**" location="/images/"/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
配置文件全部生成,现在我们需要创建数据库,我的数据库已经建好了,筒子们需要自己创建,不会的请自行百度,直接贴图
------------------------------------------------我有事----------------------------------------------------------------------------------------------------------------
现在,数据库的数据已经创建完毕,现在开始要创建前端页面,我们的标题是extjs,那么,显然,我们的前端要使用extjs,这里我就不对ext进行介绍了,直接贴代码和思路
首先,我们需要引入ext的相关资源,包括他的js文件和css样式,同时,为了美观,我们还引入了第三方的图标库,为了方便管理,我创建了一个公用的jsp文件,代码如下:
<%--
Created by IntelliJ IDEA.
User: Dragon
Date: 2018/8/29
Time: 10:21
To change this template use File | Settings | File Templates.
--%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<link href="<%=basePath%>css/css/font-awesome.css" rel="stylesheet">
<link href="<%=basePath%>css/ext/resources/ext-theme-neptune/ext-theme-neptune-all.css" rel="stylesheet">
<script type="text/javascript" src="<%=basePath%>js/ext/ext-all.js"></script>
<script type="text/javascript" src="<%=basePath%>js/ext/ext-lang-zh_CN.js" charset="UTF-8"></script>
</head>
<body>
</body>
</html>
贴一下相应的目录结构
css目录结构:
接下来是js的目录结构:
之后,我们还需要创建若干js文件,地址自行选择,我的放在了webapp/js/student下,之后不再赘述
-----------------------------------------------有事先溜了-----------------------------------------------------------------------------------------------------------