【框架】[Hibernate]利用Hibernate进行单表的增删改查-Web实例(1)

简介: 【框架】[Hibernate]利用Hibernate进行单表的增删改查-Web实例

前面两篇博客已经将Hibernate的基础知识讲解得差不多了,差不多到写实例的时候了。

本篇只用hibernate进行单表的增删改查、

应用Hibernate,对students表进行增删改查。

service层和DAO层,我都是直接写实现类了(因为这里主要是演示一下Hibernate的使用),如果是开发项目,注意一定要写接口!

准备数据库:

首先准备一个students表:

create database hib charset=utf8;
use hib;
create table students(
    sId varchar(8) primary key,
    sName varchar(40),
    sAge int,
    deptId varchar(8)
);

插入数据:

insert into students(sId,sName,sAge,deptId) values('S001','Jack',23,'D001');
insert into students(sId,sName,sAge,deptId) values('S002','Tom',25,'D001');
insert into students(sId,sName,sAge,deptId) values('S003','张三',43,'D001');
insert into students(sId,sName,sAge,deptId) values('S004','李四',55,'D001');
insert into students(sId,sName,sAge,deptId) values('S005','Jack',23,'D002');
insert into students(sId,sName,sAge,deptId) values('S006','Tom',25,'D003');
insert into students(sId,sName,sAge,deptId) values('S007','张三',43,'D002');
insert into students(sId,sName,sAge,deptId) values('S008','李四',55,'D002');

image.png

需要的Jar包

数据库连接包以及hibernate必须包,这些包在项目的WEBROOT/WEBINF的bin目录下都有。

image.png

链接:

https://github.com/chenhaoxiang/Java/blob/master/Hibernate/myHibWeb/myHibWeb.zip

部分核心源码:

Student.java:

package cn.hncu.domain;
public class Student {
    private String sId;
    private String sName;
    private Integer sAge;
    private String deptId;
    public String getDeptId() {
        return deptId;
    }
    public void setDeptId(String deptId) {
        this.deptId = deptId;
    }
    public Student() {
        super();
    }
    public String getsId() {
        return sId;
    }
    public void setsId(String sId) {
        this.sId = sId;
    }
    public String getsName() {
        return sName;
    }
    public void setsName(String sName) {
        this.sName = sName;
    }
    public Integer getsAge() {
        return sAge;
    }
    public void setsAge(Integer sAge) {
        this.sAge = sAge;
    }
    @Override
    public String toString() {
        return "Student [sId=" + sId + ", sName=" + sName + ", sAge=" + sAge
                + ", deptId=" + deptId + "]";
    }
}

hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <!-- 这是最简单的配置版!!! -->
    <session-factory>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="connection.url">
            jdbc:mysql://127.0.0.1:3306/hib
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">1234</property>
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
          <!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于查错,
        程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。
        项目部署后可以设置为false,提高运行效率-->   
        <property name="hibernate.show_sql">true </property>   
        <!--jdbc.fetch_size是指Hibernate每次从数据库中取出并放到JDBC的Statement中的记录条数。
        Fetch Size设的越大,读数据库的次数越少,速度越快,Fetch Size越小,读数据库的次数越多,速度越慢-->   
        <property name="jdbc.fetch_size">50 </property> 
        <!--jdbc.batch_size是指Hibernate批量插入,删除和更新时每次操作的记录数。
        Batch Size越大,批量操作的向数据库发送Sql的次数越少,速度就越快,同样耗用内存就越大-->   
        <property name="jdbc.batch_size">23 </property>  
        <!--jdbc.use_scrollable_resultset是否允许Hibernate用JDBC的可滚动的结果集。
        对分页的结果集。对分页时的设置非常有帮助-->   
        <property name="jdbc.use_scrollable_resultset">false </property> 
        <!--connection.useUnicode连接数据库时是否使用Unicode编码 -->
        <property name="connection.useUnicode">true</property>
        <!--connection.characterEncoding连接数据库时数据的传输字符集编码方式 -->
        <property name="connection.characterEncoding">utf-8</property>
        <mapping resource="cn/hncu/domain/Student.hbm.xml" />
    </session-factory>
</hibernate-configuration>


Student.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.hncu.domain">
    <!--name指的是POJO类的类名,table是数据库的表名,catalog是数据库的名称  -->
    <class name="Student" table="students" catalog="hib">
        <!--id表示此字段为数据库的主键,这里也可以用property来写,name为Student类的成员变量名,type为类型的包全名  -->
        <id name="sId" type="java.lang.String">
            <!--column表示映射的数据库的字段,name表示数据库中字段名,length表示varchar/char型的长度  -->
            <column name="sId" length="8"></column>
            <generator class="assigned"></generator>            
        </id>
        <property name="sName" type="java.lang.String">
            <column name="sName" length="40" />
        </property>
        <property name="sAge" type="java.lang.Integer">
            <column name="sAge" />
        </property>
        <property name="deptId" type="java.lang.String">
        <column name="deptId" length="8" />
     </property>
    </class>
