Hibernate有四种操作方式,分别为OID、HQL、QBC、SQL。
OID:对象标识符,Hibernate来标记唯一的对象的标记,其实就是主键
可以实现的操作:增删改查
比如我们常用的
save、update、delete、get、load、saveOrUpdate等方法
特点:操作简单
缺点:无法实现复杂条件查询
示例代码:
//oid操作
@Test
public void test1(){
User user=new User();
user.setPass("11");
user.setUserName("lx");
System.out.println(session.save(user));//保存
User user2=session.get(User.class, 3);//查询
user2.setUserName("胡汉三");
session.update(user2);//修改
User user3=new User();
user3.setId(4);
session.delete(user3);//删除
}
HQL:Hibernate Query Language面向对象查询
是Hibernate特有的一种查询方式
其实就是将sql转换为对象
之前操作的是表,现在操作的是类
之前操作的是字段,现在操作的是属性
之前操作的一条数据,现在操作的是对象
比如:from User
这个User就是类名而不是表明
操作HQL的对象是Query
HQL可以实现:修改、删除、查询、复杂条件、聚合函数调用等
示例代码:
//HQL操作
@Test
public void test2(){
//1、查询实体
String hql1="from User";
//String hql1="select new User(id,username,pass) from User";//查询实体,完整写法
Query<User> query=session.createQuery(hql1,User.class);//获取操作HQL的对象
List<User> list=query.getResultList();//获取多条查询的结果
User user=query.uniqueResult();//获取单一结果,要求结果必须为一个,否则报异常
//2、按条件进行查询
String hql2="from User where id=?";//索引占位符
//String hql2="from User where id=:id";//命名占位符
Query<User> query2=session.createQuery(hql2);
query2.setParameter(0, 1);//位索引占位符,赋值,从0开始
//query2.setParameter("id", 1);//命名占位符,赋值
User user2=query2.getSingleResult();//获取唯一对象
//3、使用函数
String hql3="select COUNT(id) from User";
Query<Long> query3=session.createQuery(hql3);
long count=query3.getSingleResult();
//4、使用分页
String hql4="from User";
Query<User> query4=session.createQuery(hql4,User.class);
query4.setFirstResult(0);//设置起始行索引:(当前页数-1)*每页显示的数量
query4.setMaxResults(10);//每页显示的数量
List<User> list4=query4.getResultList();
//5、修改
String hql5="update User set pass=:pass where id=:id";
Query query5=session.createQuery(hql5);
query5.setParameter("pass","123456");
query5.setParameter("id",3);
query5.executeUpdate();
//6、删除
String hql6="delete from User where id=?";
Query query6=session.createQuery(hql6);
query6.setParameter(0, 3);
query6.executeUpdate();
}
当然HQL也指出多表联合查询,但是不需要使用on,只需写出inner join、left join、right join等
QBC:Query By Criteria
是简化的HQL的查询操作
目的:就是可以不用写各种查询的关键字就可以实现复杂条件的查询
但是Hibernate5.2.1x中过时了
示例代码:
//QBC查询操作
@Test
public void test3(){
Session session=HibUtils.getCurrentSession();
Transaction tran=session.beginTransaction();
//创建操作QBC的对象
Criteria criteria=session.createCriteria(User.class);
//添加各种条件
criteria.add(Restrictions.in("id", new Integer[]{1,2,3}));//in
criteria.add(Restrictions.and(Restrictions.ilike("pass", "%1%")));//like模糊查询
//获取查询的所有结果
List list=criteria.list();
tran.commit();
}
QBC现在过时了,就是之前需要自己写查询条件的各种关键字,新视野QBC就不用了,因为使用方法代替了。
SQL:Hibernate支持原生的SQL操作
可以实现增删改查
就是自己写SQL语句
示例代码:
// SQL查询操作
@Test
public void test4() {
Session session = HibUtils.getCurrentSession();
Transaction tran = session.beginTransaction();
String sql="select * from tb_user";//自己写SQL语句
//之前的写法,现在过时
//NativeQuery query=session.createSQLQuery(sql);
//现在的写法
NativeQuery query=session.createNativeQuery(sql);
List list=query.getResultList();
tran.commit();
}
这个是万能写法,因为自己写SQL语句。
以上就是Hibernate支持的几种操作方式。
现在贴出完整的单元测试代码:
public class QueryTest {
private Session session;
private Transaction tran;
@Before
public void pre() {
session = HibUtils.getCurrentSession();
tran = session.beginTransaction();
}
// oid操作
@Test
public void test1() {
User user = new User();
user.setPass("11");
user.setUserName("lx");
System.out.println(session.save(user));// 保存
User user2 = session.get(User.class, 3);// 查询
user2.setUserName("胡汉三");
session.update(user2);// 修改
User user3 = new User();
user3.setId(4);
session.delete(user3);// 删除
}
// HQL操作
@Test
public void test2() {
// 1、查询实体
String hql1 = "from User";
// String hql1="select new User(id,username,pass) from User";//查询实体,完整写法
Query query = session.createQuery(hql1, User.class);// 获取操作HQL的对象
List list = query.getResultList();// 获取多条查询的结果
User user = query.uniqueResult();// 获取单一结果,要求结果必须为一个,否则报异常
// 2、按条件进行查询
String hql2 = "from User where id=?";// 索引占位符
// String hql2="from User where id=:id";//命名占位符
Query query2 = session.createQuery(hql2);
query2.setParameter(0, 1);// 位索引占位符,赋值,从0开始
// query2.setParameter("id", 1);//命名占位符,赋值
User user2 = query2.getSingleResult();// 获取唯一对象
// 3、使用函数
String hql3 = "select COUNT(id) from User";
Query query3 = session.createQuery(hql3);
long count = query3.getSingleResult();
// 4、使用分页
String hql4 = "from User";
Query query4 = session.createQuery(hql4, User.class);
query4.setFirstResult(0);// 设置起始行索引:(当前页数-1)*每页显示的数量
query4.setMaxResults(10);// 每页显示的数量
List list4 = query4.getResultList();
// 5、修改
String hql5 = "update User set pass=:pass where id=:id";
Query query5 = session.createQuery(hql5);
query5.setParameter("pass", "123456");
query5.setParameter("id", 3);
query5.executeUpdate();
// 6、删除
String hql6 = "delete from User where id=?";
Query query6 = session.createQuery(hql6);
query6.setParameter(0, 3);
query6.executeUpdate();
}
// QBC查询操作
@Test
public void test3() {
Session session = HibUtils.getCurrentSession();
Transaction tran = session.beginTransaction();
// 创建操作QBC的对象
Criteria criteria = session.createCriteria(User.class);
// 添加各种条件
criteria.add(Restrictions.in("id", new Integer[] { 1, 2, 3 }));// in
criteria.add(Restrictions.and(Restrictions.ilike("pass", "%1%")));// like模糊查询
// 获取查询的所有结果
List list = criteria.list();
tran.commit();
}
// SQL查询操作
@Test
public void test4() {
Session session = HibUtils.getCurrentSession();
Transaction tran = session.beginTransaction();
String sql="select * from tb_user";//自己写SQL语句
//之前的写法,现在过时
//NativeQuery query=session.createSQLQuery(sql);
//现在的写法
NativeQuery query=session.createNativeQuery(sql);
List list=query.getResultList();
tran.commit();
}
@After
public void end() {
tran.commit();
}
}
HibUtils自己封装的工具类用于加载数据库配置信息并创建Session对象,代码如下:
public class HibUtils {
private static SessionFactory factory;
static {
factory = new Configuration().configure().buildSessionFactory();
}
//安全,效率高
public static Session getCurrentSession() {
return factory.getCurrentSession();
}
}