SpringMVC整合Hibernate+Jpa

2 篇文章 0 订阅
1 篇文章 0 订阅

    上一篇博客我弄完了SpringMVC+Gradle的整合,现在就开始要连接数据库了,因为SpringMVC已经弄好了,现在的整合也是从我上一个版本直接弄的,所以这里就不会有太多关于SpringMVC和Gradle的东西了,如果有需要可以看我的上一篇博客

IDEA创建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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值