多对多【Java实现多表操作笔记四】

多对多

原则:一方存多方的集合,多方存一方的对象

但现在双方都是多方数据,此时原则为:多方存另一方的集合

多对多的关系需要创建第三张表来实现,但中间表没有实体类

 

实例:菜单表和角色表模拟实现多对多关系:一个菜单项对应多个角色项,一个角色项对应多个菜单项

 

实现过程:

1、javabean

数据库中使用外键列保证两表关系,实体类中使用属性保证两表关系

[src.bean.Menu.java]
public class Menu {
    private int menuId;
    private String menuName;

    //多方存另一方的集合
    private List<Role> roleList;
    public List<Role> getRoleList() {return roleList;}
    public void setRoleList(List<Role> roleList) {this.roleList = roleList;}

    public int getMenuId() {return menuId;}
    public void setMenuId(int menuId) {this.menuId = menuId;}
    public String getMenuName() {return menuName;}
    public void setMenuName(String menuName) {this.menuName = menuName;}
}
[src.bean.Role.java]
public class Role {
    private int roleId;
    private String roleName;

    //多方存另一方的集合
    private List<Menu> menuList;
    public List<Menu> getMenuList() {return menuList;}
    public void setMenuList(List<Menu> menuList) {this.menuList = menuList;}

    public int getRoleId() {return roleId;}
    public void setRoleId(int roleId) {this.roleId = roleId;}
    public String getRoleName() {return roleName;}
    public void setRoleName(String roleName) {this.roleName = roleName;}
}
 

2、dao  实现对应数据关系

/*接口:[src.dao.RoleDao.java(interface)]*/
public interface RoleDao {
    //查询某个菜单信息(包含角色)
    public Menu findByMenuId(int mid);
    //查询某个角色信息(要求包含菜单)
    public Role findByRoleId(int roleid);
}

/*实现接口:[src.dao.impl.RoleDaoImpl.java]*/
@Override
public Menu findByMenuId(int mid) {
    Menu menu = new Menu();
    ArrayList<Role> roles = new ArrayList<>();
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        connection = getConnection();
        preparedStatement = connection.prepareStatement("select * from menu m ,role r, middle where m.menuid=middle.mid and r.roleid=middle.rid and m.menuid=?");
        preparedStatement.setInt(1,mid);
        resultSet = preparedStatement.executeQuery();
        while(resultSet.next()){
            //1.先各自存数据
            menu.setMenuName(resultSet.getString("menuname"));
            Role role = new Role();
            role.setRoleName(resultSet.getString("rolename"));
            //2.建立二者关系
            roles.add(role);
        }
        menu.setRoleList(roles);
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        close(connection,preparedStatement,resultSet);
    }
    return menu;
}
@Override
public Role findByRoleId(int roleid) {
    Role role = new Role();
    ArrayList<Menu> menuArrayList = new ArrayList<Menu>();
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        connection = getConnection();
        preparedStatement = connection.prepareStatement("select * from menu m ,role r, middle where m.menuid=middle.mid and r.roleid=middle.rid and r.roleid=?");
        preparedStatement.setInt(1,roleid);
        resultSet = preparedStatement.executeQuery();
        while(resultSet.next()){
            //1.先各自存数据
            Menu menu = new Menu();
            menu.setMenuName(resultSet.getString("menuname"));
            role.setRoleName(resultSet.getString("rolename"));
            //2.建立二者关系
            menuArrayList.add(menu);
        }
        role.setMenuList(menuArrayList);
    } catch (SQLException throwables) {
         throwables.printStackTrace();
    } finally {
         close(connection,preparedStatement,resultSet);
    }
    return role;
}

 

3、Demo4.java  测试关系

public class Demo4 {
    public static void main(String[] args) {
        RoleDaoImpl roleDao = new RoleDaoImpl();
        /*Menu menu = roleDao.findByMenuId(2);
        System.out.println(menu.getMenuName());
        List<Role> roleList = menu.getRoleList();
        for (Role role : roleList) {
            System.out.println(role.getRoleName());
        }*/
        Role role = roleDao.findByRoleId(2);
        System.out.println(role.getRoleName());
        List<Menu> menuList = role.getMenuList();
        for (Menu menu : menuList) {
            System.out.println(menu.getMenuName());
        }
    }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值