如果完成了上一节课的环境搭建,那么就开始下面的学习吧
主表: sys_user用户表 主表: sys_role角色表 中间表: sys_user_role用户角色中间表
多对多的表关系: 一个用户可以担任多种角色,一种角色可以被多个用户担任 中间表的作用: 由于用户表和角色表都是主表,中间表内部维护的是外键(用户表和角色表的主键)
步骤分析:
1、点击'角色管理'菜单发送请求到我们的服务器端(修改'角色管理'菜单的url地址)
2、创建RoleController和showList()方法
3、创建RoleService和showList()方法
4、创建RoleDao和findAll()方法
5、使用JdbcTemplate完成查询操作,注意JdbcTemplate也叫jdbc模板
6、将查询数据存储到Model中
7、转发到role-list.jsp页面进行展示
//controller/RoleController("/role")public class RoleController { private RoleService roleService; ("/list") public ModelAndView list(){ ModelAndView modelAndView = new ModelAndView(); List<Role> roleList = roleService.list(); //指定模型对象 modelAndView.addObject("roleList",roleList); //指定跳转的视图 modelAndView.setViewName("role-list"); return modelAndView; }}
//service/RoleServicepublic interface RoleService { public List<Role> list();}
//service/impl/RoleServiceImplpublic class RoleServiceImpl implements RoleService {private RoleDao roleDao;public void setRoleDao(RoleDao roleDao) { this.roleDao = roleDao;}public List<Role> list() { List<Role> roleList = roleDao.findAll(); return roleList;}}
//dao/RoleDaopublic interface RoleDao { List<Role> findAll();}
//dao/RoleDaoImplpublic class RoleDaoImpl implements RoleDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate;}public List<Role> findAll() { List<Role> roleList = jdbcTemplate.query("select * from sys_role", new BeanPropertyRowMapper<Role>(Role.class)); return roleList;}}
在spring-mvc.xml写入如下:
xxxxxxxxxxxmlns:context="http://www.springframework.org/schema/context"http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
<!--组件扫描,扫描Controller层--><context:component-scan base-package="com.huanf.controller"/>
在applicationContext.xml写入如下:
<!--配置Jdbc模板对象,也就是配置JdbcTemplate对象--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!--注入数据源--> <property name="dataSource" ref="dataSource"></property></bean>
<!--配置RoleService--><bean id="roleService" class="com.huanf.service.impl.RoleServiceImpl"> <property name="roleDao" ref="roleDao"/></bean><!--配置RoleDao--><bean id="roleDao" class="com.huanf.dao.impl.RoleDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/></bean>
开启Tomcat即可
角色添加的步骤分析:
1、点击列表页面新建按钮跳转到角色添加页面
2、输入角色信息,点击保存按钮,表单数据提交到我们的服务器
3、编写RoleController的save()方法
4、编写RoleService的save()方法
5、编写RoleDao的save()方法
6、使用JdbcTemplate保存Role数据到sys_role表
7、跳转回角色列表页面
具体操作:
第一步: 在RoleController里面添加如下
("/save")public String save(Role role){ roleService.save(role); //redirect表示重定向,跳转到role-list.jsp页面 return "redirect:/role/list";}
第二步: 在RoleService里面添加如下
void save(Role role);
第三步: 在RoleServiceImpl里面添加如下
public void save(Role role) { roleDao.save(role);}
第四步: 在RoleDao里面添加如下
void save(Role role);
第五步: 在RoleDaoImpl里面添加如下
public void save(Role role) { jdbcTemplate.update("insert into sys_role values(?,?,?)",null,role.getRoleName(),role.getRoleDesc());}
第六步: 在web.xml里面写入如下
<!--配置过滤器,解决post请求的数据乱码--><filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--指定编码方式--> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param></filter><filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--过滤所有的请求,都编码为UTF-8--> <url-pattern>/*</url-pattern></filter-mapping>
第一步: 在User里面添加如下
//用户列表-当前用户担任哪些角色private List<Role> roles;public List<Role> getRoles() { return roles;}public void setRoles(List<Role> roles) { this.roles = roles;}
第二步: 在controller目录下新建UserController类,在UserController里面写入如下
("/user")public class UserController { private UserService userService; ("/list") public ModelAndView list(){ List<User> userList = userService.list(); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("userList",userList); modelAndView.setViewName("user-list"); return modelAndView; }}
第三步: 在service目录下新建UserService接口,在UserService接口里面写入如下
public interface UserService { List<User> list();}
第四步: 在/service/impl目录下新建UserServiceImpl,在UserServiceImpl类里面写入如下
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public List<User> list() { return userDao.findAll(); }}
第五步: 在dao目录下新建UserDao接口,在UserDao里面写入如下
public interface UserDao { List<User> findAll();}
第六步: 在dao/impl目录下新建UserDaoImpl类,在UserDaoImpl里面写入如下
public class UserDaoImpl implements UserDao { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public List<User> findAll() { List<User> userList = jdbcTemplate.query("select * from sys_user", new BeanPropertyRowMapper<User>(User.class)); return userList; }}
第七步: 在dao目录下新建RoleDao接口,在RoleDao里面写入如下
public interface RoleDao { //角色列表 List<Role> findAll(); //角色添加 void save(Role role); List<Role> findRoleByUserId(Long id);}
第八步: 在dao/impl目录里面新建RoleDaoImpl类,在RoleDaoImpl里面写入如下
public class RoleDaoImpl implements RoleDao { //角色列表 private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public List<Role> findAll() { List<Role> roleList = jdbcTemplate.query("select * from sys_role", new BeanPropertyRowMapper<Role>(Role.class)); return roleList; } //角色添加 public void save(Role role) { jdbcTemplate.update("insert into sys_role values(?,?,?)",null,role.getRoleName(),role.getRoleDesc()); } //具有角色 public List<Role> findRoleByUserId(Long id) { List<Role> roles = jdbcTemplate.query("select * from sys_user_role ur,sys_role r where ur.roleId=r.id and ur.userid=?", new BeanPropertyRowMapper<Role>(Role.class), id); return roles; }}
第九步: 把/service/impl目录下的UserServiceImpl修改为如下
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } private RoleDao roleDao; public void setRoleDao(RoleDao roleDao) { this.roleDao = roleDao; } public List<User> list() { List<User> userList = userDao.findAll(); //封装UserList中的每一个User的roles数据 for (User user : userList){ //获得User的id Long id = user.getId(); //将id作为参数,查询当前当前这个Userid对应的Role集合数据 List<Role> roles = roleDao.findRoleByUserId(id); user.setRoles(roles); } return userList; }}
第十步: 在applicationContext.xml里面添加如下
xxxxxxxxxx<!--配置UserService--><bean id="userService" class="com.huanf.service.impl.UserServiceImpl"> <property name="userDao" ref="userDao"/> <property name="roleDao" ref="roleDao"/></bean><!--配置Dao--><bean id="userDao" class="com.huanf.dao.impl.UserDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean>
把UserController类修改为如下
("/user")public class UserController { private UserService userService; ("/list") public ModelAndView list(){ List<User> userList = userService.list(); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("userList",userList); modelAndView.setViewName("user-list"); return modelAndView; } private RoleService roleService; ("/saveUI") public ModelAndView saveUI(){ ModelAndView modelAndView = new ModelAndView(); List<Role> roleList = roleService.list(); modelAndView.addObject("roleList",roleList); modelAndView.setViewName("user-add"); return modelAndView; }}
第一步: 把UserService接口,修改为如下
public interface UserService { List<User> list(); void save(User user, Long[] roleIds);}
第二步: 把UserDao接口,修改为如下
public interface UserDao { List<User> findAll(); Long save(User user); void saveUserRoleRel(Long id, Long[] roleIds);}
第三步: 把UserDaoImpl类,修改为如下
public class UserDaoImpl implements UserDao { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public List<User> findAll() { List<User> userList = jdbcTemplate.query("select * from sys_user", new BeanPropertyRowMapper<User>(User.class)); return userList; } //插入用户数据 public Long save(User user) { //创建PreparedStatementCreator PreparedStatementCreator creator = new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { //使用原始的jdbc去完成PreparedStatement组建 PreparedStatement preparedStatement = connection.prepareStatement("insert into sys_user values(?,?,?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS); preparedStatement.setObject(1,null); preparedStatement.setString(2,user.getUsername()); preparedStatement.setString(3,user.getEmail()); preparedStatement.setString(4,user.getPassword()); preparedStatement.setString(5,user.getPhoneNum()); return preparedStatement; } }; //创建keyHolder GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(creator,keyHolder); //获取数据库自动生成的主键 long userId = keyHolder.getKey().longValue(); //获取数据库自动生成的id return userId; } //插入用户数据 public void saveUserRoleRel(Long userId, Long[] roleIds) { for (Long roleId : roleIds) { jdbcTemplate.update("insert into sys_user_role values(?,?)",userId,roleId); } }}
第四步: 把UserServiceImpl类,修改为如下
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } private RoleDao roleDao; public void setRoleDao(RoleDao roleDao) { this.roleDao = roleDao; } //用户列表 public List<User> list() { List<User> userList = userDao.findAll(); //封装UserList中的每一个User的roles数据 for (User user : userList){ //获得User的id Long id = user.getId(); //将id作为参数,查询当前当前这个Userid对应的Role集合数据 List<Role> roles = roleDao.findRoleByUserId(id); user.setRoles(roles); } return userList; } //添加用户数据 public void save(User user, Long[] roleIds) { //向sys_user表中存储数据 Long userId = userDao.save(user); //向sys_user_role表中存储多条数据 userDao.saveUserRoleRel(userId,roleIds); }}
第五步: 在UserController类添加如下
//添加用户数据到数据库("/save")public String save(User user,Long[] roleIds){ userService.save(user,roleIds); //redirect表示重定向,跳转到list.jsp页面 return "redirect:/user/list";}
第一步: 把UserService接口,修改为如下
public interface UserService { List<User> list(); void save(User user, Long[] roleIds); void del(Long userId);}
第二步: 把UserDao接口,修改为如下
public interface UserDao { List<User> findAll(); Long save(User user); void saveUserRoleRel(Long id, Long[] roleIds); void delUserRoleRel(Long userId); void del(Long userId);}
第三步: 把UserServiceImpl类,修改为如下
xxxxxxxxxxpublic class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } private RoleDao roleDao; public void setRoleDao(RoleDao roleDao) { this.roleDao = roleDao; } //用户列表 public List<User> list() { List<User> userList = userDao.findAll(); //封装UserList中的每一个User的roles数据 for (User user : userList){ //获得User的id Long id = user.getId(); //将id作为参数,查询当前当前这个Userid对应的Role集合数据 List<Role> roles = roleDao.findRoleByUserId(id); user.setRoles(roles); } return userList; } //添加用户数据 public void save(User user, Long[] roleIds) { //向sys_user表中存储数据 Long userId = userDao.save(user); //向sys_user_role表中存储多条数据 userDao.saveUserRoleRel(userId,roleIds); } public void del(Long userId) { //删除sys_user_role中间表 userDao.delUserRoleRel(userId); //删除sys_user用户表 userDao.del(userId); }}
第四步: 把UserDaoImpl类,修改为如下
public class UserDaoImpl implements UserDao { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public List<User> findAll() { List<User> userList = jdbcTemplate.query("select * from sys_user", new BeanPropertyRowMapper<User>(User.class)); return userList; } //插入用户数据 public Long save(User user) { //创建PreparedStatementCreator PreparedStatementCreator creator = new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { //使用原始的jdbc去完成PreparedStatement组建 PreparedStatement preparedStatement = connection.prepareStatement("insert into sys_user values(?,?,?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS); preparedStatement.setObject(1,null); preparedStatement.setString(2,user.getUsername()); preparedStatement.setString(3,user.getEmail()); preparedStatement.setString(4,user.getPassword()); preparedStatement.setString(5,user.getPhoneNum()); return preparedStatement; } }; //创建keyHolder GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(creator,keyHolder); //获取数据库自动生成的主键 long userId = keyHolder.getKey().longValue(); //获取数据库自动生成的id return userId; } //插入用户数据 public void saveUserRoleRel(Long userId, Long[] roleIds) { for (Long roleId : roleIds) { jdbcTemplate.update("insert into sys_user_role values(?,?)",userId,roleId); } } //删除用户在中间表的数据 public void delUserRoleRel(Long userId) { jdbcTemplate.update("delete from sys_user_role where userId=?",userId); } //删除用户在用户表的数据 public void del(Long userId) { jdbcTemplate.update("delete from sys_user where id=?",userId); }}