Hibernate常见操作(增、删、改)

Hibernate常见操作

       如果利用Hibernate修改数据库时,需要使用事务处理,一个事务提交时才真正将修改过的记录更新到数据库中。

1、增加记录

Session session=HibernateSessionFactory.getSession();

/*定义事务开始*/

Transaction tran=session.beginTransaction();

Dept dept=new Dept(new Long(1001),"math","shanghai");

session.save(dept);

/*提交事务,真正保存到数据库中*/

tran.commit(); 

2、 删除记录

public static void main(String[] args) {
	    Session session=HibernateSessionFactory.getSession();
	   /*首先查找待删除记录 通过ID*/
	    Dept dept=(Dept)session.get(Dept.class,new Long(10));
	    Transaction tran=session.beginTransaction();
	    session.delete(dept);
	    tran.commit();
	}


 

3、修改记录

public class Demo {
	public static void main(String[] args) {
	    Session session= 
                              HibernateSessionFactory.getSession();
	   Transaction tran=session.beginTransaction();
	    /*首先查找待修改记录 通过ID*/
	    Dept dept=
                          (Dept)session.get(Dept.class,new Long(10));
	    dept.setDname("math");
	    session.saveOrUpdate(dept);
	    tran.commit();
	}
}

 

技术一点点学习起来的。所以这次的项目也是在前一次的基础上写的,所以有的代码没有改动这里就不再重复了,贴出一些重要的代码,初次接触的请参考上一篇文章。

canHibWeb

在学习了一个book项目以后,发现servlet原来还可以再建一个BaseServlet,然后利用类反射来调用servlet代码,更加简洁,不用再进行繁琐的判断。所以,这次对servlet也进行了改动。

 

