目录
问题描述
依旧使用之前权限管理登录模拟的案例,进行添加用户并选择用户角色,添加用户表的同时用户_角色中间表(t_user_role)也要添加相应的用户信息,一个用户可以有多个角色(动态sql遍历)。
知识点补充:
1.获取添加操作中自动生成字段的值方法:
useGeneratedKeys——开启获取表中自增属性功能(此处为用户uid)
keyColumn——指定数据库中字段名
keyProperty——实体类中字段对应属性名UserMapper层:
/* 在映射文件中开启获取用户自增属性,并指定表中字段名和实体类中对应属性名。 */ <insert id="addUser" parameterType="com.zx.pojo.User" useGeneratedKeys="true" keyColumn="uid" keyProperty="uid"> insert into t_user values (null,#{uname},#{pwd},#{age}) </insert>
测试是否获取成功:
//获取新添加用户的uid(自增属性,需要获取) int uid = user.getUid(); System.out.println(uid);
2.批量执行多条sql
需要在连接数据库的url后追加 &allowMultiQueries=true,允许批量执行多条sql。
代码实现
(1)UserDao.java层接口:
//添加用户——需绑定角色 void addUser(User user); //添加用户角色 void addUserRole(User user);
(2)UserMapper.xml:
<mapper namespace="com.zx.dao.UserDao"> <!-- 获取添加操作中自动生成字段的值: useGeneratedKeys开启获取表中自增属性的功能(此处为用户uid) keyColumn数据库中字段名 keyProperty实体类中字段对应属性名 此处获取用户uid,用于下面添加用户角色使用。 --> <insert id="addUser" parameterType="com.zx.pojo.User" useGeneratedKeys="true" keyColumn="uid" keyProperty="uid"> insert into t_user values (null,#{uname},#{pwd},#{age}) </insert> <!--添加用户角色--> <insert id="addUserRole" parameterType="com.zx.pojo.User"> /* 用户可能有多个角色,需要遍历输入多条sql collection——用户实体类中角色实体类的属性名 item——遍历的集合项属性 separator——添加分割符,多条sql语句之间用“;”隔开 注:需要在 mybatis-config.xml连接数据库的url后追加 &allowMultiQueries=true,允许批量执行多条sql */ <foreach collection="roles" item="role" separator=";"> insert into t_user_role values (null,#{uid},#{role.rid}) </foreach> </insert> </mapper>
(3)测试运行:
@Test public void addUser(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); //添加用户 User user=new User(); user.setUname("王哈哈"); user.setPwd("123456"); user.setAge(25); userDao.addUser(user); //获取新添加用户的uid(自增属性,需要获取) int uid = user.getUid(); System.out.println(uid); //添加角色——添加两个角色 Role role=new Role(); role.setRid(2); Role role1=new Role(); role1.setRid(3); List<Role> roles=new ArrayList<>(); roles.add(role); roles.add(role1); user.setRoles(roles); userDao.addUserRole(user); sqlSession.commit(); sqlSession.close(); }
运行结果: