ホームページ >Java >&#&チュートリアル >Java -- エンティティ ルール、オブジェクト ステータス、キャッシュ、トランザクション、バッチ クエリ、顧客リスト表示
1. Hibernateでのエンティティルール
エンティティクラスの作成に関する注意事項
1. 永続クラスはパラメータなしの構築を提供します
2. メンバー変数はプライベートであり、パブリックなget/setメソッドへのアクセスを提供します 必須 属性を提供します
。3. 永続クラスの属性はパッケージ化タイプの使用を試みる必要があります
4. 永続クラスはデータベースの主キー列に対応する oid を提供する必要があります
5. クラスの変更にfinalを使用しないでください
。 key 型
自然主キー (まれ)
テーブル内に一致する、必須である、重複しないビジネス列がある場合、その列を主キーとして使用できます
代理主キー (共通)
テーブル内に、満たす、必須である、繰り返されないビジネス列がない場合、ビジネス上の重要性を持たない列が主キーとして作成されます
主キー生成戦略
代理主キー:
ID: 主キーの値はデータベースによって維持されます。
シーケンス: Oracle の主キー生成戦略。
インクリメント (理解): 主キーは、挿入ごとに、新しいメイン所有者のキー値として +1 されます。同時に、クエリに問題が発生します。
ネイティブ:hilo+sequence+identity
uuid: 主キーとしてランダムな文字列を生成します。
オブジェクトは 3 つの状態に分割されます
//测试对象的三种状态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 つの状態の遷移図
3. Hibernate Advanced - 1 次キャッシュ
キャッシュ: 改善休止状態での 1 次キャッシュはデータベースの操作効率を向上させるためでもあります 効率を向上させる方法 1: クエリの効率を向上させる
効率を向上させる手段 2: 不要な変更を削減します。ステートメント送信
4. 休止状態でのトランザクション
データベースが休止状態になっています
<!-- 指定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 層でデータベースを操作するには、セッション オブジェクトが必要です。サービス コントロール トランザクションもセッション オブジェクトを使用して完了します。dao 層とサービス層が同じセッション オブジェクトを使用するようにする必要がありますHibernate では、Hibernate が役に立ちます。同じセッションが使用されるようにするという問題を解決するには、sf.getCurrentSession() メソッドを呼び出して、現在のスレッドにバインドされたセッション オブジェクトを取得するだけです
注 1: getCurrentSession メソッドの呼び出しは、設定のセクションと一致する必要があります。メイン設定内<!-- 指定session与当前线程绑定 --> <property name="hibernate.current_session_context_class">thread</property>注 2: getCurrentSession メソッドを通じて取得されたセッション オブジェクトは、
crm プロジェクトを閉じるために手動で呼び出さないでください。サービス層 e
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
RroReeee
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 中国語 Web サイトの他の関連記事を参照してください。