返回顶部
首页 > 资讯 > 精选 >java Shiro相关知识点有哪些
  • 885
分享到

java Shiro相关知识点有哪些

2023-07-06 00:07:04 885人浏览 泡泡鱼
摘要

这篇文章主要介绍了java shiro相关知识点有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java Shiro相关知识点有哪些文章都会有所收获,下面我们一起来看看吧。1.权限的管理1.1 什么是权限管

这篇文章主要介绍了java shiro相关知识点有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java Shiro相关知识点有哪些文章都会有所收获,下面我们一起来看看吧。

1.权限的管理

1.1 什么是权限管理

基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。

权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。

1.2 什么是身份认证

身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡。

1.3 什么是授权

授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的

2.什么是shiro

Apache Shiro™ is a powerful and easy-to-use Java security framework that perfORMs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand api, you can quickly and easily secure any application – from the smallest mobile applications to the largest WEB and enterprise applications.

Shiro 是一个功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序—从最小的移动应用程序到最大的web和企业应用程序。

 Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。

3.shiro的核心架构

java Shiro相关知识点有哪些

3.1 Subject

Subject即主体,外部应用与subject进行交互,subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。 Subject在shiro中是一个接口,接口中定义了很多认证授权相关的方法,外部程序通过subject进行认证授权,而subject是通过SecurityManager安全管理器进行认证授权

3.2 SecurityManager

SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。

SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口。

3.3 Authenticator

Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。

3.4 Authorizer

Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

3.5 Realm

Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

  • 注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

3.6 SessionManager

sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

3.7 SessionDAO

SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。

3.8 CacheManager

CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

3.9 Cryptography

Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

4. shiro中的认证

4.1 认证

身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。

4.2 shiro中认证的关键对象

  • Subject:主体

访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;

  • Principal:身份信息

是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)。

  • credential:凭证信息

是只有主体自己知道的安全信息,如密码、证书等。

4.3 认证流程

java Shiro相关知识点有哪些

4.4 认证的开发

1. 创建项目并引入依赖
<dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-core</artifactId>  <version>1.5.3</version></dependency>
2. 引入shiro配置文件并加入如下配置
[users]mosin=1234tom=1234
3.开发认证代码
public class ShiroTest {    public static void main(String[] args) {        //创建默认的安全管理器        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();        //创建安全管理器需要的realm对象        IniRealm iniRealm = new IniRealm("classpath:realm.ini");        //安全管理器设置realm对象        defaultSecurityManager.setRealm(iniRealm);        //将安全管理器注入安全工具类   用于获取认证的主体        SecurityUtils.setSecurityManager(defaultSecurityManager);        //获取认证的主体        Subject subject = SecurityUtils.getSubject();        //创建令牌        UsernamePassWordToken usernamePasswordToken = new UsernamePasswordToken("mosin", "1234");        try {            //认证 通过没有任何的异常            subject.login(usernamePasswordToken);            //验证是否通过            boolean authenticated = subject.isAuthenticated();            System.out.println("认证通过:"+authenticated);        } catch (UnknownAccountException e) {            e.printStackTrace();            System.out.println("用户名错误!");        }catch (IncorrectCredentialsException e){            e.printStackTrace();            System.out.println("密码错误!");        }    }}
  • DisabledAccountException(帐号被禁用)

  • LockedAccountException(帐号被定)

  • ExcessiveAttemptsException(登录失败次数过多)