index.jsp依然是直接跳到主页,这里不再重复。

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{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String cmd=req.getParameter("cmd");
		System.out.println("CMD..........:"+cmd);
		if(cmd==null||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 (IllegalAccessException e) {
			throw new RuntimeException("你可能访问了一个私有的方法:" + e.getMessage(), e);
		} catch (InvocationTargetException 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;
}


HibDemoServlet.java

package cn.hncu.servlet;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.hncu.domain.Student;
import cn.hncu.service.HibDemoServiceImpl;
import cn.hncu.utils.BaseServlet;

public class HibDemoServlet extends BaseServlet {
	private HibDemoServiceImpl service=new HibDemoServiceImpl();
	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp)
			throws Exception {
		List<Student> students=service.queryAllStudents();
		req.setAttribute("students",students);
		String resultPage=getInitParameter("show");
		req.getRequestDispatcher(resultPage).forward(req, resp);
	}
	public void delStudent(HttpServletRequest req, HttpServletResponse resp)
			throws Exception {
		String id=req.getParameter("id");
		System.out.println("id:..............."+id);
		Student student=new Student();
		student.setId(id);
		service.delStudent(student);
		resp.sendRedirect(req.getContextPath());
	}
	public void addStudent(HttpServletRequest req, HttpServletResponse resp)
			throws Exception {
		String id=req.getParameter("id");
		String name=req.getParameter("name");
		String strAge=req.getParameter("age");
		String deptId=req.getParameter("deptId");
		Student student=new Student();
		student.setId(id);
		student.setName(name);
		if(strAge!=null&&!strAge.trim().equals("")){
			student.setAge(Integer.valueOf(strAge));
		}
		student.setDeptId(deptId);
		System.out.println("add  .... student:  "+student);
		service.addStudent(student);
		resp.sendRedirect(req.getContextPath());
	}
	
	public void queryStudents(HttpServletRequest req, HttpServletResponse resp)
			throws Exception {
		String id=req.getParameter("id");
		String name=req.getParameter("name");
		String strAge=req.getParameter("age");
		String deptId=req.getParameter("deptId");
		Student student=new Student();
		student.setId(id);
		student.setName(name);
		if(strAge!=null&&!strAge.trim().equals("")){
			student.setAge(Integer.valueOf(strAge));
		}
		student.setDeptId(deptId);
		System.out.println("query  .... student:  "+student);
		List<Student> students=service.queryStudents(student);
		req.getSession().setAttribute("list", students);
		//输出给ajax接收的
		resp.getWriter().print("1");
	}
	
}


HibDemoServiceImpl.java

package cn.hncu.service;

import java.util.List;

import cn.hncu.dao.HibDemoJdbcDao;
import cn.hncu.domain.Student;

public class HibDemoServiceImpl {
	private HibDemoJdbcDao dao=new HibDemoJdbcDao();
	public List<Student> queryAllStudents(){
		return dao.queryAllStudents();
	}
	public void delStudent(Student student) {
		dao.delStudent(student);
	}
	public void addStudent(Student student) {
		dao.addStudent(student);
		
	}
	public List<Student> queryStudents(Student student) {
		return dao.queryStudents(student);
	}
}	


HibDemoJdbcDao.java

package cn.hncu.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import cn.hncu.domain.Student;
import cn.hncu.hib.HibernateSessionFactory;

public class HibDemoJdbcDao {
	public List<Student> queryAllStudents(){
		Session session=HibernateSessionFactory.getSession();
		//SQL  ---Structured Query Language ---面向R(关系--表)
		//HQL  ---Hibernate Query Language ---面向O(值对象)
		Query query=session.createQuery("from Student");//HQL
		List<Student> students=query.list();
		return students;
	}
//  如果利用Hibernate修改数据库时,需要使用事务处理,一个事务提交时才真正将修改过的记录更新到数据库中。
	public void delStudent(Student student) {
		try {
			Session session=HibernateSessionFactory.getSession();
			Transaction tr=session.beginTransaction();//开启事务
			//注意:要通过完整对象删除,不然很容易出异常。所以要先获取对象
			student=(Student) session.get(Student.class, student.getId());
			session.delete(student);//删除
			tr.commit();//必须进行事务提交才能保存到数据库
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("删除失败!");
		}
	}
	public void addStudent(Student student) {
		try {
			Session session=HibernateSessionFactory.getSession();
			Transaction tran=session.beginTransaction();
			//session.save(student);//只能保存
			session.saveOrUpdate(student);//添加或修改
			tran.commit();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("添加或修改失败!");
		}
	}
	public List<Student> queryStudents(Student student) {
		Session session=HibernateSessionFactory.getSession();
		String hql="from Student s where 1=1";
		//由于这里的查询是让用户输入,为了防黑,所以采用setParameter方法
		boolean f1=false,f2=false,f3=false,f4=false;
		if(student.getId()!=null&&student.getId().trim().length()>0){
			hql+="and s.id=:id";
			f1=true;
		}
		if(student.getName()!=null&&student.getName().trim().length()>0){
			hql+="and s.name like :name";
			f2=true;
		}
		if(student.getAge()!=null&&student.getAge()>0){
			hql+="and s.age=:age";
			f3=true;
		}
		if(student.getDeptId()!=null&&student.getDeptId().trim().length()>0){
			hql+="and s.deptId=:deptId";
			f4=true;
		}
		Query query=session.createQuery(hql);
		System.out.println("query :"+query);
		if(f1){
			query.setParameter("id", student.getId());
		}
		if(f2){
			query.setParameter("name", "%"+student.getName()+"%");//模糊查询
		}
		if(f3){
			query.setParameter("age", student.getAge());
		}
		if(f4){
			query.setParameter("deptId", student.getDeptId());
		}
		List<Student> list=query.list();
		return list;
	}
}


值对象和映射文件没有改动,不再贴出。


show.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
	  <style type="text/css">
	  		table{
	  			border: 1px solid blue;
	  			border-collapse: collapse;
	  			width:60%;
	  		}
	  		td,th{
	  			border: 1px solid blue;
	  			padding: 5px;
	  		}
	  		#t2 tr{
	  			text-align: center;
	  		}
  	  </style>
  </head>
  <script type="text/javascript">
  		var path="<c:url value='/'/>";
  	</script>
  <script type="text/javascript" src="<c:url value='/js/pub.js' />"></script>
  <script type="text/javascript">
  	function query(){
  	//收集用户参数
  		var id=document.getElementsByName("id")[1].value;
  		id=id.trim();
  		var name=document.getElementsByName("name")[1].value;
  		name=name.trim();
  		var age=document.getElementsByName("age")[1].value;
  		age=age.trim();
  		var deptId=document.getElementsByName("deptId")[1].value;
  		deptId=deptId.trim();
  		
  		//ajax提交
  		var ajax =new Ajax();
  		var url = path+"/HibDemoServlet";
  		var param="cmd=queryStudents&id="+id+"&name="+name+"&age="+age+"&deptId="+deptId;
  		ajax.post(url, param, function(data){
  			  if(data=="1"){
  			  		//类似于在地址栏回车(从新请求一次)
  					  window.parent.window.location.href=path;
  				  }	
  		});
  	}
  
  </script>
  <body>
    <h2>演示Hibernate进行单表的增删改查技术</h2>
    <table>
    	<tr align="center">
    		<th>学号</th>
    		<th>姓名</th>
    		<th>年龄</th>
    		<th>学院编号</th>
    		<th>操作</th>
    	</tr>
    	
    	<c:forEach items="${students}" var="student">
    		<tr align="center">
    			<td>${student.id }</td>
    			<td>${student.name }</td>
    			<td>${student.age }</td>
    			<td>${student.deptId }</td>
    			<td><a href="<c:url value='/HibDemoServlet?cmd=delStudent&id=${student.id}' />">删除</a></td>
    		</tr>
    	</c:forEach>
    </table>
    <br/><br/><br/>
    <h3>添加或修改一个学生的信息(*为必填)</h3>
    <form action="<c:url value='/HibDemoServlet?cmd=addStudent' />" method="post">
    	<table id="t2">
    		<tr>
    			<td>学号<font color="red">*</font></td><td><input type="text" name="id" /></td>
    		</tr>
    		<tr>
    			<td>姓名<font color="red">*</font></td><td><input type="text" name="name" /></td>
    		</tr>
    		<tr>
    			<td>年龄<font color="red">*</font></td><td><input type="text" name="age" /></td>
    		</tr>
    		<tr>
    			<td>学院编号<font color="red">*</font></td><td><input type="text" name="deptId" /></td>
    		</tr>
    		<tr>
    			<td colspan="2" ><input type="submit" value="保存/修改" /></td>
    		</tr>
    	</table>
    	
    <h3>学生信息查询</h3>
    	<table >
    		<tr>
    			<td>学号</td><td><input type="text" name="id" /></td>
    		</tr>
    		<tr>
    			<td>姓名</td><td><input type="text" name="name" /></td>
    		</tr>
    		<tr>
    			<td>年龄</td><td><input type="text" name="age" /></td>
    		</tr>
    		<tr>
    			<td>学院编号</td><td><input type="text" name="deptId" /></td>
    		</tr>
    		<tr>
    			<td colspan="2" align="center"><input type="button" value="查询" onclick="query()"/></td>
    		</tr>
    	</table>
    </form>
    <c:if test="${!empty sessionScope.list }">
    	<table>
    	<tr align="center">
    		<th>学号</th>
    		<th>姓名</th>
    		<th>年龄</th>
    		<th>学院编号</th>
    		<th>操作</th>
    	</tr>
    	
    	<c:forEach items="${list}" var="student2">
    		<tr align="center">
    			<td>${student2.id }</td>
    			<td>${student2.name }</td>
    			<td>${student2.age }</td>
    			<td>${student2.deptId }</td>
    			<td><a href="<c:url value='/HibDemoServlet?cmd=delStudent&id=${student2.id}' />">删除</a></td>
    		</tr>
    	</c:forEach>
    </table>
    </c:if>
  </body>
