一、Hibernate定义
是一个ORM对象关系映射框架,对JDBC进行了封装,将java实体类映射到数据库表中,将java实体类成员变量数据类型映射到数据库表字段数据类型中,开发人员直接操作对象,避免大量数据编程(SQL编写),提升了开发效率。
二、Hibernate使用过程
1、根据配置信息,创建配置对象.
2、通过配置对象创建sessionFactory 对象,来配置hibernate。
3、通过sessionFactory 对象用来创建Session 对象,进行数据库物理连接,与数据库进行交互。
4、选择性创建Transaction 对象,有事务创建,没事务不创建。
5、可以创建Query对象,Query 对象用来执行HQL语句
6、可以创建Criteria 对象,Criteria 对象用来执行标准化查询。
7、可以创建sqlQuery对象,用来执行原生的sql。
三、Hibernate常使用的注解
@Entity注解用于定义实体
@Table注解用于定义对应的数据库表名
@Id注解用于定义主键
@GeneratedValue注解用于定义自增
@Column注解用于定义字段名
四、Session对象常用的方法
1、Transaction beginTransaction() 开始工作单位,并返回关联事务对象。
2、void clear() 完全清除该会话。
3、Connection close() 通过释放和清理 JDBC 连接以结束该会话。
4、Query createQuery(String queryString) 为给定的 HQL 查询字符创建查询的新实例。
5、sqlQuery createSQLQuery(String queryString) 为给定的 SQL 查询字符串创建 SQLQuery 的新实例。
6、void delete(Object object) 从数据存储中删除持久化实例。
7、void delete(String entityName, Object object) 从数据存储中删除持久化实例。
8、Session get(String entityName, Serializable id) 返回给定命名的且带有给定标识符或 null 的持久化实例(若无该种持久化实例)。
9、SessionFactory getSessionFactory() 获取创建该会话的 session 工厂。
10、Serializable save(Object object) 先分配一个生成的标识,以保持给定的瞬时状态实例。
11、void saveOrUpdate(Object object) 保存(对象)或更新(对象)给定的实例。
12、void update(Object object) 更新带有标识符且是给定的处于脱管状态的实例的持久化实例。
13、void update(String entityName, Object object) 更新带有标识符且是给定的处于脱管状态的实例的持久化实例。
五、具体使用案例
创建session对象
@Autowired
protected SessionFactory sessionFactory;
Session session = sessionFactory.openSession();
1、执行事务
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// do some work
...
tx.commit();
}
catch (Exception e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
2、Hql查询语言
普通查询语句
String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
as语句
String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
SELECT 语句
String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
ORDER BY 语句
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();
GROUP BY 语句
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
"GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();
使用命名参数
Hibernate 的 HQL 查询功能支持命名参数。这使得 HQL 查询功能既能接受来自用户的简单输入,又无需防御 SQL 注入攻击
String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();
UPDATE 语句
String hql = "UPDATE Employee set salary = :salary " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);`在这里插入代码片`
DELETE 语句
String hql = "DELETE FROM Employee " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
INSERT 语句
String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
"SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
3、标准查询
Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();
标准的限制
Criteria cr = session.createCriteria(Employee.class);
cr.add(Restrictions.eq("salary", 2000));
List results = cr.list();
以下是几个例子,涵盖了不同的情况,可按要求进行使用:
Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
// To get records having salary less than 2000
cr.add(Restrictions.lt("salary", 2000));
// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));
// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));
// To get records having salary in between 1000 and 2000
cr.add(Restrictions.between("salary", 1000, 2000));
// To check if the given property is null
cr.add(Restrictions.isNull("salary"));
// To check if the given property is not null
cr.add(Restrictions.isNotNull("salary"));
// To check if the given property is empty
cr.add(Restrictions.isEmpty("salary"));
// To check if the given property is not empty
cr.add(Restrictions.isNotEmpty("salary"));
创建 AND 或 OR 的条件组合
Criteria cr = session.createCriteria(Employee.class);
Criterion salary = Restrictions.gt("salary", 2000);
Criterion name = Restrictions.ilike("firstNname","zara%");
// To get records matching with OR condistions
LogicalExpression orExp = Restrictions.or(salary, name);
cr.add( orExp );
// To get records matching with AND condistions
LogicalExpression andExp = Restrictions.and(salary, name);
cr.add( andExp );
List results = cr.list()
分页使用标准
Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(0);//开始位置记录值应该为0
cr.setMaxResults(10);
List results = cr.list();
排序结果
Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
// To sort records in descening order
crit.addOrder(Order.desc("salary"));
// To sort records in ascending order
crit.addOrder(Order.asc("salary"));
List results = cr.list();
预测与聚合
Criteria cr = session.createCriteria(Employee.class);
// To get total row count,获取具体数值
cr.setProjection(Projections.rowCount());
long allCounts = ((Long) cr.setProjection(Projections.rowCount()).uniqueResult()).intValue();
// To get average of a property.
cr.setProjection(Projections.avg("salary"));
// To get distinct count of a property.
cr.setProjection(Projections.countDistinct("firstName"));
// To get maximum of a property.
cr.setProjection(Projections.max("salary"));
// To get minimum of a property.
cr.setProjection(Projections.min("salary"));
// To get sum of a property.
cr.setProjection(Projections.sum("salary"));
四、原生SQL
标量查询
String sql = "SELECT first_name, salary FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List results = query.list();
实体查询
以上的查询都是关于返回标量值的查询,只是基础性地返回结果集中的“原始”值。以下是从原生 SQL 查询中通过 addEntity() 方法获取实体对象整体的语法:
String sql = "SELECT * FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List results = query.list();
指定 SQL 查询
以下是从原生 SQL 查询中通过 addEntity() 方法和使用指定 SQL 查询来获取实体对象整体的语法:
String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id";
//创建sqlquery对象
SQLQuery query = session.createSQLQuery(sql);
//指定实体
query.addEntity(Employee.class);
//指定参数
query.setParameter("employee_id", 10);
//返回结果集
List results = query.list();