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,防止数据传送到后台中文乱码