IDEA使用maven创建Spring-Spring-MVC-hibernate总结

本文介绍了一个基于SpringMVC、Spring及Hibernate技术实现的学生信息分页查询系统,包括Maven项目的搭建、数据库配置、实体类定义、Hibernate映射文件设置、Spring配置文件详解以及Controller、Service和DAO层的具体实现。

目录结构如下 



首先看一下数据库 t_class和t_student





maven   pom如下   创建maven请参考我的上一篇文章   

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.my</groupId>
  <artifactId>SpringMvc_Spring_Hibernate</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>SpringMvc_Spring_Hibernate Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <!-- spring版本号 -->
    <spring.version>4.0.4.RELEASE</spring.version>
    <hibernate.version>4.3.8.Final</hibernate.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!-- spring核心包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!-- json数据 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.24</version>
    </dependency>
    <!--阿里云的数据源-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.0.28</version>
    </dependency>
    <!--数据库-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.40</version>
    </dependency>
    <!--hibernate-->
    <!-- hibernate -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>${hibernate.version}</version>
    </dependency>

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-ehcache</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.8.5</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>SpringMvc_Spring_Hibernate</finalName>
  </build>
</project>

数据库有了   实体bean和hibernate的映射文件是有idea反向工程生成的  


TClassEntity

package com.my.bean;

import java.io.Serializable;

/**
 * Created by heyongjie on 2017/2/26.
 */
public class TClassEntity implements Serializable{
    private Integer cId;
    private String cName;
    private Integer teacher;

    public Integer getcId() {
        return cId;
    }

    public void setcId(Integer cId) {
        this.cId = cId;
    }

    public String getcName() {
        return cName;
    }

    public void setcName(String cName) {
        this.cName = cName;
    }

    public Integer getTeacher() {
        return teacher;
    }

    public void setTeacher(Integer teacher) {
        this.teacher = teacher;
    }

}


TStudentEntity


package com.my.bean;

import java.io.Serializable;

/**
 * Created by heyongjie on 2017/2/26.
 */
public class TStudentEntity implements Serializable{
    private Integer id;
    private String name;
    private String sex;
    private TClassEntity tClassByCId;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public TClassEntity gettClassByCId() {
        return tClassByCId;
    }

    public void settClassByCId(TClassEntity tClassByCId) {
        this.tClassByCId = tClassByCId;
    }
}

hibernate     bean映射文件    因为使用的是maven   maven有约束  所以必须放在maven的resourse目录下面 


TclassEntity    映射文件 


<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.my.bean.TClassEntity" table="t_class" schema="test"  lazy="false">
        <id name="cId">
            <column name="c_id" sql-type="int(11)"/>
        </id>
        <property name="cName">
            <column name="c_name" sql-type="varchar(30)" length="30"/>
        </property>
        <property name="teacher">
            <column name="teacher" sql-type="int(11)"/>
        </property>
    </class>
</hibernate-mapping>


TStudentEntity    映射文件 


<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.my.bean.TStudentEntity" table="t_student" schema="test" lazy="false">
        <id name="id">
            <column name="id" sql-type="int(11)"/>
        </id>
        <property name="name">
            <column name="name" sql-type="varchar(30)" length="30"/>
        </property>
        <property name="sex">
            <column name="sex" sql-type="varchar(5)" length="5"/>
        </property>
        <many-to-one name="tClassByCId" class="com.my.bean.TClassEntity">
            <column name="c_id" not-null="true"/>
        </many-to-one>
    </class>
</hibernate-mapping>


因为要做分页,所以需要一个分页bean

package com.my.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by heyongjie on 2017/3/13.
 */
public class PageBean<E> implements Serializable{
    private int pageNo;   // 每页显示页数
    private int showNo;  // 当前显示页数
    private int countNo; // 总共的页数
    private List<E> lists = new ArrayList<E>();  // 这页的数据

