hibernate的基本的增删改查
将之前的相同部分代码分装成一个类
HibernateUtil.java
package util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
//声明一个私有的静态final类型的Configuration对象
private static final Configuration config;
//声明一个私有的静态final类型的SessionFactory对象
private static final SessionFactory factory;
//通过静态代码块构建sessionFactory
static {
config=new Configuration().configure();
factory=config.buildSessionFactory();
}
//提供一个公有的静态方法供外部访问,并返回一个session对象
public static Session getSession() {
return factory.openSession();
}
}
1.使用hql(主流)
查找所有的方法:
// 使用query查找所有信息
@Test
public void findAll() {
// 1、得到session
Session session = HibernateUtil.getSession();
// 2、开启事务
Transaction t = session.beginTransaction();
// 3、操作
// 1、编写hql
String hql = "from Student";// Student 代表是类 select * from t_student
// 2、调用session.createQuery创建查询对象
Query query = session.createQuery(hql);
// 3.使用query.list()方法查询数据,并将查询数据放入一个list集合
List<Student> list = query.list();
for (Student s : list) {
// 循环输出查询出来的数据
System.out.println(s);
}
// 4、提交事务
t.commit();
// 5、关闭资源
session.close();
}
query按条件查询,返回一个值
public void uniqueResult() {
// 1、得到session
Session session = HibernateUtil.getSession();
// 2、开启事务
Transaction t = session.beginTransaction();
// 3、操作
// 1、编写hql,调用session.createQuery创建查询对象
Query query = session.createQuery("from Student where id=:id");
// 2、调用query对象给参数赋值
// query.setInteger("id", 2);// hibernate5已经显示这个方法是低版本的
query.setParameter("id", 3);
// 3.调用query对象的uniqueResult方法执行查询
Student s = (Student) query.uniqueResult();
System.out.println(s);
// 4、提交事务
t.commit();
// 5、关闭资源
session.close();
}
query分页查询
public void queryPageTest() {
// 1、得到session
Session session = HibernateUtil.getSession();
// 2、开启事务
Transaction t = session.beginTransaction();
// 3、操作
// 1、编写hql,调用session.createQuery创建查询对象
Query query = session.createQuery("from Student");
query.setFirstResult(2);
query.setMaxResults(3);
List<Student> list = query.list();
for (Student s : list) {
// 循环输出查询出来的数据
System.out.println(s);
}
// 4、提交事务
t.commit();
// 5、关闭资源
session.close();
}
部分检索(投影1)
public void portionQueryTest() {
// 1、得到session
Session session = HibernateUtil.getSession();
// 2、开启事务
Transaction t = session.beginTransaction();
// 3、操作
// 1、编写hql,调用session.createQuery创建查询对象
// Query query = session.createQuery("select id,from from Student");// 在hql语言中
// 这样写是不能转译的
Query query = session.createQuery("select new Student(id,name) from Student"); // 先要new带参数的构造方法
List<Student> list = query.list();
for (Student s : list) {
// 循环输出查询出来的数据
System.out.println(s);
}
// 4、提交事务
t.commit();
// 5、关闭资源
session.close();
}
部分检索(投影2)
public void portionQueryTest2() {
// 1、得到session
Session session = HibernateUtil.getSession();
// 2、开启事务
Transaction t = session.beginTransaction();
// 3、操作
// 1、编写hql,调用session.createQuery创建查询对象
// Query query = session.createQuery("select id,from from Student");// 在hql语言中
// 这样写是不能转译的
Query query = session.createQuery("select s.name, s.sex from Student as s"); // 先要new带参数的构造方法
List<Student> list = query.list();
Iterator iter= list.iterator();
while(iter.hasNext()) {
//每条记录被封装成object数组
Object[] obj= (Object []) iter.next();
System.out.println(obj[0]+" "+obj[1]);
}
// 4、提交事务
t.commit();
// 5、关闭资源
session.close();
}
条件查询使用where 语句
public void paramQueryTest() {
// 1、得到session
Session session = HibernateUtil.getSession();
// 2、开启事务
Transaction t = session.beginTransaction();
// 3、操作
// 1、编写hql,调用session.createQuery创建查询对象
Query query = session.createQuery("from Student as s where s.name='lisi'"); // 先要new带参数的构造方法
List<Student> list = query.list();
for (Student s : list) {
// 循环输出查询出来的数据
System.out.println(s);
}
// 4、提交事务
t.commit();
// 5、关闭资源
session.close();
}
条件查询使用?占位符
public void paramQueryTest2() {
// 1、得到session
Session session = HibernateUtil.getSession();
// 2、开启事务
Transaction t = session.beginTransaction();
// 3、操作
// 1、编写hql,调用session.createQuery创建查询对象
Query query = session.createQuery("from Student as s where s.name like ?1 and s.sex >=?2"); // 先要new带参数的构造方法
//问题:使用占位符,低版本是直接可以使用?,但是现在5版本要求是否是?0这样的方式?
// query.setString(0, "lisi");
query.setParameter(1, "li%");
query.setParameter(2, "15");
List<Student> list = query.list();
for (Student s : list) {
// 循环输出查询出来的数据
System.out.println(s);
}
// 4、提交事务
t.commit();
// 5、关闭资源
session.close();
}
条件查询使用:占位符
public void paramQueryTest3() {
// 1、得到session
Session session = HibernateUtil.getSession();
// 2、开启事务
Transaction t = session.beginTransaction();
// 3、操作
// 1、编写hql,调用session.createQuery创建查询对象
Query query = session.createQuery("from Student as s where s.name like :name"); // 先要new带参数的构造方法
//问题:使用占位符,低版本是直接可以使用?,但是现在5版本要求是否是?0这样的方式?
// query.setString(0, "lisi");
query.setParameter("name", "li%");
List<Student> list = query.list();
for (Student s : list) {
// 循环输出查询出来的数据
System.out.println(s);
}
// 4、提交事务
t.commit();
// 5、关闭资源
session.close();
}
2.使用sql----createSQLQuery
// 使用qbc查询所有数据
@Test
public void test1() {
Session session = HibernateUtil.getSession();
session.beginTransaction();
// 操作
Criteria criteria = session.createCriteria(Student.class);
List<Student> ss = criteria.list();
for (Student s : ss) {
System.out.println(s);
}
session.getTransaction().commit();
session.close();
}
// qbc查询:只返回一个值
@Test
public void test2() {
Session session = HibernateUtil.getSession();
session.beginTransaction();
// 操作
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("id", 7));// 相当于查询id=7这条记录
Student s = (Student) criteria.uniqueResult();
System.out.println(s);
session.getTransaction().commit();
session.close();
}
// qbc查询:多条件查询 and
@Test
public void test3() {
Session session = HibernateUtil.getSession();
session.beginTransaction();
// 操作
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("id", 7)).add(Restrictions.eq("name", "lisi"));// 相当于where id=7 and name="lisi"
List<Student> ss = criteria.list();
for (Student s : ss) {
System.out.println(s);
}
session.getTransaction().commit();
session.close();
}
// qbc查询:多条件查询 or
@Test
public void test4() {
Session session = HibernateUtil.getSession();
session.beginTransaction();
// 操作
Criteria criteria = session.createCriteria(Student.class);
// 相当于where id=1 or name="zhagnsan"
criteria.add(Restrictions.or(Restrictions.eq("id", 7), Restrictions.eq("name", "zhagnsan")));
List<Student> ss = criteria.list();
for (Student s : ss) {
System.out.println(s);
}
session.getTransaction().commit();
session.close();
}
// qbc查询:分页查询
@Test
public void test5() {
Session session = HibernateUtil.getSession();
session.beginTransaction();
// 操作
Criteria criteria = session.createCriteria(Student.class);
criteria.setFirstResult(2);
criteria.setMaxResults(3);
List<Student> ss = criteria.list();
for (Student s : ss) {
System.out.println(s);
}
session.getTransaction().commit();
session.close();
}
3.使用第三方库 (经常使用)–createCriteria
// 使用sql语句查询所有信息
@Test
public void findAll() {
Session session= HibernateUtil.getSession();
session.beginTransaction();
//操作
SQLQuery sqlQuery=session.createSQLQuery("select * from t_student");
List list= sqlQuery.list();
for(int i=0;i<list.size();i++) {
Object[] objs=(Object[]) list.get(i); //对象放入数组中
//循环输出数组中的元素
for(int j=0;j<objs.length;j++) {
System.out.println(objs[j]+" ");
}
System.out.println();
}
session.getTransaction().commit();
session.close();
}