SSM调用oracle存储过程实现权限菜单

本文介绍了如何在SSM(Spring、SpringMVC、MyBatis)框架下,通过调用Oracle数据库的存储过程来实现权限菜单的功能。首先展示了获取主菜单和子菜单的存储过程定义,接着在Mapper.xml中配置了调用存储过程的SQL语句,使用了 OUT 参数接收返回的游标数据。Mapper.java中定义了对应的接口方法,Service.java实现了业务逻辑,包括获取主菜单和根据父菜单ID获取子菜单的方法,最后处理成JSON格式返回。
摘要由CSDN通过智能技术生成

Oracle数据库存储过程

/*获取主菜单存储过程定义*/       

create or replace procedure getMainMenu(

       userAccount t_user.user_account%TYPE,

       userPassword t_user.user_password%TYPE,

       right_cursor out sys_refcursor

)

is

begin

  open right_cursor for select * from t_right where right_id in (select right_id from t_role_right where 

       role_id in (select role_id from t_user_role where user_id in 

       (select user_Id from t_user where user_account=userAccount and user_password=userPassword))) and parent_id = 'root';

  end;

 

/*获取子菜单存储过程定义*/    

create or replace procedure getChildMenuByParentId(

       userAccount t_user.user_account%TYPE,

       userPassword t_user.user_password%TYPE,

       parentId t_right.parent_id%TYPE,

       right_cursor out sys_refcursor

)

is

begin

  open right_cursor for select * from t_right where right_id in (select right_id from t_role_right where 

       role_id in (select role_id from t_user_role where user_id in 

       (select user_Id from t_user where user_account=userAccount and user_password=userPassword))) and parent_id = parentId;

  end;

  

Mapper.xml

<!--  获取主菜单 方法 parameterType 传入参数类型 statementType="CALLABLE" 固定写法注明调用oracle 存储过程 

Call getMainMenu 返回游标名

#{user.userAccount},

#{user.userPassword}为传入实际参数

#{map.right_cursor}为接收oracle游标返回的数据

jdbcType=CURSOR,mode=OUT,javaType=java.sql.ResultSet, 固定写法

resultMap=com.ssyt.lms.mapper.RightInfoMapper.BaseResultMap 返回值类型必须全路径

BaseResultMap  mapper.xml中的 -->

 

<resultMap id="BaseResultMap" type="com.ssyt.lms.po.RightInfo" >

    <id column="RIGHT_ID" property="rightId" jdbcType="VARCHAR" />

    <result column="PARENT_ID" property="parentId" jdbcType="VARCHAR" />

    <result column="RIGHT_NAME" property="rightName" jdbcType="VARCHAR" />

    <result column="RIGHT_URL" property="rightUrl" jdbcType="VARCHAR" />

  </resultMap>

 

