1、创建数据库和数据表(以Mysql数据库为例) 设计一个权限管理系统。 表设计如下:用户表、角色表、菜单表 使用Mybaits构建用户、角色、菜单的映射关系 1、用户表(UserInfo):Id、UserName、UserPwd,userSex,userSchool,userAddress 2、角色表(RoleInfo):Id、RoleName 3、菜单表(MenuInfo):Id、MenuName 4、用户角色表(UserRole):Id、UserId、RoleId; 5、角色菜单表(RoleMenu):Id、RoleId、MenuId 2、对用户的菜单权限查询编写单元测试用例。 3.使用动态sql拼接的方式实现在一个接口内进行用户名、用户地址、用户性别的筛选。
时间: 2023-06-11 18:08:50 浏览: 472
关于用户权限的数据库设计
4星 · 用户满意度95%
1、创建数据库和数据表(以Mysql数据库为例)
首先需要创建一个名为`permission_management`的数据库,然后在该数据库中创建三个表:`user_info`、`role_info`、`menu_info`,以及两个关联表:`user_role`、`role_menu`。
```sql
-- 创建数据库
CREATE DATABASE permission_management;
-- 创建用户表
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(50) NOT NULL,
user_pwd VARCHAR(50) NOT NULL,
user_sex VARCHAR(10),
user_school VARCHAR(100),
user_address VARCHAR(100)
);
-- 创建角色表
CREATE TABLE role_info (
id INT PRIMARY KEY AUTO_INCREMENT,
role_name VARCHAR(50) NOT NULL
);
-- 创建菜单表
CREATE TABLE menu_info (
id INT PRIMARY KEY AUTO_INCREMENT,
menu_name VARCHAR(50) NOT NULL
);
-- 创建用户角色关联表
CREATE TABLE user_role (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
role_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES user_info(id),
FOREIGN KEY (role_id) REFERENCES role_info(id)
);
-- 创建角色菜单关联表
CREATE TABLE role_menu (
id INT PRIMARY KEY AUTO_INCREMENT,
role_id INT NOT NULL,
menu_id INT NOT NULL,
FOREIGN KEY (role_id) REFERENCES role_info(id),
FOREIGN KEY (menu_id) REFERENCES menu_info(id)
);
```
2、使用Mybatis构建用户、角色、菜单的映射关系
在 Mybatis 中,我们可以通过编写 Mapper 文件来实现 Java 对象和数据库表的映射关系。在本例中,我们编写三个 Mapper 文件:`UserMapper.xml`、`RoleMapper.xml`、`MenuMapper.xml`,分别用于用户、角色、菜单的数据操作。
以`UserMapper.xml`为例,示例代码如下:
```xml
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" parameterType="int" resultType="User">
SELECT * FROM user_info WHERE id = #{id}
</select>
<select id="getUserByName" parameterType="String" resultType="User">
SELECT * FROM user_info WHERE user_name = #{userName}
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO user_info(user_name, user_pwd, user_sex, user_school, user_address)
VALUES (#{userName}, #{userPwd}, #{userSex}, #{userSchool}, #{userAddress})
</insert>
<update id="updateUser" parameterType="User">
UPDATE user_info SET
user_name = #{userName},
user_pwd = #{userPwd},
user_sex = #{userSex},
user_school = #{userSchool},
user_address = #{userAddress}
WHERE id = #{id}
</update>
<delete id="deleteUserById" parameterType="int">
DELETE FROM user_info WHERE id = #{id}
</delete>
<select id="getUserRole" parameterType="int" resultType="Role">
SELECT r.* FROM role_info r, user_role ur
WHERE r.id = ur.role_id AND ur.user_id = #{userId}
</select>
<select id="getUserMenu" parameterType="int" resultType="Menu">
SELECT m.* FROM menu_info m, role_menu rm, user_role ur
WHERE m.id = rm.menu_id AND rm.role_id = ur.role_id AND ur.user_id = #{userId}
</select>
</mapper>
```
在该 Mapper 文件中,我们定义了查询、插入、更新、删除用户信息的 SQL 语句,并且还定义了查询用户的角色和菜单信息的 SQL 语句。这些 SQL 语句将会被 Mybatis 根据配置文件自动映射为 Java 方法,供我们在代码中使用。
3、对用户的菜单权限查询编写单元测试用例
在编写单元测试用例之前,我们需要先配置 Mybatis 的配置文件`mybatis-config.xml`和 Spring 的配置文件`applicationContext.xml`,以便在测试代码中使用 Mybatis 和 Spring。
在配置文件中,我们需要指定数据源和 Mapper 文件的位置,并且还需要配置事务管理器和 SQL 语句的日志输出。
配置文件示例代码如下:
```xml
<!-- 数据源配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/permission_management"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- Mybatis 配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:com/example/mapper/*.xml"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- Mapper 扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- SQL 日志输出 -->
<bean id="sqlSessionFactoryLog" class="org.apache.ibatis.logging.log4j.Log4jImpl">
<property name="prefix" value="mybatis.sql."/>
</bean>
<bean id="sqlSessionLog" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
<constructor-arg index="1" ref="sqlSessionFactoryLog"/>
</bean>
```
在配置文件完成后,我们就可以编写单元测试用例了。在测试用例中,我们可以使用`SqlSession`对象来执行 Mapper 中定义的 SQL 语句,并通过 Java 对象来访问查询结果。
示例代码如下:
```java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class UserMapperTest {
@Autowired
private SqlSession sqlSession;
@Test
public void testGetUserMenu() {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<Menu> menuList = userMapper.getUserMenu(1);
for (Menu menu : menuList) {
System.out.println(menu.getMenuName());
}
}
}
```
在该测试用例中,我们通过`getUserMenu()`方法查询了用户 ID 为 1 的用户所拥有的菜单权限,并打印出了查询结果。
4、使用动态sql拼接的方式实现在一个接口内进行用户名、用户地址、用户性别的筛选
在 Mybatis 中,我们可以使用动态 SQL 来实现基于条件的查询。动态 SQL 可以根据 SQL 语句中的条件进行拼接,从而动态生成 SQL 语句。
以用户表`user_info`为例,我们可以编写一个通用的查询方法,可以基于用户名、用户地址、用户性别进行筛选。
Mapper 文件示例代码如下:
```xml
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserList" resultType="User">
SELECT * FROM user_info
<where>
<if test="userName != null and userName != ''">
AND user_name LIKE CONCAT('%', #{userName}, '%')
</if>
<if test="userAddress != null and userAddress != ''">
AND user_address LIKE CONCAT('%', #{userAddress}, '%')
</if>
<if test="userSex != null and userSex != ''">
AND user_sex = #{userSex}
</if>
</where>
</select>
</mapper>
```
在该 Mapper 文件中,我们使用了`<where>`标签和`<if>`标签来实现动态 SQL 的拼接。如果查询条件不为空,则会将相应的 SQL 语句拼接到查询语句中。
Java 接口示例代码如下:
```java
public interface UserMapper {
List<User> getUserList(@Param("userName") String userName, @Param("userAddress") String userAddress, @Param("userSex") String userSex);
}
```
在该接口中,我们使用了`@Param`注解来指定方法参数对应的 SQL 语句中的参数名。这样,在调用该方法时,Mybatis 就会自动将参数传递给 SQL 语句,完成查询操作。
至此,我们已经完成了动态 SQL 的拼接,可以在一个接口内进行用户名、用户地址、用户性别的筛选。
阅读全文