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,防止數據傳送到後臺中文亂碼