最近需要写一个java界面,其中这个里面包含了一个树状的层级界面,在网上查找了好多了资料,但是限于自身能力,最终还是找到了解决办法,如果对你有帮助那是再好不过了
数据库是SQL Server 2008R2
程序连接数据库前,需要导入包,mssql-jdbc-7.0.0.jre10.jar
其它的,基本上就是在程序里面定义了
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class TT2_backup extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private static Connection con;
private static Statement stmt = null;
DefaultMutableTreeNode Top = new DefaultMutableTreeNode("root");
ResultSet rs;
// 连接数据库,这个地方是静态加载,如果日后想换,可以更改
static {
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String connection = "jdbc:sqlserver://localhost:1433;DatabaseName=test";
// 数据库用户名
String user = "sa";
// 数据库密码
String password = "123";
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
con = DriverManager.getConnection(connection, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
try {
stmt = con.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
TT2_backup() throws SQLException {
DefaultMutableTreeNode Top = new DefaultMutableTreeNode("root");
ArrayList<Integer> list = BFS(Top, 0);
JTree tree = new JTree(Top);
add(tree);
System.out.print(list);
setLocation(100, 100);
setSize(300, 400);
setVisible(true);
}
/**
* 使用广度优先搜索遍历的方式,从数据库里面挑选数据,建立sql语句
* 原先使用DFS,只有单层的,一旦出现多层,其返回就会出现找不到数据的情况
* 也不知道怎么搞
* @param top
* @param index
* @return
* @throws SQLException
*/
public static ArrayList<Integer> BFS(DefaultMutableTreeNode top, int index) throws SQLException {
//queue存放id数列的队列
Queue<Integer> queue = new LinkedList<Integer>();
//存放节点
Queue<DefaultMutableTreeNode> queue2 = new LinkedList<DefaultMutableTreeNode>();
//list是为了测试,节点id的是那些
ArrayList<Integer> list = new ArrayList<Integer>();
if (top == null) {
return list;
}
list.add(index); //0
queue.add(index); //0
queue2.add(top); //root节点
String strsql = null;
while (!queue.isEmpty() && !queue2.isEmpty()) {
int id = queue.poll();
//弹出队列中的第一个节点,此即为父节点
DefaultMutableTreeNode node_parent = queue2.poll();
//创建sql语句
strsql = "select ID,NAME,ParentID from t_owner where ParentID ='" + id + "'";
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
con.prepareStatement(strsql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(strsql);
while (rs.next()) {
int id2 = Integer.parseInt(rs.getString("ID"));
list.add(id2);
queue.add(id2);
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode(rs.getString("Name"));
queue2.add(node2);
node_parent.add(node2);
}
}
return list;
}
// 主函数
public static void main(String[] argv) throws Exception {
new TT2_backup();
}
public void createNodes(DefaultMutableTreeNode parent, int ParentID) throws SQLException {
DefaultMutableTreeNode temp = null;
String strsql = "select ID,NAME,ParentID from t_owner where ParentID ='" + ParentID + "'";
// 光标的相对位置
int i = 0;
try {
// 创建的结果集,实现任意的前后滚动,对修改敏感, 设置为只读
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
con.prepareStatement(strsql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(strsql);
// 想要获取其结果集有几条
// System.out.println(rs.getMetaData().getColumnCount());
while (rs.next()) {
i++;
// System.out.println(i);
temp = new DefaultMutableTreeNode(rs.getString("Name"));
// System.out.println(temp);
parent.add(temp);
System.out.println(rs.getString("Name") + " " + rs.getString("ID"));
// 创建一个新的节点,递归
createNodes(temp, Integer.parseInt(rs.getString("ID")));
rs.relative(i);
rs = stmt.executeQuery(strsql);
rs.next();
}
} catch (Exception e) {
System.out.println(e);
}
}
public void querysql(ResultSet rs, int i, DefaultMutableTreeNode parent, DefaultMutableTreeNode temp, String strsql)
throws SQLException {
// DefaultMutableTreeNode temp1 = null;
rs.next();
while (rs.next()) {
i++;
temp = new DefaultMutableTreeNode(rs.getString("Name"));
parent.add(temp);
// 创建一个新的节点,递归
// createNodes(temp, rs.getString("ID"));
rs = stmt.executeQuery(strsql);
rs.next();
}
}
}
代码重要的地方写了注释,基本上也没有什么特殊的地方,欢迎讨论
下面是数据库的截图
数据库设计