    public int getPageNo() {
        return pageNo;
    }

    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }

    public int getShowNo() {
        return showNo;
    }

    public void setShowNo(int showNo) {
        this.showNo = showNo;
    }

    public int getCountNo() {
        return countNo;
    }

    public void setCountNo(int countNo) {
        this.countNo = countNo;
    }

    public List<E> getLists() {
        return lists;
    }

    public void setLists(List<E> lists) {
        this.lists = lists;
    }

    @Override
    public String toString() {
        return "PageBean{" +
                "pageNo=" + pageNo +
                ", showNo=" + showNo +
                ", countNo=" + countNo +
                ", lists=" + lists +
                '}';
    }
}


现在看一下spring的配置文件 


因为需要查看日志  所以需要导入一个   log4j.properties 文件  如下  


log4j.rootLogger=DEBUG,Console,File

log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c]%m%n

log4j.appender.File=org.apache.log4j.RollingFileAppender 
log4j.appender.File.File=mybatis.log
log4j.appender.File.MaxFileSize=10MB
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

开闭原则的原因  我们将数据库的配置如用户密码  放在外面   db.properties

这里面做了防止乱码的处理 

jdbc_url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
jdbc_user=root
jdbc_password=123456


spring.xml


<?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-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <!--从外部读取数据信息 -->
    <context:property-placeholder location="classpath:db.properties"/>

    <!--扫描  -->
    <context:component-scan base-package="com.my.*"/>
    <!--配置阿里云的数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 基本属性 url、user、password -->
        <property name="url" value="${jdbc_url}"/>
        <property name="username" value="${jdbc_user}"/>
        <property name="password" value="${jdbc_password}"/>

        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="1"/>
        <property name="minIdle" value="1"/>
        <property name="maxActive" value="20"/>

        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000"/>

        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>

        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000"/>

        <property name="validationQuery" value="SELECT 'x'"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>

        <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="true"/>
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>

        <!-- 配置监控统计拦截的filters -->
        <property name="filters" value="stat"/>
    </bean>

    <!--配置hibernate-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <list>
                <value>hibernateCfg/TClassEntity.hbm.xml</value>
                <value>hibernateCfg/TStudentEntity.hbm.xml</value>
            </list>
        </property>

        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQLDialect
                hibernate.show_sql =true
                <!--  hibernate.hbm2ddl.auto=create -->
            </value>
        </property>
    </bean>

    <!--配置事物管理器 -->
    <bean id="transactionManager"
          class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
</beans>


spring-MVC.xml



<?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-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- 扫描controller(controller层注入) -->
    <context:component-scan base-package="com.my.controller"/>

    <mvc:annotation-driven/>
    <!-- 对模型视图添加前后缀 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 处理静态资源 -->
    <mvc:default-servlet-handler />

</beans>



下面是我的持久层和服务层代码 


持久层   接口  

package com.my.dao.idao;

import com.my.bean.PageBean;

/**
 * Created by heyongjie on 2017/3/13.
 */
public interface IStudentDao {

    /**
     * 根据显示条数和当前页数获得数据
     * @param showNo    每页显示的条数
     * @param pageNo    当前页数
     * @return           返回分页对象
     */
    public PageBean getAllStudent(int showNo, int pageNo);
}


实现 


package com.my.dao;

import com.my.bean.PageBean;
import com.my.dao.idao.IStudentDao;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * Created by heyongjie on 2017/3/13.
 */
@Repository("studentDao")
public class StudentDao implements IStudentDao {
    @Autowired
    private SessionFactory sessionFactory;


    public PageBean getAllStudent(int showNo, int pageNo) {
        System.out.println(sessionFactory + "======");
        PageBean page = new PageBean();
        // 将数据封装到pageBean中
        page.setShowNo(showNo);
        page.setPageNo(pageNo);
        // 分页查询数据
        List list = sessionFactory.getCurrentSession().createQuery("FROM TStudentEntity").setFirstResult((pageNo - 1) * showNo).setMaxResults(showNo).list();
        // 查询总数据条数
        int num = sessionFactory.getCurrentSession().createQuery("from TStudentEntity").list().size();
        // 查询总共有多少页
        if (num % showNo == 0) {
            page.setCountNo(num / showNo);
        } else {
            page.setCountNo(num / showNo + 1);
        }
        page.setLists(list);
        return page;
    }
}


服务层 

接口 


package com.my.server.iserver;

import com.my.bean.PageBean;

