标题:Hibernate学习笔记二-增删改查(CRUD)
目的:如何使用Hibernate的概念
Author: kagula
Date: 2016-11-04
环境:
[1]java version "1.7.0_79"
[2]Eclipse J2EE Mars.2
[3]Hibernate 4.3.11
[4]Win7-64 bits
[5]MySQL
Remark:
和上篇重复部份这里不列了。
JUnit测试方法
Session session = HibernateUtils.getSession();
void Create()
{
//Create 9 records.
session.beginTransaction();
for(int i=2;i<10;i++)
{
Student s = new Student();
//如果id为1的记录已经存在,会报WARN: Duplicate entry '1' for key 'PRIMARY'的警告。
//添加id为1的记录会失败,并抛出异常。
s.setId(i);
s.setName("user["+i+"]");
s.setAge(18+i);
session.save(s);
}
session.getTransaction().commit();
//若commit异常可以回滚 session.getTransaction().rollback();
}
void Delete()
{
//删除id为1的记录
//采用load查询不存在的数据, Hibernate会抛出object not found exception
//也可以new一个对象,设置id,然后调用delete(),
//session.beginTransaction();
//Student s = (Student)session.load(Student.class, "1");
//session.delete(s);
//session.getTransaction().commit();
//删除年龄等于20岁的记录,采用顺序点位符。
// session.beginTransaction();
// StringBuffer sql = new StringBuffer();
// sql.append("delete Student where age=?");
// Query query = session.createQuery(sql.toString());
// query.setParameter(0,22);
// int nDels = query.executeUpdate();
// System.out.println("query.executeUpdate()=" + nDels);
// session.getTransaction().commit();
//删除年龄大于等于23岁的所有记录,采用符号占位符。
session.beginTransaction();
StringBuffer sql = new StringBuffer();
sql.append("delete Student where age>=:age");
Query query = session.createQuery(sql.toString());
query.setParameter("age",23);
int nDels = query.executeUpdate();//返回受影响的记录数
System.out.println("query.executeUpdate()=" + nDels);
session.getTransaction().commit();
}
void Query()
{
//
session.beginTransaction();
String hql1="from Student where age>=:age";
Query query=session.createQuery(hql1);//session.createSQLQuery(arg0)
query.setString("age","25");
List<Student> list1 = query.list();
for(Student s:list1){
System.out.println("id="+s.getId()+",age="+s.getAge());
}
session.beginTransaction().commit();
//Srping Framework有对Hibernate的进一步封装,比如提供了getHibernateTemplate()
//用它来返回List<Map<String, Object>>类型结果集。
//Hibernate将sql或hql查询结果集映射为实体类 不需要映射文件
//http://glamey.iteye.com/blog/721019
//下面方法未测试。
//可以加在实体类上,也可以加在字段的get方法上,进行条件过滤。
//@Where(clause = "deleted='y'")
}
void Update()
{
//根据id来修改
session.beginTransaction();
//因为Student的id属性是int类型,所以load的第二个参数也必须是int类型。
Student s = (Student)session.load(Student.class, 2);
s.setName("Kikyou");
session.update(s);
session.getTransaction().commit();
//根据其它字段形成的条件语句来修改
session.beginTransaction();
String hql = "update Student set name=? where age=?";
Query query=session.createQuery(hql);
query.setString(0,"robot");
query.setInteger(1, 26);
query.executeUpdate();
session.getTransaction().commit();
}
@Test
public void testCRUD()
{
//Create();
Query();
//Update();
//Delete();
}
依赖的文件
HibernateUtils.java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
/*
*读取Hibernate.cfg.xml文件
*/
private static SessionFactory factory;
static {
try {
//读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
//建立SessionFactory
factory = cfg.buildSessionFactory();
}catch(Exception e) {
e.printStackTrace();
}
}
/*
*打开Session
*/
public static Session getSession() {
return factory.openSession();
}
/*
*关闭Session
*/
public static void closeSession(Session session) {
if (session != null) {
if (session.isOpen()) {
session.close();
}
}
}
public static SessionFactory getSessionFactory() {
return factory;
}
}
参考资料:
[1]官网文档
http://hibernate.org/orm/documentation/4.3/
[2]『Hibernate』面对几个错误的解决关键
http://looxiaohu.iteye.com/blog/201194
[3]对Hibernate操作的一个封装
http://www.cnblogs.com/ronaldHU/p/3806681.html
[4]session.createQuery()与createSQLQuery()区别
createSQLQuery 这是用SQL语句查询。查询返回值是Object[]数组对象
http://blog.csdn.net/zdwzzu2006/article/details/6863660
[5]浅谈hql和sql的区别,描述特别需要注意的地方
https://zhidao.baidu.com/question/306528137608260124.html