</html>
   


pub.js

String.prototype.trim=function(){
	var p = /^\s*/;
	var str = this.replace(p,"");
	p = /\s*$/;
	str = str.replace(p,"");
	return str;
};
//生成ajax对象
function Ajax(){
	this.getHttp=function(){//生成ajax对象
		if(window.XMLHttpRequest){
			return new XMLHttpRequest();
		}else{
			return new ActiveXObject("Microsoft.XMLHttp");
		}
	};
	var http = this.getHttp();//获取XHR对象
	//post请求,接收四个参数为url,param,success,failure
	this.post=function(url,param,func,failure){
		http.open("POST",url,true);
		http.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//指定编码:utf-8,防止数据传送到后台中文乱码
		http.onreadystatechange=function(){
			if(http.readyState==4){
				if(http.status==200){
					var text=http.responseText;
					//调用用户的成功方法
					func(text);
				}else{
					//通信失败,若存在失败方法,则调用
					if(failure){
						failure(http.status,http);
					}
				}
			}
		};
		if(param){
			http.send(param);
		}else{
			http.send();
		}
	};
};


 

知识点:

1.hibernate修改数据库时要开启事务

2.hibernate自带缓存

3.window.parent.window.location.href=path;//类似于在地址栏回车(从新请求一次)

4.hibernate视线模糊查询

5.ajax的post方式提交数据乱码:http.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//指定编码:utf-8,防止数据传送到后台中文乱码

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值