찾다
데이터 베이스MySQL 튜토리얼通过数据库数据构建树结构(一)

通过数据库数据构建树结构(一)

Jun 07, 2016 pm 03:41 PM
소개하다어떻게우리를지도 시간데이터데이터 베이스구조통과하다

在本教程中,我们将向我们介绍如何通过数据库中的数据动态地构建树结构。我们将使用 NetBeans IDE 6.0 构建一个由两个页面组成的应用程序,其中第一页包含一个 JSF 1.2 ( Woodstock ) 树组件。接下来,我们将用数据库中的人物姓名填充树结构的一级节点,然

在本教程中,我们将向我们介绍如何通过数据库中的数据动态地构建树结构。我们将使用NetBeans IDE 6.0构建一个由两个页面组成的应用程序,其中第一页包含一个JSF 1.2Woodstock树组件。接下来,我们将用数据库中的人物姓名填充树结构的一级节点,然后用此人的行程信息来填充二级节点。TRIP节点将链接到第二个页面,其中显示该行程的详细信息。

目录

设计主页

连接数据库

通过数据库表构建树结构

添加详细信息页

添加代码

定义页面导航

更多功能:将Action方法与树节点绑定

关于树节点选择的注意事项



    本教程将涉及以下技术和资源

JavaServer Faces组件/
Java EE
平台

1.2 with Java EE 5*
1.1 with J2EE 1.4

Travel数据库

必需

    要利用NetBeans IDE 6.0Java EE 5的性能,我们需要一个与Java EE 5规范完全兼容的应用服务器,比如说Sun Java System Application Server 9GlassFish项目)。

    本教程适用于GlassFish V2应用服务器。如果我们使用的是其他服务器,请参阅发行说明 常见问题解答 了解各类问题和解决途径。有关所支持的服务器和Java EE平台的详细信息,请参阅发行说明

设计主页

    首先,我们将构建一个包含树组件和TRIP数据库表的主页。

 

  1. 创建一个新的Visual Web JSF应用程序项目,将其命名为DatabaseTree,然后启动Viual Web JSF框架。

  2. 从组件面板的Basic部分拖动一个树组件到页面上,键入“Travel信息”,然后按回车键。在“属性”窗口中,将id属性设置为displayTree,将clientSide属性设置为True

clientSide属性为True时,每个子节点(无论展开与否)都将发送给客户机,但它们只有在父节点展开时才可见。当clientSideFalse时,仅呈现那些展开的父节点的子节点。

  1. 选择Tree Node 1,单击鼠标右键,然后从弹出菜单中选择“删除”。

在本应用程序中,我们将通过编程填充树中的节点,因此不需要初始化由IDE创建的树节点。如果未移除该节点,则JSP标记属性中设置的值将优先于运行时设置,并且页面将显示节点。

  1. 从组件面板拖动一个“消息组”组件到页面的边缘位置,如页面的右上角。

连接数据库

    接下来,将该页与Travel数据源中的数据库表相连接,然后使用查询编辑器修改用于检索数据的SQL查询,使游客的姓名按字母顺序显示,旅行日期按时间顺序显示。

  1. 打开“服务”窗口,展开数据库节点,然后验证是否已连接到Travel数据库。

如果Travel数据库的jdbc节点标记显示为断开,并且无法展开该节点,则表明IDE未连接到该数据库。要连接Travel数据库,请右键单击Travel数据库的jdbc节点,然后从弹出菜单中选择“连接”。如果出现“连接”对话框,在输入travel作为口令,选中“在此期间记住密码”,然后单击“确定”按钮。

注:如果我们使用的是Apache Tomcat应用服务器,请将derbyClient.jar文件复制到/common/lib目录,然后再尝试连接到该数据库。

  1. 展开Travel数据库的jdbc节点,然后展开“表”节点

     

 

  1. 将“TRIP”节点拖放到可视编辑器中。