  • ExpiredCredentialsException(凭证过期)等

4.5 自定义Realm

上边的程序使用的是Shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm。

1.shiro提供的Realm

java Shiro相关知识点有哪些

2.根据认证源码认证使用的是SimpleAccountRealm

java Shiro相关知识点有哪些

SimpleAccountRealm的部分源码中有两个方法一个是 认证 一个是 授权,

public class SimpleAccountRealm extends AuthorizingRealm {    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {        UsernamePasswordToken upToken = (UsernamePasswordToken) token;        SimpleAccount account = getUser(upToken.getUsername());        if (account != null) {            if (account.isLocked()) {                throw new LockedAccountException("Account [" + account + "] is locked.");            }            if (account.isCredentialsExpired()) {                String msg = "The credentials for account [" + account + "] are expired";                throw new ExpiredCredentialsException(msg);            }        }        return account;    }    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {        String username = getUsername(principals);        USERS_LOCK.readLock().lock();        try {            return this.users.get(username);        } finally {            USERS_LOCK.readLock().unlock();        }    }}
3.自定义realm
public class CustomerRealm extends AuthorizingRealm {    //认证方法    @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {        return null;    }    //授权方法    @Override    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {        String principal = (String) token.getPrincipal();        if("mosin".equals(principal)){            return new SimpleAuthenticationInfo(principal,"123",this.getName());        }        return null;    }}
4.使用自定义Realm认证
public class TestAuthenticatorCustomerRealm {    public static void main(String[] args) {        //创建securityManager        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();        //IniRealm realm = new IniRealm("classpath:realm.ini");        //设置为自定义realm获取认证数据        defaultSecurityManager.setRealm(new CustomerRealm());        //将安装工具类中设置默认安全管理器        SecurityUtils.setSecurityManager(defaultSecurityManager);        //获取主体对象        Subject subject = SecurityUtils.getSubject();        //创建token令牌        UsernamePasswordToken token = new UsernamePasswordToken("mosin", "1234");        try {            subject.login(token);//用户登录            System.out.println("登录成功");        } catch (UnknownAccountException e) {            e.printStackTrace();            System.out.println("用户名错误!!");        }catch (IncorrectCredentialsException e){            e.printStackTrace();            System.out.println("密码错误!!!");        }    }}

4.6 使用MD5和Salt

实际应用是将盐和散列后的值存在数据库中,自动realm从数据库取出盐和加密后的值由shiro完成密码校验。

1.自定义md5+salt的realm
public class CustomerMD5Realm extends AuthorizingRealm {    //授权    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {        return null;    }    //认证    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {        String principal = (String) token.getPrincipal();        //根据用户名查询数据库        if("mosin".equals(principal)){            // 参数1:用户名  参数2:密码 参数3:盐 参数4:自定义realm的名字            System.out.println(this.getName());            return new SimpleAuthenticationInfo(principal, "800d63a19662b2ba95bc2ffa01ab4804", ByteSource.Util.bytes("mosin"),this.getName());        }        return null;    }}
2.使用md5 + salt 认证
public class CustomerMD5RealmTest {    public static void main(String[] args) {        //创建安全管理器        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();        //创建自定义MD5Realm对象        CustomerMD5Realm customerMD5Realm = new CustomerMD5Realm();        //创建密码认证匹配器对象        HashedCredentialsMatcher md5 = new HashedCredentialsMatcher("MD5");        //设置散列的次数        md5.setHashIterations(1024);        //设置密码认证匹配器对象        customerMD5Realm.setCredentialsMatcher(md5);        //设置安全管理器的 认证安全数据源        defaultSecurityManager.setRealm(customerMD5Realm);        //设置安全工具类的安全管理器        SecurityUtils.setSecurityManager(defaultSecurityManager);        //获取认证的主体        Subject subject = SecurityUtils.getSubject();        //创建令牌        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("mosi", "12345");        //登录认证        try {            subject.login(usernamePasswordToken);            System.out.println("认证通过:"+subject.isAuthenticated());        } catch (UnknownAccountException e) {            e.printStackTrace();            System.out.println("用户名错误");        }catch (IncorrectCredentialsException e){            e.printStackTrace();            System.out.println("密码错误!!!");        }    }}

5. shiro中的授权

5.1 授权

授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

5.2 关键对象

授权可简单理解为who对what(which)进行How操作:

Who,即主体(Subject),主体需要访问系统中的资源。

What,即资源(Resource),如系统菜单、页面、按钮、类方法、系统商品信息等。资源包括资源类型和资源实例,比如商品信息为资源类型,类型为t01的商品为资源实例,编号为001的商品信息也属于资源实例。

How,权限/许可(Permission),规定了主体对资源的操作许可,权限离开资源没有意义,如用户查询权限、用户添加权限、某个类方法的调用权限、编号为001用户的修改权限等,通过权限可知主体对哪些资源都有哪些操作许可。

5.3 授权流程

java Shiro相关知识点有哪些

5.4 授权方式

