1. 최대 절전 모드의 엔터티 규칙
엔티티 클래스 생성에 대한 참고 사항
1. 지속성 클래스는 매개변수 없는 구성을 제공합니다.
2. 멤버 변수는 비공개이며 공용 get/set 메서드 액세스를 제공합니다
3. 영속 클래스의 속성은 패키징 유형을 사용해야 합니다
4. 영속 클래스는 oid를 제공해야 합니다. 데이터베이스의 기본 키 열에 해당합니다
5. 클래스를 수정하기 위해 final을 사용하지 마세요
key Type
자연 기본 키(희귀)
테이블에 충족되고, 있어야 하며, 반복되지 않는 비즈니스 열이 있는 경우 해당 열을 기본 키로 사용할 수 있습니다.
대리 기본 키( 공통)
테이블의 비즈니스 컬럼 중 충족하고, 가져야 하며, 반복되지 않는 비즈니스 컬럼이 없는 경우 비즈니스 의미가 없는 컬럼을 기본 키로 생성
기본 키 생성 strategy
대리 기본 키:
ID: 기본 키 값은 데이터베이스에 의해 유지됩니다.
순서: 기본 키를 지정할 필요가 없습니다.
증분(이해): 기본 키는 최대 절전 모드로 유지됩니다. 각 삽입 전 테이블의 ID 최대값은 새 주 소유자의 키 값입니다. 10명이 동시에 동시 사용하는 경우 쿼리에 문제가 있습니다. 개발 중에는 사용되지 않습니다.
Native:hilo+sequence+identity 세 가지 전략 중 하나를 자동으로 선택합니다.
uuid: 기본 키로 임의의 문자열을 생성합니다. 기본 키 유형은 문자열 유형이어야 합니다.
2. 객체 상태. 최대 절전 모드
객체는 세 가지 상태로 구분됩니다
//测试对象的三种状态public class Demo { @Test//查看三种状态public void fun1(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态 c.setCust_name("联想"); // 瞬时状态 session.save(c); // 持久化状态, 有id,有关联 //4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } @Test//三种状态特点//save方法: 其实不能理解成保存.理解成将瞬时状态转换成持久状态的方法//主键自增 : 执行save方法时,为了将对象转换为持久化状态.必须生成id值.所以需要执行insert语句生成.//increment: 执行save方法,为了生成id.会执行查询id最大值的sql语句.public void fun2(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态 c.setCust_name("联想"); // 瞬时状态 session.save(c); // 持久化状态, 有id,有关联 //4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } @Test//三种状态特点// 持久化状态特点: 持久化状态对象的任何变化都会自动同步到数据库中.public void fun3(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作 Customer c = session.get(Customer.class, 1l);//持久化状态对象 c.setCust_name("微软公司"); //4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } }
세 가지 상태의 전환 다이어그램
3. 최대 절전 모드 - 1단계 캐시
캐시: 효율성 향상 최대 절전 모드의 1차 캐시는 데이터베이스 운영 효율성도 향상시킵니다.효율성 향상 방법 1: 쿼리 효율성 향상
효율성 향상을 의미합니다. 2: 불필요한 수정문 전송을 줄입니다
4. hibernate에서의 트랜잭션
지식 포인트: 최대 절전 모드에서 데이터베이스의 격리 수준
<!-- 指定hibernate操作数据库时的隔离级别 #hibernate.connection.isolation 1|2|4|8 0001 1 读未提交 0010 2 读已提交 0100 4 可重复读 1000 8 串行化 --> <property name="hibernate.connection.isolation">4</property>
지식 2: 프로젝트에서 트랜잭션을 관리하는 방법
비즈니스가 시작되기 전에 트랜잭션을 열고, 비즈니스가 실행된 후에 트랜잭션을 커밋합니다. 실행 프로세스 중에 예외가 발생했습니다. dao 계층에서 데이터베이스를 작동하려면 세션 개체가 필요합니다. 서비스 제어 트랜잭션도 세션 개체를 사용하여 완료됩니다. hibernate에서 dao 계층과 서비스 계층이 동일한 세션 개체를 사용하는지 확인해야 합니다. , Hibernate는 동일한 세션이 사용되도록 보장하는 문제를 해결하는 데 도움이 되었습니다. 우리 개발자는 현재 스레드에 바인딩된 세션 개체를 얻기 위해 sf.getCurrentSession() 메서드만 호출하면 됩니다. 참고 1: getCurrentSession 메서드를 호출하려면 기본 구성에서 구성 섹션을 일치시킵니다.<!-- 指定session与当前线程绑定 --> <property name="hibernate.current_session_context_class">thread</property>참고 2: getCurrentSession 메소드를 통해 얻은 세션 개체는 트랜잭션이 제출되면 자동으로 종료됩니다.
crm. 프로젝트:
서비스 계층 및 public void save(Customer c) {
Session session = HibernateUtils.getCurrentSession();//打开事务Transaction tx = session.beginTransaction();//调用Dao保存客户try {
customerDao .save(c);
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}//关闭事务 tx.commit();
}
E
🎜🎜 🎜🎜🎜🎜 🎜🎜🎜🎜 🎜🎜🎜🎜 🎜🎜🎜🎜 🎜🎜 🎜🎜(개요) 🎜🎜🎜🎜🎜hql 쿼리-Hibernate 쿼리 언어(다중 테이블 쿼리, 하지만 사용하면 복잡하지 않습니다 )🎜🎜🎜객체 지향 쿼리 언어인 Hibernate 전용 쿼리 언어🎜🎜
public void save(Customer c) {//1 获得sessionSession session = HibernateUtils.getCurrentSession();//3 执行保存 session.save(c); }🎜🎜🎜🎜🎜Criteria 쿼리(단일 테이블 조건 쿼리)🎜🎜🎜Hibernate 자체의 문장 없는 객체 지향 쿼리 🎜🎜
//测试HQL语句public class Demo { @Test//基本查询public void fun1(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句// String hql = " from cn.itheima.domain.Customer ";String hql = " from Customer "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//3> 根据查询对象获得查询结果List<Customer> list = query.list(); // 返回list结果//query.uniqueResult();//接收唯一的查询结果 System.out.println(list);//-------------------------------------------//4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } @Test//条件查询//HQL语句中,不可能出现任何数据库相关的信息的public void fun2(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句String hql = " from Customer where cust_id = 1 "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//3> 根据查询对象获得查询结果Customer c = (Customer) query.uniqueResult(); System.out.println(c);//-------------------------------------------//4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } @Test//条件查询//问号占位符public void fun3(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句String hql = " from Customer where cust_id = ? "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//设置参数//query.setLong(0, 1l);query.setParameter(0, 1l);//3> 根据查询对象获得查询结果Customer c = (Customer) query.uniqueResult(); System.out.println(c);//-------------------------------------------//4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } @Test//条件查询//命名占位符public void fun4(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句String hql = " from Customer where cust_id = :cust_id "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//设置参数query.setParameter("cust_id", 1l);//3> 根据查询对象获得查询结果Customer c = (Customer) query.uniqueResult(); System.out.println(c);//-------------------------------------------//4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } @Test//分页查询public void fun5(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句String hql = " from Customer "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//设置分页信息 limit ?,?query.setFirstResult(1); query.setMaxResults(1);//3> 根据查询对象获得查询结果List<Customer> list = query.list(); System.out.println(list);//-------------------------------------------//4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } }🎜🎜🎜🎜 🎜네이티브 SQL 쿼리(복잡한 비즈니스 쿼리)🎜🎜🎜
//测试Criteria查询public class Demo { @Test//基本查询public void fun1(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//------------------------------------------- //查询所有的Customer对象Criteria criteria = session.createCriteria(Customer.class); List<Customer> list = criteria.list(); System.out.println(list); // Customer c = (Customer) criteria.uniqueResult(); //-------------------------------------------//4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } @Test//条件查询//HQL语句中,不可能出现任何数据库相关的信息的// > gt// >= ge// < lt// <= le// == eq// != ne// in in// between and between// like like// is not null isNotNull// is null isNull// or or// and andpublic void fun2(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//创建criteria查询对象Criteria criteria = session.createCriteria(Customer.class);//添加查询参数 => 查询cust_id为1的Customer对象criteria.add(Restrictions.eq("cust_id", 1l));//执行查询获得结果Customer c = (Customer) criteria.uniqueResult(); System.out.println(c);//-------------------------------------------//4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } @Test//分页查询public void fun3(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//创建criteria查询对象Criteria criteria = session.createCriteria(Customer.class);//设置分页信息 limit ?,?criteria.setFirstResult(1); criteria.setMaxResults(2);//执行查询List<Customer> list = criteria.list(); System.out.println(list);//-------------------------------------------//4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } @Test//查询总记录数public void fun4(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//创建criteria查询对象Criteria criteria = session.createCriteria(Customer.class);//设置查询的聚合函数 => 总行数 criteria.setProjection(Projections.rowCount());//执行查询Long count = (Long) criteria.uniqueResult(); System.out.println(count);//-------------------------------------------//4提交事务.关闭资源 tx.commit(); session.close();// 游离|托管 状态, 有id , 没有关联 } }🎜
五、练习:客户列表
案例比较简单,可以按照上面笔记的知识点完成
servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1 调用Service查询所有客户List<Customer> list = cs.getAll();//2 将客户列表放入request域request.setAttribute("list", list);//3 转发到list.jsp显示request.getRequestDispatcher("/jsp/customer/list.jsp").forward(request, response); }
service:
public List<Customer> getAll() { Session session = HibernateUtils.getCurrentSession();//打开事务Transaction tx = session.beginTransaction(); List<Customer> list = customerDao.getAll(); //关闭事务 tx.commit();return list; }
dao:
public List<Customer> getAll() {//1 获得sessionSession session = HibernateUtils.getCurrentSession();//2 创建Criteria对象Criteria c = session.createCriteria(Customer.class);return c.list(); }
위 내용은 java--엔티티 규칙, 개체 상태, 캐시, 트랜잭션, 일괄 쿼리 및 고객 목록 표시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!