导航窗口净土在页面1部分显示“tripDataProvider”节点,在“SessionBean1”部分显示“tripRowSet”节点。

  1. 在导航窗口中,展开“SessionBean1”节点,右键单击“tripRowSet”节点,然后选择“编辑SQL语句”。

在编辑区域将显示带有TRIP表格图的查询编辑器。

  1. 从“服务”窗口拖出“行程 > > 人员”节点,并将其放置在查询编辑器中的“TRIP”表图的旁边,如图3所示。

此时将出现另一个表图,且两个表图之间有链接或连接。

  1. 在“PERSON”表中,取消选中PERSONID复选框。

  2. 在查询编辑器的“设计网格”中,找到“TRAVEL.PERSON”表中的“NAME”行。单击“排序类型”单元格,然后从下拉列表中选择“升序”。

此操作将使数据库表中的名字按姓氏的字母顺序排列。

  1. 找到TRAVEL.TRIP表中的DEPDATE行。单击“排序类型”单元格,然后从下拉列表中选择“升序”。

此操作将行程日期按照从早到晚的顺序排列。

 

通过数据库表构建树结构

    现在,我们已经在存储停息中添加了一个请求bean属性,可供应用程序的中两个页面使用。然后,我将在<span>prerender()</span>方法中添加代码,用于通过TRIPPERSON数据库表动态地构建树组件。

  1. 打开页面1,使导航窗口可见。在导航窗口中,右键单击RequestBean1节点,然后选择“编辑Java源代码”。

  2. 在“public class RequestBean1 extends AbstractRequestBean”构建函数中声明属性,如下所示:

<font><span>private Integer personId;</span><span><p></p></span></font>
  1. Java编辑器中单击鼠标右键,选择“重构 > 封装”字段。

  2. 在“封装字段”对话框中,选择创建gettersetter方法,如下图所示。确保变量声明中字段可见性为“私有”,存取器可见性是“公有”,然后单击“重构”按钮。

 

  1. Java编辑器中打开页面1然后找到<span><font>prerender</font></span>方法。用以下粗体显示的代码替换<span>prerender</span><span>方法的主体部分</span><span>:</span>

代码示例1:页面1<span>prerender</span>方法