/**
 * Created by heyongjie on 2017/3/16.
 */
public interface IStudentServer {

    /**
     * 获得所有的学生信息  分页查询
     * @param showNo    每页显示的条数
     * @param pageNo    当前页数
     * @return           返回分页的信息
     */
    public PageBean getAllStudent(int showNo,int pageNo);

}

实现 

package com.my.server;

import com.my.bean.PageBean;
import com.my.dao.idao.IStudentDao;
import com.my.server.iserver.IStudentServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * Created by heyongjie on 2017/3/16.
 */
@Service("studentServer")
public class StudentServer  implements IStudentServer{
    @Autowired
    private IStudentDao studentDao;

    public PageBean getAllStudent(int showNo, int pageNo) {

        return studentDao.getAllStudent(showNo,pageNo);
    }
}


然后是Controller


package com.my.controller;

import com.my.bean.PageBean;
import com.my.server.iserver.IStudentServer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

/**
 * Created by heyongjie on 2017/3/16.
 */
@Controller
public class StudentController {
    @Resource
    private IStudentServer studentServer;

    // 这里使用的是restFual  风格  
    @RequestMapping(value = "/getAllStudent/{showNo}/{pageNo}")
    @ResponseBody
    public PageBean getAllStudent(@PathVariable(value = "showNo") int showNo, @PathVariable(value = "pageNo") int pageNo) {
        PageBean page = studentServer.getAllStudent(showNo, pageNo);
        System.out.println(page);
        return page;
    }
}

最后是界面     分页使用的是插件 


<%--
  Created by IntelliJ IDEA.
              User: heyongjie
              Date: 2017/3/16
    Time: 10:43
    To change this template use File | Settings | File Templates.
    --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <link rel="stylesheet" href="../jQueryPage20161027/src/jquery.page.css">
    <script type="text/javascript" src="jquery-3.1.0.min.js"></script>
    <script type="text/javascript" src="../jQueryPage20161027/src/jquery.page.js"></script>
    <script>
        $(function () {
            // 发送ajax请求   进行数据的初始化
            $.ajax({
                // 使用resf风格进行传值
                url: "../getAllStudent/4/1",
                type: "post",
                dataType: "json",
                success: function (data) {
                    // 在这里进行页面的拼接
                    var htmlStr = "";
                    // 循环拼接表格
                    $.each(data.lists, function (i) {
                        htmlStr += "<tr>" +
                            " <td>" + data.lists[i].id + "</td>" +
                            "<td>" + data.lists[i].name + "</td>" +
                            "</tr>";
                    });
                    // 最开使的时候加载一次分页
                    page(data.countNo);
                    $(".tbody").html(htmlStr);
                }
            });

            function ajaxPage(pageNo){
                $.ajax({
                    // 使用resf风格进行传值
                    url: "../getAllStudent/4/" + pageNo,
                    type: "post",
                    dataType: "json",
                    success: function (data) {
                        // 在这里进行页面的拼接
                        var htmlStr = "";
                        // 循环拼接表格
                        $.each(data.lists, function (i) {
                            htmlStr += "<tr>" +
                                " <td>" + data.lists[i].id + "</td>" +
                                "<td>" + data.lists[i].name + "</td>" +
                                "</tr>";
                        });
                        $(".tbody").html(htmlStr);
                    }
                });
            };

            //   分页
            function page(countNo){
                // 初始化分页信息
                $("#page").Page({
                    totalPages: countNo,//分页总数
                    liNums: 7,//分页的数字按钮数(建议取奇数)
                    activeClass: 'activP', //active 类样式定义
                    callBack: function (page) {
                        // 当点击了页数之后  就按照这个页数进行查询
                        ajaxPage(page);
                    }
                });
            }
        });
    </script>
</head>
<body>

<h1>所有学生的信息 </h1>

<table>
    <thead>
    <tr>
        <th>编号</th>
        <th>名字</th>
    </tr>
    </thead>
    <tbody class="tbody">
    <tr>
        <td>1</td>
        <td>1222222</td>
    </tr>
    </tbody>
</table>

<%--Jq分页插件--%>
<div id="page"></div></body></html>



最后的效果  没有进行界面的美化  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值