1. Entitätsregeln im Ruhezustand
Hinweise zur Erstellung von Entitätsklassen
1. Persistenz Die Klasse bietet Parameterlose Konstruktion
2. Mitgliedsvariablen sind privat und bieten öffentlichen Zugriff auf Get/Set-Methoden. Attribute sind erforderlich
3. Für Attribute in persistenten Klassen sollten so oft wie möglich Wrapper-Typen verwendet werden
4. Die Persistenzklasse muss oid entsprechend der Primärschlüsselspalte in der Datenbank bereitstellen
5. Verwenden Sie nicht final, um die Klasse zu ändern
Primärschlüsseltyp
Natürlicher Primärschlüssel (selten)
Wenn es eine Geschäftsspalte in der Tabelle gibt, die die Spalte erfüllt, haben muss und nicht wiederholt werden darf kann als Primärschlüssel verwendet werden.
Ersatz-Primärschlüssel (gemeinsam)
Wenn es in der Tabelle keine Geschäftsspalte gibt, die die Merkmale erfüllt, haben muss und nicht wiederholt, erstellen Sie eine Spalte ohne geschäftliche Bedeutung als Primärschlüssel
Strategie zur Primärschlüsselgenerierung
Surrogate Primärschlüssel:
Identität: Primärschlüssel-Autoinkrement Der Primärschlüsselwert wird von der Datenbank verwaltet. Bei der Eingabe der
-Sequenz ist es nicht erforderlich, die Primärschlüsselgenerierungsstrategie in Oracle anzugeben .
Inkrementieren (Verständnis): Der Primärschlüssel wird von hibernate automatisch inkrementiert. Vor jeder Einfügung wird der maximale ID-Wert in der Tabelle als neuer Primärschlüsselwert verwendet gleichzeitig wird es Probleme mit der Abfrage geben) Wird während der Entwicklung nicht verwendet
native:hilo+sequence+identity Automatisch eine von drei Strategien auswählen
uuid: Generieren Sie eine zufällige Zeichenfolge als Primärschlüssel. Der Primärschlüsseltyp muss vom Typ
2. Objektstatus im Ruhezustand
Das Objekt ist in drei Zustände unterteilt
//测试对象的三种状态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 , 没有关联 } }
Übergangsdiagramm der drei Zustände
3. Ruhezustand erweitert – Cache der ersten Ebene
Caching: Verbesserung der Effizienz Der Cache der ersten Ebene im Ruhezustand soll auch die Effizienz des Betriebs der Datenbank verbessern 🎜>Mittel zur Effizienzsteigerung 1: Abfrageeffizienz verbessern
Mittel zur Effizienzsteigerung 2: unnötiges Senden reduzieren Änderungsanweisungen
Transaktionen im Ruhezustand
Wissenspunkt: So legen Sie den Isolationsgrad der Datenbank im Ruhezustand fest
<!-- 指定hibernate操作数据库时的隔离级别 #hibernate.connection.isolation 1|2|4|8 0001 1 读未提交 0010 2 读已提交 0100 4 可重复读 1000 8 串行化 --> <property name="hibernate.connection.isolation">4</property>
Öffnen Sie die Transaktion, bevor das Geschäft beginnt, und bestätigen Sie die Transaktion, nachdem das Geschäft abgeschlossen ist Während der Ausführung tritt eine Ausnahme auf.
Das Sitzungsobjekt ist erforderlich, um die Datenbank auf der Dao-Ebene zu steuern. Das Sitzungsobjekt wird ausgeführt. Wir müssen sicherstellen, dass die Dao-Schicht und die Service-Schicht dasselbe Sitzungsobjekt verwenden. Im Ruhezustand hat der Ruhezustand das Problem der Verwendung derselben Sitzung für uns gelöst. Unsere Entwickler müssen nur sf.getCurrentSession( aufrufen. )-Methode kann das an den aktuellen Thread gebundene Sitzungsobjekt abrufen Hinweis 1: Der Aufruf der getCurrentSession-Methode muss mit einem Konfigurationsabschnitt in der Hauptkonfiguration übereinstimmen<!-- 指定session与当前线程绑定 --> <property name="hibernate.current_session_context_class">thread</property>
Im CRM-Projekt:
Serviceschicht
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(); }
public void save(Customer c) {//1 获得sessionSession session = HibernateUtils.getCurrentSession();//3 执行保存 session.save(c); }
5. Batch-Abfrage im Ruhezustand (Übersicht)
HQL-Abfrage-Ruhezustand-Abfragesprache (Abfrage mit mehreren Tabellen, wird jedoch verwendet, wenn sie nicht kompliziert ist)
Hibernate exklusive Abfragesprache, eine objektorientierte Abfragesprache
//测试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 , 没有关联 } }
Kriterienabfrage (einzelne Tabelle). Bedingungsabfrage)
Hibernates eigene anweisungsfreie objektorientierte Abfrage
//测试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 , 没有关联 } }
Native SQL-Abfrage (komplex Geschäftsabfrage)
五、练习:客户列表
案例比较简单,可以按照上面笔记的知识点完成
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(); }
Das obige ist der detaillierte Inhalt vonJava – Entitätsregeln, Objektstatus, Cache, Transaktionen, Batch-Abfrage und Kundenlistenanzeige. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!