<span><font><span>    </span>public void prerender() {<strong><p></p></strong></font></span>
<strong><span><font><span>        </span>// If the Request Bean's personId is set, then<p></p></font></span></strong>
<strong><span><font><span>        </span>// we just came back from the Trip page<p></p></font></span></strong>
<strong><span><font><span>        </span>// and had displayed a selected trip.<p></p></font></span></strong>
<strong><span><font><span>        </span>// We use the personId later to determine whether<p></p></font></span></strong>
<strong><span><font><span>        </span>// to expand a person's node<p></p></font></span></strong>
<strong><span><font><span>        </span>Integer expandedPersonId = getRequestBean1().getPersonId();<p></p></font></span></strong>
<strong><span><font><span>        </span>try {<p></p></font></span></strong>
<strong><span><font><span>            </span>// Set up the variables we will need<p></p></font></span></strong>
<strong><span><font><span>            </span>Integer currentPersonId = new Integer(-1);<p></p></font></span></strong>
<strong><span><font><span>         </span><span>   </span>// If nbrChildren is not 0 then this is a<p></p></font></span></strong>
<strong><span><font><span>            </span>// postback and we have our tree already<p></p></font></span></strong>
<strong><span><font><span>            </span>int nbrChildren = displayTree.getChildCount();<p></p></font></span></strong>
<strong><span><p><font> </font></p></span></strong>
<strong><span><font><span>            </span>if (nbrChildren == 0) {<p></p></font></span></strong>
<strong><span><font><span>                </span>// List of outer (person) nodes<p></p></font></span></strong>
<strong><span><font><span>              </span><span>  </span>List outerChildren = displayTree.getChildren();<p></p></font></span></strong>
<strong><span><font><span>                </span>// Erase previous contents<p></p></font></span></strong>
<strong><span><font><span>                </span>outerChildren.clear();<p></p></font></span></strong>
<strong><span><font><span>                </span>// List of inner (trip) nodes<p></p></font></span></strong>
<strong><span><font><span>                </span>List innerChildren = null;<p></p></font></span></strong>
<strong><span><font><span>                </span>// Execute the SQL query<p></p></font></span></strong>
<strong><span><font><span>                </span>tripDataProvider.refresh();<p></p></font></span></strong>
<strong><span><font><span>                </span>// Iterate over the rows of the result set.<p></p></font></span></strong>
<strong><span><font><span>                </span>// Every time we encounter a new person, add first level node.<p></p></font></span></strong>
<strong><span><font><span>                </span>// Add second level trip nodes to the parent person node.<p></p></font></span></strong>
<strong><span><font><span>                </span>boolean hasNext = tripDataProvider.cursorFirst();<p></p></font></span></strong>
<strong><span><font><span>                </span>while (hasNext) {<p></p></font></span></strong>
<strong><span><font><span>                    </span>Integer newPersonId =<p></p></font></span></strong>
<strong><span><font><span>                            </span>(Integer) tripDataProvider.getValue(<p></p></font></span></strong>
<strong><span><font><span>                            </span>"TRIP.PERSONID");<p></p></font></span></strong>
<strong><span><font><span>                    </span>if (!newPersonId.equals(currentPersonId)) {<p></p></font></span></strong>
<strong><span><font><span>                        </span>currentPersonId = newPersonId;<p></p></font></span></strong>
<strong><span><font><span>                        </span>TreeNode personNode = new TreeNode();<p></p></font></span></strong>
<strong><span><font><span>                        </span>personNode.setId("person" + newPersonId.toString());<p></p></font></span></strong>
<strong><span><font><span>                        </span>personNode.setText(<p></p></font></span></strong>
<strong><span><font><span>                                </span>(String)tripDataProvider.getValue(<p></p></font></span></strong>
<strong><span><font><span>                                </span>"PERSON.NAME"));<p></p></font></span></strong>
<strong><span><font><span>                        </span>// If the request bean passed a person id,<p></p></font></span></strong>
<strong><span><font><span>                       </span><span> </span>// expand that person's node<p></p></font></span></strong>
<strong><span><font><span>                        </span>personNode.setExpanded(newPersonId.equals<p></p></font></span></strong>
<strong><span><font><span>                                </span>(expandedPersonId));<p></p></font></span></strong>
<strong><span><font><span>                        </span>outerChildren.add(personNode);<p></p></font></span></strong>
<strong><span><font><span>                        </span>innerChildren = personNode.getChildren();<p></p></font></span></strong>
<strong><span><font><span>                    </span>}<p></p></font></span></strong>
<strong><span><p><font> </font></p></span></strong>
<strong><span><font><span>                    </span>// Create a new trip node<p></p></font></span></strong>
<strong><span><font><span>                    </span>TreeNode tripNode = new TreeNode();<p></p></font></span></strong>
<strong><span><font><span>                    </span>tripNode.setId("trip" +<p></p></font></span></strong>
<strong><span><font><span>                            </span>tripDataProvider.getValue("TRIP.TRIPID").toString());<p></p></font></span></strong>
<strong><span><font><span>                    </span>tripNode.setText(<p></p></font></span></strong>
<strong><span><font><span>                            </span>tripDataProvider.getValue("TRIP.DEPDATE").toString());<p></p></font></span></strong>
<strong><span><font><span>                    </span>tripNode.setUrl("/faces/Trip.jsp?tripId=" +<p></p></font></span></strong>
<strong><span><font><span>                            </span>tripDataProvider.getValue("TRIP.TRIPID").toString());<p></p></font></span></strong>
<strong><span><font><span>                    </span>innerChildren.add(tripNode);<p></p></font></span></strong>
<strong><span><font><span>                    </span>hasNext = tripDataProvider.cursorNext();<p></p></font></span></strong>
<strong><span><font><span>                </span>}<p></p></font></span></strong>
<strong><span><font><span>            </span>}<p></p></font></span></strong>
<strong><span><p><font> </font></p></span></strong>
<strong><span><font><span>        </span>} catch (Exception ex) {<p></p></font></span></strong>
<strong><span><font><span>            </span>log("Exception gathering tree data", ex);<p></p></font></span></strong>
<strong><span><font><span>      </span><span>      </span>error("Exception gathering tree data: " + ex);<p></p></font></span></strong>
<font><strong><span><span>        </span>} </span></strong><span><p></p></span></font>
<span><font><span>     </span>}<p></p></font></span>
<span><font><span>               </span><p></p></font></span>


   
此代码读取按照personId排序的行程记录。对于每个personId,此代码会在树结构中创建一个新的一级节点。然后,为每一个与该personId关联的行程创建一个二级节点(嵌套节点)。最后,将二级行程节点与<span>tripNode_action</span>方法(稍后在本部分中创建)绑定在一起。

  1. 在源代码中单击鼠标右键,然后从弹出菜单中选择Fix Imports修复“无法找到类”的错误。在Fix All Imports对话框中,请确保<span>java.util.List</span>出现在列出的字段中,然后单击确定”按钮。

  2. 运行项目。

 Web浏览器将打开并显示一个树组件,其中每个一级节点显示人名,如下图所示。展开节点可显示此人的旅行日期。请注意,人名按姓氏的字母顺序显示,日期按时间顺序显示。在下一节中,我们将添加一些代码,以便用户在单击Trip节点时导航至第二页。第二个页面将显示用户所选行程的详细信息。

 