<select id="getMainMenus" parameterType="map" statementType="CALLABLE">

   {call getMainMenu(

   #{user.userAccount},

   #{user.userPassword},

   #{map.right_cursor,jdbcType=CURSOR,mode=OUT,javaType=java.sql.ResultSet, resultMap=com.ssyt.lms.mapper.RightInfoMapper.BaseResultMap})}

  </select>

  

  <select id="getChildMenusByParentId" parameterType="map" statementType="CALLABLE">

   {call getChildMenuByParentId(

   #{user.userAccount},

   #{user.userPassword},

   #{parentId},

   #{map.right_cursor,jdbcType=CURSOR,mode=OUT,javaType=java.sql.ResultSet, resultMap=com.ssyt.lms.mapper.RightInfoMapper.BaseResultMap})}

  </select>

 

Mapper.java

<!-- @Param("user") 将后面的userInfo 对象转化为 map< ‘user’,userInfo> 

为了方便xml里面取到具体的值

 -->

 List<RightInfo> getMainMenus(@Param("user") UserInfo userInfo,@Param("map") Map<String,Object> map);

List<RightInfo> getChildMenusByParentId(@Param("user") UserInfo userInfo,@Param("map") Map<String,Object> map,@Param("parentId") String parentId);

 

Service.java

<接口方法>

/// 定义获取用户的主菜单

List<RightInfo> getMainMenus(UserInfo user);

/// 定义菜单返回的json字符串的业务方法

String getMenuJson(UserInfo user);

<实现类方法>

<主菜单>

@Override

public List<RightInfo> getMainMenus(UserInfo user) {

Map<String, Object> map = new HashMap<String, Object>();

map.put(CommonConstant.GET_MAIN_MENU_CURSOR.getKey(),new ArrayList<RightInfo>());

rightMapper.getMainMenus(user, map );

return (List<RightInfo>) map.get(CommonConstant.GET_MAIN_MENU_CURSOR.getKey());

}

<子菜单  需要模型 例如(mainmenusid: ; menu list<childmenu> ))

                        Childmenu( text, items : list< item>)

                        Item( id: ; text: ; href)>



/**
* 查询用户子菜单(处理菜单模型)
*/
public String listChildMenu(UserInfo user, String baseUrl) {
// 定义存储主菜单集合对象
List<MainMenu> mainList = new ArrayList<MainMenu>();
// 获取获取当前用户的主菜单
List<RightInfo> rightList = listMenu(user);


if (rightList != null && rightList.size() > 0) {
// 循环遍历取出当前用户所持有的菜单项
for (RightInfo right : rightList) {
// 获取某一个菜单项的id和名字
String rightId = right.getRightId();
String rightName = right.getRightName();
// 创建一个主菜单MainMenu对象
MainMenu mainMenu = new MainMenu();
mainMenu.setId(rightId);
// 定义存储子菜单的集合
List<ChildMenu> childList = new ArrayList<ChildMenu>();
mainMenu.setMenu(childList);
// 新建map集合接收oracle存储过程返回值
Map<String, Object> map = new HashMap<String, Object>();
map.put(CommonConstant.GET_MAIN_MENU_CURSOR.getKey(),
new ArrayList<RightInfo>());
rightInfoMapper.selectChildMenu(user, map, rightId);
// 获取到存储过程返回值(菜单项所属的子菜单)
@SuppressWarnings("unchecked")
List<RightInfo> childRightList = (List<RightInfo>) map
.get(CommonConstant.GET_MAIN_MENU_CURSOR.getKey());
if (childRightList != null && childRightList.size() > 0) {
// 创建ChildMenu对象
ChildMenu childMenu = new ChildMenu();
// 子菜单所属菜单项也就是菜单项的名字
childMenu.setText(rightName);
// 创建存储子菜单项集合
List<Item> itemList = new ArrayList<Item>();
childMenu.setItems(itemList);
// 存储到childList对象中
childList.add(childMenu);
for (RightInfo child : childRightList) {
String childId = child.getRightId();
String childName = child.getRightName();
String childHref = child.getRightUrl();


// 创建一个Item对象(单个子菜单“权限”)
Item item = new Item();
item.setHref(baseUrl + "/" + childHref);
item.setId(childId);
item.setText(childName);
// 添加子菜单集合中
itemList.add(item);


}
}
// 将单个主菜单项放入菜单项集合中去
mainList.add(mainMenu);
}


}
// 将该集合转换为json对象的字符串
return JSON.toJSONString(mainList);
}

 



/**
* 查询用户子菜单(处理菜单模型)
*/
public String listChildMenu(UserInfo user, String baseUrl) {
// 定义存储主菜单集合对象
List<MainMenu> mainList = new ArrayList<MainMenu>();
// 获取获取当前用户的主菜单
List<RightInfo> rightList = listMenu(user);


if (rightList != null && rightList.size() > 0) {
// 循环遍历取出当前用户所持有的菜单项
for (RightInfo right : rightList) {
// 获取某一个菜单项的id和名字
String rightId = right.getRightId();
String rightName = right.getRightName();
// 创建一个主菜单MainMenu对象
MainMenu mainMenu = new MainMenu();
mainMenu.setId(rightId);
// 定义存储子菜单的集合
List<ChildMenu> childList = new ArrayList<ChildMenu>();
mainMenu.setMenu(childList);
// 新建map集合接收oracle存储过程返回值
Map<String, Object> map = new HashMap<String, Object>();
map.put(CommonConstant.GET_MAIN_MENU_CURSOR.getKey(),
new ArrayList<RightInfo>());
rightInfoMapper.selectChildMenu(user, map, rightId);
// 获取到存储过程返回值(菜单项所属的子菜单)
@SuppressWarnings("unchecked")
List<RightInfo> childRightList = (List<RightInfo>) map
.get(CommonConstant.GET_MAIN_MENU_CURSOR.getKey());
if (childRightList != null && childRightList.size() > 0) {
// 创建ChildMenu对象
ChildMenu childMenu = new ChildMenu();
// 子菜单所属菜单项也就是菜单项的名字
childMenu.setText(rightName);
// 创建存储子菜单项集合
List<Item> itemList = new ArrayList<Item>();
childMenu.setItems(itemList);
// 存储到childList对象中
childList.add(childMenu);
for (RightInfo child : childRightList) {
String childId = child.getRightId();
String childName = child.getRightName();
String childHref = child.getRightUrl();


// 创建一个Item对象(单个子菜单“权限”)
Item item = new Item();
item.setHref(baseUrl + "/" + childHref);
item.setId(childId);
item.setText(childName);
// 添加子菜单集合中
itemList.add(item);


}
}
// 将单个主菜单项放入菜单项集合中去
mainList.add(mainMenu);
}


}
// 将该集合转换为json对象的字符串
return JSON.toJSONString(mainList);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值