SSM框架的简单管理系统学习问题总结

管理系统基于Oracle数据库,springmvc、spring、Mybatis框架和springSecurity框架

😶

问题一

在这里插入图片描述
查询的目的是,根据订单id查出此订单的产品信息、会员信息和游客信息。
出现的问题是,我的sql语句在PL/SQL developer中能正确查到某个订单的所有要求的信息,但放到xml中,能查出游客信息,但只有一条游客信息(正确应该有两条),而且如果订单的游客不是会员就无法查到该游客。

select o.*,m.*,t.*,p.*
    from traveller t,orders o,member m,product p
    where o.id = 'C445416F31424381BC401D5BCC433DDD'
    and m.id = (select m.id from member m,orders o where o.memberid = m.id and o.id = 'C445416F31424381BC401D5BCC433DDD')
    and t.id in (select t.id from traveller t,order_traveller ot where t.id = ot.travellerid and ot.orderid = 'C445416F31424381BC401D5BCC433DDD')
    and p.id = (select p.id from  product p,orders o where o.productid = p.id and o.id = 'C445416F31424381BC401D5BCC433DDD')

sql语句放到PL/SQL developer中能正确的查到两条游客记录
在这里插入图片描述
在这里插入图片描述

<select id="findById" resultMap="ordersDetails" parameterType="String">
    select o.*,m.*,t.*,p.*
    from traveller t,orders o,member m,product p
    where o.id = #{id}
    and m.id = (select m.id from member m,orders o where o.memberid = m.id and o.id = #{id})
    and t.id in (select t.id from traveller t,order_traveller ot where t.id = ot.travellerid and ot.orderid = #{id})
    and p.id = (select p.id from  product p,orders o where o.productid = p.id and o.id = #{id})
</select>

但在项目里只能查到德莱厄斯这个会员作为游客的信息。怎么改都是直接用给sql语句能查到记录,在xml中就是查不到正确的信息,最后只能妥协用注解方式的sql。

@Select("select * from orders where id=#{ordersId,jdbcType=VARCHAR}")
    @Results({
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "orderNum", column = "orderNum"),
            @Result(property = "orderTime", column = "orderTime"),
            @Result(property = "orderStatus", column = "orderStatus"),
            @Result(property = "peopleCount", column = "peopleCount"),
            @Result(property = "peopleCount", column = "peopleCount"),
            @Result(property = "payType", column = "payType"),
            @Result(property = "orderDesc", column = "orderDesc"),
            @Result(property = "product", column = "productId", javaType = Product.class, one = @One(fetchType = FetchType.LAZY,select = "com.example.dao.ProductDao.findById")),
            @Result(property = "member",column = "memberId",javaType = Member.class,one = @One(fetchType = FetchType.LAZY,select = "com.example.dao.MemberDao.findById")),
            @Result(property = "travellers",column = "id",javaType =java.util.List.class,many = @Many(fetchType = FetchType.LAZY,select = "com.example.dao.TravellerDao.findByOId"))
    })
    Orders findById(String id);

注解的方式,方便理解,而且好像查询的语句也比较清晰。

问题二

这里先说一下方法级权限的三种配置方式

方式一
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>jsr250-api</artifactId>
    <version>1.0</version>
</dependency>
2、在spring-mvc.xml 开启注解
<security:global-method-security jsr250-annotations="enabled"></security:global-method-security>
3、在权限控制的方法上面使用注解
@RolesAllowed("ADMIN")
这种也可以写@RolesAllowed("ROLE_ADMIN"),上面是省略ROLE_前缀
方式二
1、在spring-mvc.xml 开启注解
<security:global-method-security secured-annotations="enabled"></security:global-method-security>
2、在权限控制的方法上面使用注解
@Secured("ROLE_ADMIN")
这里不能省略ROLE_前缀
方式三,支持表达式
1、在spring-mvc.xml 开启注解
<security:global-method-security pre-post-annotations="enabled"></security:global-method-security>
2、在权限控制的方法上面使用注解
@PreAuthorize("authentication.principal.username == 'peny'")
@PreAuthorize("hasRole('ROLE_ADMIN')")
这里可以省略ROLE_前缀;  @PreAuthorize("hasRole('ADMIN')")

在用springsecurity做方法级的权限管理时,配置出了问题,想用方式二,因为它就是spirngsecurity框架自带的,不用再导包,但本来是在spring-security.xml这里配置的标签,怎么配置都没有效果。
最后百度的要放在springMVC的配置文件里,
spring-security 开启方法级权限控制失败

<!--方法级的权限控制-->
    <security:global-method-security jsr250-annotations="enabled" secured-annotations="enabled"/>

悲催的是这样配置之后启动tomcat运行报错,Unexpected AOP exception; nested exception is java.lang.IllegalStateException,我去,真的是面向百度编程啊,然后 死马当活马医 ,按照Unexpected AOP exception; nested exception is java.lang.IllegalStateException: 解决,解决了。。。
终于,方法级的权限控制生效了。😥

问题三

关于AOP配置的问题,需要开启AOP的注解支持
本来在spring框架中,AOP的配置都和spring容器配置写在一起,都在applicationContext.xml中,但配置之后没有效果,然后又在CSDN上查到要配置在springMVC的配置文件中,试了一下,果然生效了,😶

<!--
    支持AOP的注解支持,AOP底层使用代理技术
    JDK动态代理,要求必须有接口
    cglib代理,生成子类对象,proxy-target-class="true" 默认使用cglib的方式
-->
<aop:aspectj-autoproxy proxy-target-class="true"/>

在这里插入图片描述

这个管理系统用到了十一个表,是我用数据库的历史之最多,构建项目用到了IDEA的Module这种方式,每一层是一个module,而且这个还用了一些maven的命令,确实由maven管理项目真的不错。
这三个问题都是基于实际做项目产生的,我没法单独做测试,除非花大力气大量修改、抽取然后写测试类,当然还不能保证测试一定能有什么明确的结果,所以还是百度的多一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值