添加详细信息页

    现在,我们需要为应用程序添加第二个页面,如下图所示。此页使用“属性表单”组件动态地显示用户在第一页上所选行程的详细信息。

 

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
MySQL의 라이센스는 다른 데이터베이스 시스템과 어떻게 비교됩니까?MySQL의 라이센스는 다른 데이터베이스 시스템과 어떻게 비교됩니까?Apr 25, 2025 am 12:26 AM

MySQL은 GPL 라이센스를 사용합니다. 1) GPL 라이센스는 MySQL의 무료 사용, 수정 및 분포를 허용하지만 수정 된 분포는 GPL을 준수해야합니다. 2) 상업용 라이센스는 공개 수정을 피할 수 있으며 기밀이 필요한 상업용 응용 프로그램에 적합합니다.

MyISAM을 통해 언제 innodb를 선택 하시겠습니까?MyISAM을 통해 언제 innodb를 선택 하시겠습니까?Apr 25, 2025 am 12:22 AM

MyISAM 대신 InnoDB를 선택할 때의 상황에는 다음이 포함됩니다. 1) 거래 지원, 2) 높은 동시성 환경, 3) 높은 데이터 일관성; 반대로, MyISAM을 선택할 때의 상황에는 다음이 포함됩니다. 1) 주로 읽기 작업, 2) 거래 지원이 필요하지 않습니다. InnoDB는 전자 상거래 플랫폼과 같은 높은 데이터 일관성 및 트랜잭션 처리가 필요한 응용 프로그램에 적합하지만 MyISAM은 블로그 시스템과 같은 읽기 집약적 및 트랜잭션이없는 애플리케이션에 적합합니다.

MySQL에서 외국 키의 목적을 설명하십시오.MySQL에서 외국 키의 목적을 설명하십시오.Apr 25, 2025 am 12:17 AM

MySQL에서 외국 키의 기능은 테이블 간의 관계를 설정하고 데이터의 일관성과 무결성을 보장하는 것입니다. 외국 키는 참조 무결성 검사 및 계단식 작업을 통해 데이터의 효과를 유지합니다. 성능 최적화에주의를 기울이고 사용할 때 일반적인 오류를 피하십시오.

