目录
一、问题
在学习springsecurity途中,需要设计合理的表结构,依据他人的经验,从基础的RBAC开始,在此基础上,需要使用操作数据库的工具,由于之前使用过mybatis,便在该项目中继续使用。由于先前未有mybatis多表查询的经验,便在网上搜索了大量资料,但并未解决我的问题。但最终还是解决了(似乎),特此记录。
二、搜索
搜索他人资料,都是链表查询或者嵌套查询,例如:
Mybatis链表查询/嵌套查询_mybatis 链式查询_码农的坤仔的博客-CSDN博客
mybatis中的连表查询_mybatis连表查询_L向上z的博客-CSDN博客等等。根据他们的方法,我也在每个类中添加了对应依赖类,在主xml文件中添加诸如collection,association。如下:
<resultMap id="BaseResultMap" type="com.example.spring_mybatis.entity.Login" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="userpassword" property="userpassword" jdbcType="VARCHAR" />
<result column="oldpassword" property="oldpassword" jdbcType="VARCHAR" />
<result column="nicheng" property="nicheng" jdbcType="VARCHAR" />
<collection property="lr" ofType="com.example.spring_mybatis.entity.LoginRoles">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="loginID" property="loginid" jdbcType="INTEGER"/>
<result column="rolesID" property="rolesid" jdbcType="INTEGER"/>
<association property="ur" javaType="com.example.spring_mybatis.entity.UserRoles">
<collection property="rp" ofType="com.example.spring_mybatis.entity.RolesPermissions">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="rolesID" property="rolesid" jdbcType="INTEGER"/>
<result column="permissionID" property="permissionid" jdbcType="INTEGER"/>
<association property="up" javaType="com.example.spring_mybatis.entity.UserPermissions">
</association>
</collection>
</association>
</collection>
</resultMap>
在实际编写过程中, association中无法识别该类中的字段,所以加以删除,什么原因,不得而知,希望能有人解答一下。然后将sql语句加入其中,运行后未报错,但结果为空。
三、解决
由于结果不符合期望,便暂时舍弃这些方法继续寻找,偶然在一篇文章中看到跟我类似的设计:运用Mybatis进行多表联查_mybatis多表联合查询_龍夜的博客-CSDN博客
其虽也使用了collection等,但其使用的sql语句引起了我的注意。又想到以前编写的mybatis xml文件,在一次编写中,我将table名称写错了,写成了另一张表,调用该方法,却可以查出该错误表的数据。也就是说,在数据库连接成功的情况下,mybatis的xml文件可以查询该数据库下所有的表,那么,我直接在xml文件下使用多表查询语句,并创建自定义接受类,是否可以得到我想要的结果呢,如下:
<select id="selectUserPermissions" resultType="com.example.spring_mybatis.entity.UserMessage">
select a.username,a.nicheng,c.roles,e.permissions from login a
join login_roles b
on a.id = b.loginID
join userroles c
on b.rolesID = c.id
join roles_permissions d
on c.id = d.rolesID
join userpermissions e
on d.permissionID = e.id
where a.nicheng = #{nicheng}
</select>
其中UserMessage为自定义接受类,运行后,果然得到了我想要的结果,至此,问题得到了解决。之后我将多余的mapper,xml文删掉,运行后,依旧得到了我想要的结果。