  • 基于角色的访问控制

    • RBAC基于角色的访问控制(Role-Based Access Control)是以角色为中心进行访问控制

  • 基于资源的访问控制

    • RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中心进行访问控制

if(subject.isPermission("user:update:01")){ //资源实例  //对01用户进行修改}if(subject.isPermission("user:update:*")){  //资源类型  //对01用户进行修改}

5.5 权限字符串

权限字符串的规则是:资源标识符:操作:资源实例标识符,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。

例子:

  • 用户创建权限:user:create,或user:create:*

  • 用户修改实例001的权限:user:update:001

  • 用户实例001的所有权限:user:*:001

5.6 shiro中授权编程实现方式

  • 编程式

Subject subject = SecurityUtils.getSubject();if(subject.hasRole(“admin”)) {//有权限} else {//无权限}
  • 注解式

@RequiresRoles("admin")public void hello() {//有权限}
  •  标签式

jsP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:<shiro:hasRole name="admin"><!— 有权限—></shiro:hasRole>注意: Thymeleaf 中使用shiro需要额外集成!

5.7 开发授权

1.realm的实现
public class CustomerRealm extends AuthorizingRealm {    //授权    @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {        String primaryPrincipal = (String) principals.getPrimaryPrincipal();        System.out.println("primaryPrincipal = " + primaryPrincipal);        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();        simpleAuthorizationInfo.addRole("admin");        simpleAuthorizationInfo.addStringPermission("user:update:*");        simpleAuthorizationInfo.addStringPermission("product:*:*");        return simpleAuthorizationInfo;    }    //认证    @Override    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {        String principal = (String) token.getPrincipal();        if("xiaochen".equals(principal)){            String password = "3c88b338102c1a343bcb88cd3878758e";            String salt = "Q4F%";            return new SimpleAuthenticationInfo(principal,password,                                                 ByteSource.Util.bytes(salt),this.getName());        }        return null;    }}
2.授权
public class CustomerMD5RealmTest {    public static void main(String[] args) {        //创建安全管理器        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();        //创建自定义MD5Realm对象        CustomerMD5Realm customerMD5Realm = new CustomerMD5Realm();        //创建密码认证匹配器对象        HashedCredentialsMatcher md5 = new HashedCredentialsMatcher("md5");        //设置加密的次数        md5.setHashIterations(1024);        //设置密码认证匹配器对象        customerMD5Realm.setCredentialsMatcher(md5);        //设置安全管理器的 认证安全数据源        defaultSecurityManager.setRealm(customerMD5Realm);        //设置安全工具类的安全管理器        SecurityUtils.setSecurityManager(defaultSecurityManager);        //获取认证的主体        Subject subject = SecurityUtils.getSubject();        //创建令牌        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("mosin", "12345");        //登录认证        try {            subject.login(usernamePasswordToken);            System.out.println("认证通过:"+subject.isAuthenticated());        } catch (UnknownAccountException e) {            e.printStackTrace();            System.out.println("用户名错误");        }catch (IncorrectCredentialsException e){            e.printStackTrace();            System.out.println("密码错误!!!");        }        //基于角色的控制        //单角色控制        System.out.println("========hasRole==========");        boolean admin = subject.hasRole("admin");        System.out.println("hash admin role:"+admin);        //多角色控制        System.out.println("========hasAllRoles==========");        List<String> roles = Arrays.asList("admin", "user");        boolean booleans = subject.hasAllRoles(roles);        System.out.println("booleans = " + booleans);        // 基于任意角色的控制        System.out.println("========hasRoles==========");        boolean[] booleans1 = subject.hasRoles(roles);        for (boolean b : booleans1) {            System.out.println("b = " + b);        }        //基于权限字符串的权限控制        System.out.println("========isPermitted==========");        boolean permitted = subject.isPermitted("user:update:*");        System.out.println("permitted = " + permitted);        //分别具有哪些权限        boolean[] permitted1 = subject.isPermitted("user:update:*", "product:update:*");        for (boolean b : permitted1) {            System.out.println("b = " + b);        }        //同时具有哪些权限        boolean permittedAll = subject.isPermittedAll("user:update:*", "product:update:*");        System.out.println("permittedAll = " + permittedAll);    }}

关于“java Shiro相关知识点有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“java Shiro相关知识点有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: java Shiro相关知识点有哪些

本文链接: https://lsjlt.com/news/356496.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java Shiro相关知识点有哪些
    这篇文章主要介绍了java Shiro相关知识点有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java Shiro相关知识点有哪些文章都会有所收获,下面我们一起来看看吧。1.权限的管理1.1 什么是权限管...
    99+
    2023-07-06
  • 有哪些Java的相关知识点
    这篇文章主要介绍“有哪些Java的相关知识点”,在日常操作中,相信很多人在有哪些Java的相关知识点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些Java的相关知识点”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-16
  • Java中Volatile相关知识点有哪些
    这篇文章主要介绍“Java中Volatile相关知识点有哪些”,在日常操作中,相信很多人在Java中Volatile相关知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中Volatile相关...
    99+
    2023-06-16
  • Baseline相关知识点有哪些
    本篇内容主要讲解“Baseline相关知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Baseline相关知识点有哪些”吧! 在 Oracle Da...
    99+
    2024-04-02
  • MySQL相关知识点有哪些
    这篇文章主要介绍了MySQL相关知识点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 1、数据库架构1.1...
    99+
    2024-04-02
  • Git相关知识点有哪些
    这篇文章主要讲解了“Git相关知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Git相关知识点有哪些”吧!一、Git工作流程以上包括一些简单而常用...
    99+
    2024-04-02
  • CSS相关知识点有哪些
    本篇内容介绍了“CSS相关知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1、CSS选择器 ...
    99+
    2024-04-02
  • HashMap相关知识点有哪些
    本篇内容介绍了“HashMap相关知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!HashMap 和 HashSet 是 Java...
    99+
    2023-06-17
  • YARN相关知识点有哪些
    本篇内容介绍了“YARN相关知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!YARN产生背景为什么会产生YRAN?这个与MapRe...
    99+
    2023-06-19
  • JAVA的IO流相关知识点有哪些
    今天小编给大家分享一下JAVA的IO流相关知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一.Input和Outp...
    99+
    2023-06-03
  • Java IO相关知识有哪些
    这篇文章主要介绍了Java IO相关知识有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、IO底层是怎么回事?操作系统就是管家,电脑的设备就是资源,如果进程先要操作资源...
    99+
    2023-06-15
  • library cache相关知识点有哪些
    library cache相关知识点有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。共享游标Sql首次解析后会生成父游标和1个子游标(...
    99+
    2024-04-02
  • mysql binlog相关知识点有哪些
    本篇内容主要讲解“mysql binlog相关知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql binlog相关知识点有哪些”吧! ...
    99+
    2024-04-02
  • synchronized的相关知识点有哪些
    这篇文章主要讲解了“synchronized的相关知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“synchronized的相关知识点有哪些”吧!...
    99+
    2024-04-02
  • JVM相关的知识点有哪些
    这篇文章主要讲解了“JVM相关的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM相关的知识点有哪些”吧!JVM作为java运行的基础,很难相...
    99+
    2024-04-02
  • Git的相关知识点有哪些
    这篇文章主要介绍“Git的相关知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Git的相关知识点有哪些”文章能帮助大家解决问题。分支和合并Git 跟其他版本控制系统***的优势就在于其高级...
    99+
    2023-06-17
  • KeyDB的相关知识点有哪些
    今天小编给大家分享一下KeyDB的相关知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。线程模型KeyDB将redi...
    99+
    2023-06-19
  • React的相关知识点有哪些
    这篇文章主要介绍“React的相关知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React的相关知识点有哪些”文章能帮助大家解决问题。React与传统MVC的关系轻量级的视图层库!A J...
    99+
    2023-06-03
  • Java高并发的相关知识点有哪些
    本文小编为大家详细介绍“Java高并发的相关知识点有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java高并发的相关知识点有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。读到这里,这篇“Java高并发...
    99+
    2023-06-17
  • Oracle Cursor的相关知识点有哪些
    本篇内容介绍了“Oracle Cursor的相关知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作