MySQL의 다른 유형의 인덱스는 무엇입니까?MySQL의 다른 유형의 인덱스는 무엇입니까?Apr 25, 2025 am 12:12 AM

MySQL에는 B-Tree Index, Hash Index, Full-Text Index 및 공간 인덱스의 네 가지 주요 인덱스 유형이 있습니다. 1.B- 트리 색인은 범위 쿼리, 정렬 및 그룹화에 적합하며 직원 테이블의 이름 열에서 생성에 적합합니다. 2. HASH 인덱스는 동등한 쿼리에 적합하며 메모리 저장 엔진의 HASH_Table 테이블의 ID 열에서 생성에 적합합니다. 3. 전체 텍스트 색인은 기사 테이블의 내용 열에서 생성에 적합한 텍스트 검색에 사용됩니다. 4. 공간 지수는 지리 공간 쿼리에 사용되며 위치 테이블의 Geom 열에서 생성에 적합합니다.

MySQL에서 인덱스를 어떻게 생성합니까?MySQL에서 인덱스를 어떻게 생성합니까?Apr 25, 2025 am 12:06 AM

toreateanindexinmysql, usethecreateindexstatement.1) forasinglecolumn, "createindexidx_lastnameonemployees (lastname);"2) foracompositeIndex를 사용하고 "createDexIdx_nameonemployees (forstName, FirstName);"3)을 사용하십시오

MySQL은 sqlite와 어떻게 다릅니 까?MySQL은 sqlite와 어떻게 다릅니 까?Apr 24, 2025 am 12:12 AM

MySQL과 Sqlite의 주요 차이점은 설계 개념 및 사용 시나리오입니다. 1. MySQL은 대규모 응용 프로그램 및 엔터프라이즈 수준의 솔루션에 적합하며 고성능 및 동시성을 지원합니다. 2. SQLITE는 모바일 애플리케이션 및 데스크탑 소프트웨어에 적합하며 가볍고 내부질이 쉽습니다.

MySQL의 색인이란 무엇이며 성능을 어떻게 향상 시키는가?MySQL의 색인이란 무엇이며 성능을 어떻게 향상 시키는가?Apr 24, 2025 am 12:09 AM

MySQL의 인덱스는 데이터 검색 속도를 높이는 데 사용되는 데이터베이스 테이블에서 하나 이상의 열의 주문 구조입니다. 1) 인덱스는 스캔 한 데이터의 양을 줄임으로써 쿼리 속도를 향상시킵니다. 2) B-Tree Index는 균형 잡힌 트리 구조를 사용하여 범위 쿼리 및 정렬에 적합합니다. 3) CreateIndex 문을 사용하여 CreateIndexIdx_customer_idonorders (customer_id)와 같은 인덱스를 작성하십시오. 4) Composite Indexes는 CreateIndexIdx_customer_orderOders (Customer_id, Order_Date)와 같은 다중 열 쿼리를 최적화 할 수 있습니다. 5) 설명을 사용하여 쿼리 계획을 분석하고 피하십시오

MySQL에서 트랜잭션을 사용하여 데이터 일관성을 보장하는 방법을 설명하십시오.MySQL에서 트랜잭션을 사용하여 데이터 일관성을 보장하는 방법을 설명하십시오.Apr 24, 2025 am 12:09 AM

MySQL에서 트랜잭션을 사용하면 데이터 일관성이 보장됩니다. 1) STARTTRANSACTION을 통해 트랜잭션을 시작한 다음 SQL 작업을 실행하고 커밋 또는 롤백으로 제출하십시오. 2) SavePoint를 사용하여 부분 롤백을 허용하는 저장 지점을 설정하십시오. 3) 성능 최적화 제안에는 트랜잭션 시간 단축, 대규모 쿼리 방지 및 격리 수준을 합리적으로 사용하는 것이 포함됩니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기