</hibernate-mapping>

BaseServlet.java

package cn.hncu.utils;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public abstract class BaseServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        String cmd = req.getParameter("cmd");
        if (null == cmd || cmd.trim().equals("")) {
            cmd = "execute";
        }
        try {
            Method method = this.getClass().getMethod(cmd,
                    HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(this, req, resp);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException("没有此方法:" + e.getMessage(), e);
        }catch(InvocationTargetException e){
            throw new RuntimeException("目标方法执行失败:" + e.getMessage(), e);
        }catch(IllegalAccessException e){
            throw new RuntimeException("你可能访问了一个私有的方法:" + e.getMessage(), e);
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    public abstract void execute(HttpServletRequest req,
            HttpServletResponse resp) throws Exception;
}

HibernateSessionFactory.java

package cn.hncu.hib;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateSessionFactory {
   private static String configFile = "/hibernate.cfg.xml";
   private static Configuration config = new Configuration();
   private static SessionFactory sessionFactory =null;
   private static final ThreadLocal<Session> t = new ThreadLocal<Session>();
   static{
       try {
           config.configure(configFile);
           sessionFactory = config.buildSessionFactory();
        } catch (HibernateException e) {
            e.printStackTrace();
        }
   }
   public static Session getSession() throws HibernateException{
       Session session = t.get();
       if(session == null || !session.isOpen()){
           if(sessionFactory==null){
               rebuildSessionFactory();
           }
           session = (sessionFactory!=null) ? sessionFactory.openSession() : null;
           t.set(session);
       }
       return session;
   }
   private static void rebuildSessionFactory() {
       try {
           config.configure(configFile);
           sessionFactory = config.buildSessionFactory();
        } catch (HibernateException e) {
            e.printStackTrace();
        }
   }
   //关闭与数据库的会话
   public static void closeSession() throws HibernateException{
       Session session = t.get();
       t.set(null);
       if(session!=null){
           session.close();
       }
   }
}

DemoServlet.java

package cn.hncu.demo;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hncu.demo.service.DemoServiceImpl;
import cn.hncu.domain.Student;
import cn.hncu.utils.BaseServlet;
public class DemoServlet extends BaseServlet {
    DemoServiceImpl service = new DemoServiceImpl();
    @Override
    public void execute(HttpServletRequest req, HttpServletResponse resp)
            throws Exception {
        List<Student> list = service.queryAllStudents();
        req.getSession().setAttribute("list", list);
        req.getRequestDispatcher("/jsps/demo.jsp").forward(req, resp);
    }
    public void delStudent(HttpServletRequest req, HttpServletResponse resp)
            throws Exception {
        String studId = req.getParameter("studId");
        Student stud = new Student();
        stud.setsId(studId);
        service.delStudent(stud);
        resp.sendRedirect(getServletContext().getContextPath()+"?time="+(new Date().getTime()));
    }
    public void addStudent(HttpServletRequest req, HttpServletResponse resp)
            throws Exception {
        String studId = req.getParameter("studId");
        String studName = req.getParameter("studName");
        String strAge = req.getParameter("age");
        Integer age = Integer.valueOf(strAge);
        String deptId = req.getParameter("deptId");
        Student stud = new Student();
        stud.setsId(studId);
        //System.out.println(studName);//正常汉字
        stud.setsName(studName);
        stud.setsAge(age);
        stud.setDeptId(deptId);
        service.addStudent(stud);
        resp.sendRedirect(getServletContext().getContextPath());
    }
    public void queryStudents(HttpServletRequest req, HttpServletResponse resp)
            throws Exception {
        String studId = req.getParameter("studId");
        String studName = req.getParameter("studName");
        String deptId = req.getParameter("deptId");
        Student stud = new Student();
        stud.setsId(studId);
        stud.setsName(studName);
        stud.setDeptId(deptId);
        List<Student> qlist = service.queryStudents(stud);
        req.getSession().setAttribute("qlist", qlist);
        PrintWriter out = resp.getWriter();
        out.print("1"); //坑:不能使用out.println("1")
    }
}

DemoJdbcDao.java

package cn.hncu.demo.dao;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import cn.hncu.domain.Student;
import cn.hncu.hib.HibernateSessionFactory;
public class DemoJdbcDao {
    public List<Student> queryAllStudents() {
        Session s = HibernateSessionFactory.getSession();
        Query query = s.createQuery("from Student");
        List<Student> list = query.list();
        return list;
    }
    public void delStudent(Student stud) {
        Session s = HibernateSessionFactory.getSession();
            try {
                Transaction tran = s.beginTransaction();
                System.out.println("stud:"+stud);
                s.delete(stud);
//              Student stud2 = new Student();
//              stud2.setStudId("S001");
//              s.save(stud2);
                tran.commit();
            } catch (HibernateException e) {
                //tran.rollback();//可以不写,内部会进行回滚
                System.out.println("抓到异常...");
            }
    }
    public void addStudent(Student stud) {
        Session s = HibernateSessionFactory.getSession();
        Transaction tran = s.beginTransaction();
        try {
            System.out.println(stud.getsName());
            s.saveOrUpdate(stud);
            tran.commit();
        } catch (HibernateException e) {
        }
    }
    public List<Student> queryStudents(Student stud) {
        System.out.println(stud);
        boolean f1=false,f2=false,f3=false;
        Session s = HibernateSessionFactory.getSession();
        String hql = "from Student s where 1=1";
        if(stud.getsId()!=null && stud.getsId().trim().length()>0){
            hql = hql + " and s.sId=:sId";
            f1=true;
        }
        if(stud.getsName()!=null && stud.getsName().trim().length()>0){
            hql = hql + " and s.sName like :sName";
            f2=true;
        }
        if(stud.getDeptId()!=null && stud.getDeptId().trim().length()>0){
            hql = hql + " and s.deptId=:deptId";
            f3=true;
        }
        Query query = s.createQuery(hql);
        if(f1){
            query.setParameter("sId", stud.getsId().trim());
        }
        if(f2){
            query.setParameter("sName", "%"+stud.getsName().trim()+"%");
        }
        if(f3){
            query.setParameter("deptId", stud.getDeptId().trim());
        }
        return query.list();
    }
}
目录
相关文章
|
1月前
|
开发框架 JavaScript 前端开发
如何选择合适的Web开发框架?
【9月更文挑战第1天】如何选择合适的Web开发框架?
54 1
|
5天前
|
Web App开发 JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的深度整合
【9月更文挑战第28天】在现代Web开发领域,Node.js和Express框架的结合已成为打造高性能、易扩展应用的黄金组合。本文将深入探讨如何利用这一技术栈优化Web应用架构,提供具体实践指导,并分析其性能提升的内在机制。通过代码示例,我们将展示从基础搭建到高级功能的实现过程,旨在为开发者提供一条清晰的学习路径,以实现技术升级和项目效率的双重提升。
14 3
|
9天前
|
JSON 安全 JavaScript
Web安全-JQuery框架XSS漏洞浅析
Web安全-JQuery框架XSS漏洞浅析
38 2
|
8天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
26 1
|
26天前
|
Web App开发 前端开发 JavaScript
Web前端项目的跨平台桌面客户端打包方案之——CEF框架
Chromium Embedded Framework (CEF) 是一个基于 Google Chromium 项目的开源 Web 浏览器控件,旨在为第三方应用提供嵌入式浏览器支持。CEF 隔离了底层 Chromium 和 Blink 的复杂性,提供了稳定的产品级 API。它支持 Windows、Linux 和 Mac 平台,不仅限于 C/C++ 接口,还支持多种语言。CEF 功能强大,性能优异,广泛应用于桌面端开发,如 QQ、微信、网易云音乐等。CEF 开源且采用 BSD 授权,商业友好,装机量已超 1 亿。此外,GitHub 项目 CefDetector 可帮助检测电脑中使用 CEF
101 3
|
4天前
|
JSON JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的完美结合
【9月更文挑战第28天】在现代Web开发中,Node.js和Express框架的结合为创建高性能、易扩展的应用提供了强有力的支持。本文将深入探讨如何利用这两种技术构建一个简单但功能强大的Web服务,同时提供代码示例以加深理解。
|
2月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
59 0
|
2月前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
24 0
|
2月前
|
数据库 开发者 Java
数据战争:Hibernate的乐观与悲观锁之争,谁将主宰并发控制的王座?
【8月更文挑战第31天】在软件开发中,数据一致性至关重要,尤其是在多用户并发访问环境下。Hibernate 作为 Java 社区常用的 ORM 框架,提供了乐观锁和悲观锁机制来处理并发问题。乐观锁假设数据不易冲突,通过版本号字段 (`@Version`) 实现;悲观锁则假定数据易冲突,在读取时即加锁。选择哪种锁取决于具体场景:乐观锁适合读多写少的情况,减少锁开销;悲观锁适合写操作频繁的场景,避免数据冲突。正确应用这些机制可提升应用程序的健壮性和效率。
28 0
|
2月前
|
Java Maven Android开发
解锁Web开发新技能:从零开始的Struts 2之旅——让你的Java编程之路更加宽广,首个应用实例带你飞!
【8月更文挑战第31天】对于初学者,掌握 Struts 2 框架不仅能提升 Web 开发能力,还能深入了解 MVC 架构。Struts 2 是一个基于 Servlet 的 Java 框架,提供表单验证、文件上传、国际化等功能,便于快速构建易维护的 Web 应用。本文通过示例演示如何从零开始搭建环境并创建一个简单的 Struts 2 项目,包括配置 `struts.xml`、编写 Action 类及视图文件,并配置 web.xml。通过这些步骤,你将学会基本的开发流程,为进一步学习高级功能打下基础。
34 0
下一篇
无影云桌面