上一篇博客我弄完了SpringMVC+Gradle的整合,现在就开始要连接数据库了,因为SpringMVC已经弄好了,现在的整合也是从我上一个版本直接弄的,所以这里就不会有太多关于SpringMVC和Gradle的东西了,如果有需要可以看我的上一篇博客
1-项目结构
现在就不多说了,因为我的项目已经整合完成,所以就直接上图了
首先项目结构图
Controller==》控制层,分发和定位处理用户的请求
Entity==》实体层,对应的是数据库中的数据表,Hibernate会将数据库中的数据表持久化到这些实体中
Repository==》Dao层,数据持久工作层,与数据库之间的交互都在这个里面实现
Service==》业务处理层,Dao层持久化出来的数据都将在这个里面进行处理
resources==》我这里存放的是一些配置文件,里面的配置文件稍后会有介绍
webapp\page==》视图层,展示出来的页面都在这个里面
2-添加jar包
现在需要加入Hibernate和Jpa的相关的依赖包,图是我的项目导入的所有的包,下面的是现在需要的包
//hibernate 需要的包
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.3.0.CR1'
compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.9-rc' //数据库连接驱动包
compile group: 'com.mchange', name: 'c3p0', version: '0.9.5.2' //数据库连接池需要的包
compile group: 'org.springframework', name: 'spring-beans', version: '5.0.5.RELEASE' //hibernate处理注册bean的包
compile group: 'org.springframework', name: 'spring-orm', version: '5.0.5.RELEASE'
compile group: 'org.hibernate', name: 'hibernate-ehcache', version: '5.2.16.Final' //hibernate缓存包
//jpa 需要的包
compile group: 'org.springframework.data', name: 'spring-data-jpa', version: '2.0.6.RELEASE' //jpa的包
compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.2.Final' //hibernate支持jpa的包
3-修改配置
包导入完成就需要配置了,首先配置web.xml
注意我画框框的地方,这里是配置Spring的监听器画红线的地方是导入的配置项,也就是我新建的一个配置文件,名称为applicationContent.xml的文件,里面的配置稍后马上就介绍
然后就是字符集的过滤,如果你的请求有中文的话就需要配置这个了,没有的话就无所谓了,配了我感觉也不碍事
现在我们开始配置applicationContent.xml,这里我就不上图了,有点长,直接代码
之前配置SpringMVC的时候我们只扫描了Controller的文件夹,现在我们扫描整个工程包,但是忽略Controller,因为之前已经扫描过了,这样有利于资源节省
<!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 -->
<context:component-scan base-package="org.zh.springmvc">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
现在是hibernate的配置,我们在这里需要新建一个hibernate.properties的文件,放在resources文件夹下面,里面的内容如下
#database connection config
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/demo_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT
jdbc.username = root
jdbc.password = root
现在配置数据源,也就是数据连接池
<!--扫描配置文件(这里指向的是之前配置的那个 hibernateconfig.properties)-->
<context:property-placeholder location="classpath:hibernateconfig.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driver}"/> <!--数据库连接驱动-->
<property name="jdbcUrl" value="${jdbc.url}"/> <!--数据库地址-->
<property name="user" value="${jdbc.username}"/> <!--用户名-->
<property name="password" value="${jdbc.password}"/> <!--密码-->
<property name="maxPoolSize" value="40"/> <!--最大连接数-->
<property name="minPoolSize" value="1"/> <!--最小连接数-->
<property name="initialPoolSize" value="10"/> <!--初始化连接池内的数据库连接-->
<property name="maxIdleTime" value="20"/> <!--最大空闲时间-->
</bean>
接下来就是Jpa的配置了
<!-- JPA实体管理工厂的配置 -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
<property name="packagesToScan" value="org.zh.springmvc.entity"/><!--待扫描的实体类包,不再需要persistence.xml了 -->
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.show_sql">true</prop><!-- 是否打印SQL -->
<prop key="hibernate.hbm2ddl.auto">update</prop><!-- 实体修改后对数据表的操作 -->
</props>
</property>
</bean>
<!--指定实现JPA的适配器 -->
<bean id="hibernateJpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
</bean>
<!-- Jpa 事务配置 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!-- Spring Data Jpa 配置 Spring -->
<!-- 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为
Spring Bean -->
<!-- base-package 扫描的包 -->
<!-- repository-impl-postfix 仓库自定义实现类的后缀。自动扫描该名称带有该后缀的类,并添加到接口的实现 -->
<!-- factory-class 仓库接口的实现工厂 -->
<jpa:repositories base-package="org.zh.springmvc.repository"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager">
</jpa:repositories>
4-创建实体映射层和数据持久层
ok,到现在配置就完成了,我们开始创建实体,创建Service层Dao层,跟着我的项目结构图一步一步的开始创建吧
①实体层:
@Entity==》代表该类是一个实体
@Table==》关联的数据表,里面的字符串是对应的表名,如果没有找到该表将会自动创建表
@Id==》数据库的主键Id
@Colum==》数据表对应的列名,如果没有找到该列将会自动创建
注:自动创建是通过配置文件来的,也可以配置成其他,这个请大家自行查阅资料
@Entity
@Table(name = "T_USER")
public class User {
@Id
@Column(name = "U_ID")
private Long id;
@Column(name = "U_USERNAME")
private String name;
@Column(name = "U_PASSWORD")
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
②Dao层
Dao层,这里我们只需要继承jpa的接口,可以说很方便,jpa里面提供了一些使用很广泛的接口用来对数据库的增删改查,jpa的使用其实很简单,在做单表操作的时候并不需要写sql语句,也不需要写实现类,只需要按照他的规范定义一个接口就行
例如查询接口定义:List<User> findAllByName(String name);
在这里不返回集合的话只需要直接find去掉All,但是需要注意的是结果集一定是只有一条的,不然会报错,需要多个参数后面跟And加字段名,注意每个有不同语义的首字母大写,也就是驼峰命名法,详细的了解可以自己查询资料
@Repository==》该类是一个Dao
注意我们在这继承了JpaRepository的接口,这是一个泛型接口,需要传两个参数进去,第一个为对应是那个实体,第二个为该实体的主键
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
③Server
Service层,Service层有两个,一个接口和一个实现类,用来处理Dao层持久后的数据
接口,没什么特别的,就一个普通的接口
public interface UserService {
List<User> findAll();
}
④Server实现类
@Service==》表示这是一个Service
@Autowired==》将一个类注入为一个bean,这个注解是通过Name进行注入的,需要跟深入的了解自行查询资料
@Overried==》重写父类的方法,当你实现接口或者需要重写父类的方法时需要加上这个注解
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public List<User> findAll() {
return userRepository.findAll();
}
}
⑤Controller控制层
控制层,这个是我在上一篇写过的Controller,我在里面新加了一个user的方法,这里面的注解都有解释过,就不解释,然后user方法返回的是一个ModelAndView,这是一个视图模型,SpringMVC自带的,我将这个进行简写了
在这里我将UserService注入为一个bean
这样写可能好理解一点
List<User> users = userService.findAll();
ModelAndView modelAndVie = new ModelAndView("home"); //创建一个视图模型,该视图为home.jsp
modelAndView.addObject("user",users); //该视图中带有一个键值为user的参数
return modelAndView; //返回该视图
@Controller
public class IndexController {
@Autowired
private UserService userService;
@RequestMapping("home")
public String home() {
return "home";
}
@RequestMapping("user")
public ModelAndView user() {
return new ModelAndView("home").addObject("user", userService.findAll());
}
}
⑥添加jar包依赖
现在我们的视图层也应该对应的进行一定的修改,我只是在原版的页面上修改了一下
这里我引入了jsp的EL表达式的标签库,要实现的话直接在页面的头部插入这个标签,需要详细了解自行查阅资料
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
同时它也有一个对应的依赖包
compile group: 'jstl', name: 'jstl', version: '1.2'
⑦视图层修改
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>HOME</h1>
<table>
<tr>
<td>ID</td>
<td>Name</td>
<td>Password</td>
</tr>
<c:forEach var="user" items="${user}">
<tr>
<td> ${user.id}</td>
<td> ${user.name}</td>
<td> ${user.password}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
好了,现在终于算是完成了,现在我们在数据库中创建一个名为demo_test的数据库,启动tomcat,启动完成之后可以看到数据库中已经是自动创建了一个数据表,里面我手动加了一条数据
现在敲入我们定义好了的地址,看到这样的页面就表示我们成功了
转载请标明出处:https://blog.csdn.net/qq_33733799/article/details/79882824