java二级菜单表结构
时间: 2023-11-18 11:54:14 浏览: 38
Java二级菜单表结构可以采用一张表的方式来实现。一般来说,我们可以在菜单表中添加一个字段来表示父级菜单的ID,这样就可以通过查询和组装数据的方式来实现二级菜单的联动效果。具体的表结构可以参考以下示例:
CREATE TABLE `menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '菜单名称',
`parent_id` int(11) DEFAULT NULL COMMENT '父级菜单ID',
`url` varchar(100) DEFAULT NULL COMMENT '菜单链接',
`icon` varchar(50) DEFAULT NULL COMMENT '菜单图标',
`order_num` int(11) DEFAULT NULL COMMENT '菜单排序',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单表';
其中,parent_id字段表示父级菜单的ID,如果该菜单是一级菜单,则parent_id为null。通过查询和组装数据,我们可以实现二级菜单的联动效果。
相关问题
java + mybatis 查询二级菜单
假设你有以下的菜单表(menu):
| id | name | parent_id |
|----|------|-----------|
| 1 | 菜单1 | null |
| 2 | 菜单2 | null |
| 3 | 菜单1-1 | 1 |
| 4 | 菜单1-2 | 1 |
| 5 | 菜单2-1 | 2 |
其中,parent_id 表示该菜单的父级菜单的 id,如果该菜单没有父级菜单,则 parent_id 为 null。
下面是查询二级菜单的 SQL:
```sql
SELECT m1.id, m1.name, m2.id AS sub_id, m2.name AS sub_name
FROM menu m1
LEFT JOIN menu m2 ON m1.id = m2.parent_id
WHERE m1.parent_id IS NULL AND m2.parent_id IS NOT NULL;
```
这里使用了自连接和左连接,将菜单表与自身连接,并筛选出 parent_id 为 null 的一级菜单,和 parent_id 不为 null 的二级菜单。同时,使用别名给一级菜单和二级菜单取名,方便后续处理。
在 Java 中,使用 MyBatis 可以将上面的 SQL 封装成一个 mapper 接口的方法,如下:
```java
public interface MenuMapper {
List<Map<String, Object>> selectSubMenus();
}
```
这里返回的是一个 List<Map<String, Object>>,其中每个 Map 对应一条记录,包含 id、name、sub_id 和 sub_name 四个字段,表示父级菜单和对应的二级菜单。具体的 mapper.xml 可以参考下面的代码:
```xml
<!-- MenuMapper.xml -->
<mapper namespace="com.example.MenuMapper">
<select id="selectSubMenus" resultType="java.util.Map">
SELECT m1.id, m1.name, m2.id AS sub_id, m2.name AS sub_name
FROM menu m1
LEFT JOIN menu m2 ON m1.id = m2.parent_id
WHERE m1.parent_id IS NULL AND m2.parent_id IS NOT NULL;
</select>
</mapper>
```
java导出excel二级表头
Java导出Excel二级表头可以使用Apache POI库来实现。以下是一个简单的示例代码:
```java
// 创建工作簿对象
Workbook workbook = new XSSFWorkbook();
// 创建工作表对象
Sheet sheet = workbook.createSheet("Sheet1");
// 创建第一行,作为一级表头
Row row1 = sheet.createRow(0);
// 创建第一个单元格,作为一级表头第一列
Cell cell11 = row1.createCell(0);
cell11.setCellValue("一级表头1");
// 合并一级表头第一列到第三列
CellRangeAddress region1 = new CellRangeAddress(0, 0, 0, 2);
sheet.addMergedRegion(region1);
// 创建第二个单元格,作为一级表头第四列
Cell cell12 = row1.createCell(3);
cell12.setCellValue("一级表头2");
// 合并一级表头第四列到第六列
CellRangeAddress region2 = new CellRangeAddress(0, 0, 3, 5);
sheet.addMergedRegion(region2);
// 创建第三个单元格,作为一级表头第七列
Cell cell13 = row1.createCell(6);
cell13.setCellValue("一级表头3");
// 合并一级表头第七列到第九列
CellRangeAddress region3 = new CellRangeAddress(0, 0, 6, 8);
sheet.addMergedRegion(region3);
// 创建第二行,作为二级表头
Row row2 = sheet.createRow(1);
// 创建二级表头的单元格,根据一级表头的列数来创建
for (int i = 0; i < 9; i++) {
Cell cell = row2.createCell(i);
cell.setCellValue("二级表头" + (i+1));
}
// 创建数据行
for (int i = 2; i < 10; i++) {
Row row = sheet.createRow(i);
// 创建数据单元格,根据一级表头的列数来创建
for (int j = 0; j < 9; j++) {
Cell cell = row.createCell(j);
cell.setCellValue("数据" + (i-1) + "-" + (j+1));
}
}
// 导出Excel文件
try (FileOutputStream outputStream = new FileOutputStream("example.xlsx")) {
workbook.write(outputStream);
}
```
在上面的示例代码中,我们首先创建了一个工作簿对象和一个工作表对象。然后,我们创建了第一行作为一级表头,并使用`CellRangeAddress`类来合并单元格。接着,我们创建了第二行作为二级表头,并创建了数据行。最后,我们将工作簿对象导出为Excel文件。
请注意,上面的示例代码使用了XSSFWorkbook类来创建工作簿对象,这是POI库中用于创建Excel 2007及以上版本文件的类。如果你要创建Excel 2003版本文件,可以使用HSSFWorkbook类。