1. Règles d'entité en veille prolongée
Notes sur la création de classe d'entité
1. Persistance La classe fournit construction sans paramètre
2. Les variables membres sont privées et fournissent un accès public à la méthode get/set. Les attributs sont requis
3. Pour les attributs des classes persistantes, les types wrapper doivent être utilisés autant que possible. 🎜 >
4. La classe de persistance doit fournir un oid correspondant à la colonne de clé primaire dans la base de données 5. Ne pas utiliser final pour modifier la classeType de clé primaire Clé primaire naturelle (rare)
Lorsqu'il y a une colonne métier dans le tableau qui se rencontre, doit avoir et n'est pas répétée, la colonne peut être utilisée comme clé primaire.
Clé primaire de substitution (commune)
Lorsqu'il n'y a pas de colonne commerciale dans le tableau qui répond, doit avoir et ne répète pas les caractéristiques, créez une colonne sans signification commerciale comme clé primaire
Stratégie de génération de clé primaireSubstitut clé primaire :
identité : incrémentation automatique de la clé primaire La valeur de la clé primaire est conservée par la base de données. Il n'est pas nécessaire de spécifier la clé primaire lors de la saisie
séquence : la stratégie de génération de clé primaire dans Oracle. . incrément (compréhension) : la clé primaire est auto-incrémentée par hibernate. Avant chaque insertion, interrogez d'abord la valeur d'identifiant maximale dans le tableau +1 est utilisée comme nouvelle valeur de clé primaire. simultané en même temps, il y aura des problèmes avec la requête) Non utilisé pendant le développement.
native:hilo+sequence+identity Choisissez automatiquement l'une des trois stratégies
uuid : Générez une chaîne aléatoire comme clé primaire. Le type de clé primaire doit être de type chaîne.
Clé primaire naturelle :
L'objet est divisé en trois états
//测试对象的三种状态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. Hibernate Advanced - Cache de premier niveau
Mise en cache : Améliorer l'efficacité du cache de premier niveau en veille prolongée permet également d'améliorer l'efficacité du fonctionnement de la base de données <.>
Moyens pour améliorer l'efficacité 1 : Améliorer l'efficacité des requêtes
Moyens pour améliorer l'efficacité 2 : Réduire les envois inutiles déclarations de modification
4. Transactions en veille prolongée
Point de connaissance : Comment spécifier le niveau d'isolement de la base de données en veille prolongée
<!-- 指定hibernate操作数据库时的隔离级别 #hibernate.connection.isolation 1|2|4|8 0001 1 读未提交 0010 2 读已提交 0100 4 可重复读 1000 8 串行化 --> <property name="hibernate.connection.isolation">4</property>
Ouvrez la transaction avant le démarrage de l'entreprise et validez la transaction une fois l'entreprise terminée exécuté. Une exception se produit lors de l'exécution. Annuler la transaction L'objet de session est requis pour faire fonctionner la base de données au niveau de la couche dao. Il est également utilisé pour contrôler les transactions dans le service. Nous devons nous assurer que la couche dao et la couche de service utilisent le même objet de session
En veille prolongée, hibernate a résolu le problème de garantir que la même session est utilisée. Nos développeurs n'ont qu'à appeler The sf.getCurrentSession(. ) peut obtenir l'objet de session lié au thread actuel
Remarque 1 : L'appel de la méthode getCurrentSession doit correspondre à une section de configuration dans la configuration principale
Remarque 2 : L'objet de session obtenu via la méthode getCurrentSession. Lorsque la transaction est soumise, la session sera automatiquement fermée. N'appelez pas close manuellement<!-- 指定session与当前线程绑定 --> <property name="hibernate.current_session_context_class">thread</property>
Couche de service
Couche Daopublic 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. Requête par lots en veille prolongée (présentation)
HQL query-hibernate Query Language (requête multi-tables, mais utilisée quand ce n'est pas compliqué)
Langage de requête exclusif Hibernate, qui est un langage de requête orienté objet
//测试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 , 没有关联 } }
Requête orientée objet sans instruction d'Hibernate
//测试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(); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!