如果完成了上一节课的环境搭建,那么就开始下面的学习吧
主表: 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/RoleService
public interface RoleService {
public List<Role> list();
}
//service/impl/RoleServiceImpl
public 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/RoleDao
public interface RoleDao {
List<Role> findAll();
}
//dao/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;
}}
在spring-mvc.xml写入如下:
xxxxxxxxxx
xmlns: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类,修改为如下
xxxxxxxxxx
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);
}
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);
}
}