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="查詢" οnclick="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,防止數據傳送到後臺中文亂碼

 

 

 

 

 

發佈了121 篇原創文章 · 獲贊 49 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章