Java进阶知识37 Spring+SpringMVC+mybatis+Oracle【xml版】

本文知识点(目录):

      1、本文整合实例最终效果图展示
      2、导读
          2.1、开发技术概述
          2.2、本项目使用的jar包、项目结构图
      3、本文所有代码(xml 版)
          3.1、Oracle 数据库建表脚本
          3.2、web.xml 配置文件
          3.3、mybatis.xml 配置文件
          3.4、实体类及配置文件
          3.5、dao 层
          3.6、service 层
          3.7、controller 控制层/器
          3.8、Spring 配置文件(beans.xml)
          3.9、SpringMVC核心配置文件
          3.10、前端页面



1、本文整合实例最终效果图展示  

数据库表

前端

2、导读                    

2.1、开发技术概述

    a.本文使用的是Spring+SpringMVC+mybatis框架,Oracle 11g,tomcat-7.0.96,JDK-1.8,MyEclipse10.6,采用了“xml 版”的方式开发的;

    b.本文只实现了用户登录(含账号查询)、查询所有(用户、部门、角色);

    c.本项目所采用的编码格式都是 UTF-8;

    d.注意:如果查询两张表,或多张表时,出现相同字段名,不同表,但是查询到的值是同一张表的值的解决方法:https://blog.csdn.net/lee4037/article/details/16798941

2.2、本项目使用的jar包、项目结构图

    

3、本文所有代码(xml 版)  

3.1、Oracle 数据库建表脚本

 1 -- Create Table: department 
 2 -- users表与department表是单向多对一,users是从表,department是主表 
 3 create table department (
 4    id            NUMBER(6)      primary key,
 5    name          VARCHAR2(20),
 6    description   VARCHAR2(50)
 7 );
 8 
 9 -- Create Table: role 
10 -- users表与role表是单向多对多,以users为主表   
11 create table role (
12    id            NUMBER(6)      primary key,
13    name          VARCHAR2(20),
14    privilege_id  NUMBER(6)
15 );
16 
17 -- Create Table: users
18 create table users (
19    id            NUMBER(6)      primary key,
20    department_id NUMBER(6),
21    name          VARCHAR2(20),
22    sex             NUMBER(1),
23    account       VARCHAR2(20),
24    password      VARCHAR2(32),
25    email         VARCHAR2(20),
26    telphone      VARCHAR2(20),
27    flag             NUMBER(1),
28    constraint users_department_fk foreign key (department_id) references department (id)
29 );
30 
31 -- Create Table: users_role
32 create table users_role 
33 (
34    users_id      NUMBER(6)      not null,
35    role_id       NUMBER(6)      not null,
36    constraint users_role_pk primary key (users_id, role_id),
37    constraint users_role_fk foreign key (users_id) references users (id),
38    constraint role_users_fk foreign key (role_id) references role (id)
39 );
40 
41 -- 创建对应表的【序列】
42 create sequence users_seq
43 minvalue 1    
44 maxvalue 999999    
45 start with 1 
46 increment by 1;
47 
48 create sequence department_seq
49 minvalue 1    
50 maxvalue 999999    
51 start with 1 
52 increment by 1;
53 
54 create sequence role_seq
55 minvalue 1    
56 maxvalue 999999    
57 start with 1 
58 increment by 1;
59 
60 -- 创建对应表和序列的【触发器】
61 -- 触发器需要一个一个的创建,同时创建,虽然没报错,但是不会成功(Developer工具)。
62 create or replace trigger users_tg
63   before insert on users for each row 
64     begin
65       select users_seq.Nextval into:new.id from dual;
66   end;
67 
68 create or replace trigger department_tg
69   before insert on department for each row 
70     begin
71       select department_seq.Nextval into:new.id from dual;
72   end;
73 
74 create or replace trigger role_tg
75   before insert on role for each row 
76     begin
77       select role_seq.Nextval into:new.id from dual;
78   end;
79 
80 -- 手动插入数据
81 insert into department(name,description) values('人事部','hr');
82 insert into department(name,description) values('财务部','财务');
83 insert into department(name,description) values('软件开发部','软件开发');
84 
85 insert into users(name,sex,account,password,department_id,flag) values('张三',1,'zhangsan','123456',1,1);
86 insert into users(name,sex,account,password,department_id,flag) values('李四',0,'lisi','123456',3,0);
87 insert into users(name,sex,account,password,department_id,flag) values('王五',1,'wangwu','123456',2,1);
88 insert into users(name,sex,account,password,department_id,flag) values('赵六',1,'zhaoliu','123456',3,1);
89 
90 insert into role(name,privilege_id) values('超级管理员',2);
91 insert into role(name,privilege_id) values('财务部管理员',3);
92 insert into role(name,privilege_id) values('普通管理员',1);
93 
94 -- 中间表
95 insert into users_role values(1,1);
96 insert into users_role values(2,1);
97 insert into users_role values(2,2);
98 insert into users_role values(3,3);

3.2、web.xml 配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="3.0" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 7   <display-name></display-name>    
 8   <welcome-file-list>
 9     <welcome-file>index.jsp</welcome-file>
10   </welcome-file-list>
11   
12       <!-- spring监听 -->
13       <context-param>
14         <param-name>contextConfigLocation</param-name>
15         <param-value>classpath:conf/beans.xml</param-value>
16     </context-param>
17     <listener>
18         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
19     </listener>
20     
21     <!-- springmvc核心控制器 -->
22     <servlet>
23         <servlet-name>DispatcherServlet</servlet-name>
24         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
25         <init-param>
26             <param-name>contextConfigLocation</param-name>
27             <param-value>classpath:conf/springmvc.xml</param-value>
28             <!-- classpath: 等价于WEB-INF/classes/ -->
29         </init-param>
30     </servlet>
31     <servlet-mapping>
32         <servlet-name>DispatcherServlet</servlet-name>
33         <url-pattern>*.action</url-pattern>
34     </servlet-mapping>
35     
36     <!-- 编码过滤器 -->
37     <filter>
38         <filter-name>CharacterEncodingFilter</filter-name>
39         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
40         <init-param>
41             <param-name>encoding</param-name>
42             <param-value>UTF-8</param-value>
43         </init-param>
44     </filter>
45     <filter-mapping>
46         <filter-name>CharacterEncodingFilter</filter-name>
47         <url-pattern>/*</url-pattern>
48     </filter-mapping>
49 </web-app>

3.3、mybatis.xml 配置文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 4 <configuration>
 5     <!-- <environments default="development">
 6         <environment id="development">
 7             <transactionManager type="JDBC" />
 8             <dataSource type="POOLED">
 9                 <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
10                 <property name="url" value="jdbc:oracle:thin:@localhost:1521:shoreid" />
11                 <property name="username" value="zhangsan" />
12                 <property name="password" value="123456" />
13             </dataSource>
14         </environment>
15     </environments> -->
16 
17     <mappers>
18         <mapper resource="com/shore/entity/DepartmentMapper.xml"/>
19         <mapper resource="com/shore/entity/UserMapper.xml"/>
20         <mapper resource="com/shore/entity/RoleMapper.xml"/>
21     </mappers>
22 </configuration>

3.4、实体类及配置文件

User.java 实体类

 1 package com.shore.entity;
 2 
 3 import java.util.List;
 4 
 5 /**
 6  * @author DSHORE/2020-3-27
 7  * 
 8  */
 9 public class User {
10     private Integer id;
11     private String name;
12     private Integer sex; //1代表“男”;0代表“女”
13     private String account;
14     private String password;
15     private String email;
16     private String telphone;
17     private Integer flag; //1代表“有效”;0代表女“无效”
18     private Department department; //单向多对一;user为多的一方
19     private List<Role> roles; //单向多对多;以user为主
20 
21     //省略了Setter和Getter和toString()方法
22 }

Department.java 实体类

 1 package com.shore.entity;
 2 
 3 import java.util.List;
 4 
 5 /**
 6  * @author DSHORE/2020-3-27
 7  * 
 8  */
 9 public class Department {
10     private Integer id;
11     private String name;
12     private String description;
13     private List<User> users;
14 
15     //省略了Setter和Getter和toString()方法
16 }

Role.java 实体类

 1 package com.shore.entity;
 2 
 3 import java.util.List;
 4 
 5 /**
 6  * @author DSHORE/2020-3-27
 7  * 
 8  */
 9 public class Role {
10     private Integer id;
11     private String name;
12     // 权限id,权限的实体类不写了,这里只是简单SSM框架流程
13     // 数据库没创建权限表
14     private Integer privilege_id;
15     private List<User> users; //单向多对多;以user为主
16 
17     //省略了Setter和Getter和toString()方法
18 }

UserRoleLink.java 实体类

 1 package com.shore.entity;
 2 
 3 /**
 4  * @author DSHORE/2020-3-27
 5  * UserRoleLink维护User和Role之间的关联关系
 6  */
 7 public class UserRoleLink {//User和Role:多对多
 8     private User user;
 9     private Role role;
10 
11     //省略了Setter和Getter方法
12 }

UserMapper.xml 配置文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 
 5 <mapper namespace="userNameSpace">
 6     <resultMap id="userResultMap" type="com.shore.entity.User">
 7         <id property="id" column="id"/>
 8         <result property="name" column="name"/>
 9         <result property="sex" column="sex"/>
10         <result property="account" column="account"/>
11         <result property="password" column="password"/>
12         <result property="email" column="email"/>
13         <result property="telphone" column="telphone"/>
14         <result property="flag" column="flag"/>
15             <!-- 多对一:一个部门对应多个用户,user是多的一方 -->
16             <association property="department" column="department_id" javaType="com.shore.entity.Department">
17                 <id property="id" column="dept_id"/>
18                 <result property="name" column="dept_name"/>
19                 <result property="description" column="description"/>
20             </association>
21             <!-- 一对多:一个用户,可以有多个角色 -->
22             <collection property="roles" ofType="com.shore.entity.Role" javaType="java.util.ArrayList">
23                 <id property="id" column="role_id"/>
24                 <result property="name" column="role_name"/>
25                 <result property="privilege_id" column="privilege_id"/>
26             </collection>
27     </resultMap>
28     
29     <!-- 查询所有 -->
30     <select id="listAll" resultMap="userResultMap">
31         select u.*,d.id dept_id,d.name dept_name,d.description,r.id role_id,r.name role_name,r.privilege_id  
32         from users u,department d,users_role ur,role r
33         where u.department_id = d.id and ur.users_id = role_id
34     </select>
35     
36     <!-- 根据账号查询 -->
37     <select id="findByAccount" parameterType="String" resultMap="userResultMap">
38         select * from users where account=#{account}
39     </select>
40 </mapper>

DepartmentMapper.xml 配置文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 
 5 <mapper namespace="departmentNameSpace">
 6     <resultMap id="departmentResultMap" type="com.shore.entity.Department">
 7         <id property="id" column="id"/>
 8         <result property="name" column="name"/>
 9         <result property="description" column="description"/>
10             <!-- 一对多:一个部门有多个用户/员工,department是一的一方 -->
11             <collection property="users" ofType="com.shore.entity.User" javaType="java.util.ArrayList">
12                 <id property="id" column="id"/>
13                 <result property="name" column="name"/>
14                 <result property="sex" column="sex"/>
15                 <result property="account" column="account"/>
16                 <result property="password" column="password"/>
17                 <result property="email" column="email"/>
18                 <result property="telphone" column="telphone"/>
19                 <result property="flag" column="flag"/>
20             </collection>
21     </resultMap>
22     
23     <!-- 查询所有 -->
24     <select id="listAll" parameterType="java.util.Map" resultMap="departmentResultMap">
25         select * from department
26     </select>
27 </mapper>

RoleMapper.xml 配置文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 
 5 <mapper namespace="roleNameSpace">
 6     <resultMap id="roleResultMap" type="com.shore.entity.Role">
 7         <id property="id" column="id"/>
 8         <result property="name" column="name"/>
 9         <result property="privilege_id" column="privilege_id"/>
10         <!-- 一对多:一个角色,可以有多个用户 -->
11         <collection property="users" ofType="com.shore.entity.User" javaType="java.util.ArrayList">
12             <id property="id" column="id"/>
13             <result property="name" column="name"/>
14             <result property="sex" column="sex"/>
15             <result property="account" column="account"/>
16             <result property="password" column="password"/>
17             <result property="email" column="email"/>
18             <result property="telphone" column="telphone"/>
19             <result property="flag" column="flag"/>
20         </collection>
21         <!-- <collection property="users" column="id" resultMap="userNameSpace.userResultMap"></collection> -->
22     </resultMap>
23     
24     <!-- 查询所有 -->
25     <select id="listAll" resultMap="roleResultMap">
26         select * from role
27     </select>
28 </mapper>

3.5、dao 层

接口类 IUserDao 及其实现类 UserDao

 1 package com.shore.dao;
 2 
 3 import java.util.List;
 4 
 5 import com.shore.entity.User;
 6 
 7 /**
 8  * @author DSHORE/2020-3-27
 9  *
10  */
11 public interface IUserDao {//接口类
12     public List<User> listAll();
13     
14     public User findByAccount(String account);
15 }
16 
17 
18 /**
19  * 下面是 IUserDao 接口类的实现类 UserDao
20  */
21 
22 
23 package com.shore.dao.impl;
24 
25 import java.util.ArrayList;
26 import java.util.List;
27 
28 import org.apache.ibatis.session.SqlSession;
29 import org.apache.ibatis.session.SqlSessionFactory;
30 import org.springframework.beans.factory.annotation.Autowired;
31 
32 import com.shore.dao.IUserDao;
33 import com.shore.entity.User;
34 
35 /**
36  * @author DSHORE/2020-3-27
37  *
38  */
39 public class UserDao implements IUserDao {
40 
41     @Autowired
42     private SqlSessionFactory sqlSessionFactory;
43     public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
44         this.sqlSessionFactory = sqlSessionFactory;
45     }
46     
47     @Override
48     public List<User> listAll() {
49         List<User> users = new ArrayList<User>();
50         SqlSession sqlSession = sqlSessionFactory.openSession();
51         users = sqlSession.selectList("userNameSpace.listAll");
52         sqlSession.close();
53         return users;
54     }
55 
56     @Override
57     public User findByAccount(String account) {
58         List<User> users = new ArrayList<User>();
59         SqlSession sqlSession = sqlSessionFactory.openSession();
60         users = sqlSession.selectList("userNameSpace.findByAccount", account);
61         sqlSession.close();
62         if (users != null && users.size() > 0) {
63             return users.get(0);
64         }
65         return null;
66     }
67 }

接口类 IDepartmentDao 及其实现类 DepartmentDao

 1 package com.shore.dao;
 2 
 3 import java.util.List;
 4 
 5 import com.shore.entity.Department;
 6 
 7 /**
 8  * @author DSHORE/2020-3-27
 9  *
10  */
11 public interface IDepartmentDao {
12     public List<Department> listAll();
13 }
14 
15 
16 /**
17  * 下面是 IDepartmentDao 接口类的实现类 DepartmentDao 
18  *
19  */
20 
21 
22 package com.shore.dao.impl;
23 
24 import java.util.ArrayList;
25 import java.util.List;
26 
27 import org.apache.ibatis.session.SqlSession;
28 import org.apache.ibatis.session.SqlSessionFactory;
29 import org.springframework.beans.factory.annotation.Autowired;
30 
31 import com.shore.dao.IDepartmentDao;
32 import com.shore.entity.Department;
33 
34 /**
35  * @author DSHORE/2020-3-27
36  *
37  */
38 public class DepartmentDao implements IDepartmentDao {
39 
40     @Autowired
41     private SqlSessionFactory sqlSessionFactory;
42     public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
43         this.sqlSessionFactory = sqlSessionFactory;
44     }
45     
46     @Override
47     public List<Department> listAll() {
48         List<Department> departments = new ArrayList<Department>();
49         SqlSession sqlSession = sqlSessionFactory.openSession();
50         departments = sqlSession.selectList("departmentNameSpace.listAll");
51         sqlSession.close();
52         return departments;
53     }
54 }

接口类 IRoleDao 及其实现类 RoleDao

 1 package com.shore.dao;
 2 
 3 import java.util.List;
 4 
 5 import com.shore.entity.Role;
 6 
 7 /**
 8  * @author DSHORE/2020-3-27
 9  *
10  */
11 public interface IRoleDao {
12     public List<Role> listAll();
13 }
14 
15 
16 /**
17  * 下面是 IRoleDao 接口类的实现类 RoleDao 
18  *
19  */
20 
21 
22 package com.shore.dao.impl;
23 
24 import java.util.ArrayList;
25 import java.util.List;
26 
27 import org.apache.ibatis.session.SqlSession;
28 import org.apache.ibatis.session.SqlSessionFactory;
29 import org.springframework.beans.factory.annotation.Autowired;
30 
31 import com.shore.dao.IRoleDao;
32 import com.shore.entity.Role;
33 
34 /**
35  * @author DSHORE/2020-3-27
36  *
37  */
38 public class RoleDao implements IRoleDao {
39 
40     @Autowired
41     private SqlSessionFactory sqlSessionFactory;
42     public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
43         this.sqlSessionFactory = sqlSessionFactory;
44     }
45     
46     @Override
47     public List<Role> listAll() {
48         List<Role> roles = new ArrayList<Role>();
49         SqlSession sqlSession = sqlSessionFactory.openSession();
50         roles = sqlSession.selectList("roleNameSpace.listAll");
51         sqlSession.close();
52         return roles;
53     }
54 }

3.6、service 层

接口类 IUserService 及其实现类 UserService

 1 package com.shore.service;
 2 
 3 import com.shore.entity.User;
 4 
 5 /**
 6  * @author DSHORE/2020-3-27
 7  *
 8  */
 9 public interface IUserService {
10     public User findByAccount(String account);
11 }
12 
13 
14 /**
15  * 下面是 IUserService 接口类的实现类 UserService 
16  *
17  */
18 
19 
20 package com.shore.service.impl;
21 
22 import org.springframework.beans.factory.annotation.Autowired;
23 
24 import com.shore.dao.IUserDao;
25 import com.shore.entity.User;
26 import com.shore.service.IUserService;
27 
28 /**
29  * @author DSHORE/2020-3-27
30  *
31  */
32 public class UserService implements IUserService {
33 
34     @Autowired
35     private IUserDao userDao;
36     public void setUserDao(IUserDao userDao) {
37         this.userDao = userDao;
38     }
39 
40     @Override
41     public User findByAccount(String account) {
42         return userDao.findByAccount(account);
43     }
44 }

3.7、controller 控制层/器

 1 package com.shore.action;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Controller;
 5 import org.springframework.ui.Model;
 6 import org.springframework.web.bind.annotation.RequestMapping;
 7 
 8 import com.shore.entity.User;
 9 import com.shore.service.IUserService;
10 
11 /**
12  * @author DSHORE/2020-3-27
13  *
14  */
15 @Controller
16 @RequestMapping(value="userAction")
17 public class UserAction {
18     @Autowired //自动装配:@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作
19     private IUserService userService;
20 
21     public void setUserService(IUserService userService) {
22         this.userService = userService;
23     }
24     
25     //用户登录
26     @RequestMapping(value = "/login.action")
27     public String login(Model model, User user) {
28         String account = user.getAccount().trim();
29         String password = user.getPassword().trim();
30         User dbUser = userService.findByAccount(account);
31         if (dbUser != null) {
32             if (dbUser.getFlag().equals(1)) { //有效用户
33                 if (password.equals(dbUser.getPassword())) {
34                     model.addAttribute("message", "登录成功!");
35                     return "success";
36                 } else {
37                     model.addAttribute("message", "密码错误,请重新登录!");
38                     return "error";
39                 }
40             } else {
41                 model.addAttribute("message", "该用户已被注销,请联系管理员!");
42                 return "error";
43             }
44         } else {
45             model.addAttribute("message", "账号错误,请重新登录!");
46             return "error";
47         }
48     }
49 }

3.8、Spring 配置文件(beans.xml)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
 4     xmlns:tx="http://www.springframework.org/schema/tx"
 5     xsi:schemaLocation="
 6        http://www.springframework.org/schema/beans
 7        http://www.springframework.org/schema/beans/spring-beans.xsd
 8        http://www.springframework.org/schema/tx
 9        http://www.springframework.org/schema/tx/spring-tx.xsd
10        http://www.springframework.org/schema/aop
11        http://www.springframework.org/schema/aop/spring-aop.xsd">
12 
13     <!-- 1、dataSource -->
14     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
15         <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
16         <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:shoreid"></property>
17         <property name="user" value="zhangsan"></property>
18         <property name="password" value="123456"></property>
19     </bean>
20     
21     <!-- 2、创建SqlSessionFactory的bean,把dataSource注入其中 -->
22     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
23         <property name="dataSource" ref="dataSource"></property>
24         <property name="configLocation" value="classpath:conf/mybatis.xml"/>
25     </bean>
26     
27     <!-- 3、注入DAO -->
28     <bean id="userDao" class="com.shore.dao.impl.UserDao">
29         <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
30     </bean>
31     <bean id="roleDao" class="com.shore.dao.impl.RoleDao">
32         <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
33     </bean>
34     <bean id="departmentDao" class="com.shore.dao.impl.DepartmentDao">
35         <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
36     </bean>
37     
38     <!-- 4、注入Service -->
39     <bean id="userService" class="com.shore.service.impl.UserService">
40         <property name="userDao" ref="userDao"></property>
41     </bean>
42     
43     <!-- 5、注入Action -->
44     <bean id="userAction" class="com.shore.action.UserAction">
45         <property name="userService" ref="userService"></property>
46     </bean>
47     
48     <!-- ============== 6、配置事务管理 ============== -->
49     <!-- 事务管理  -->
50     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
51         <property name="dataSource" ref="dataSource"></property>
52     </bean>
53     
54     <!-- 配置事务增强(DAO) -->
55     <!-- read:get、list、find——如果出现异常,不需要回滚
56     update:save、delete、update——需要回滚 -->
57     <tx:advice transaction-manager="transactionManager" id="transactionAdvice">
58         <tx:attributes>
59             <tx:method name="get*" read-only="true"/>
60             <tx:method name="find*" read-only="true"/>
61             <tx:method name="list*" read-only="true"/>
62             <tx:method name="search*" read-only="true"/>
63             <tx:method name="*" read-only="false" rollback-for="Throwable"/>
64         </tx:attributes>
65     </tx:advice>
66     
67     <!-- AOP配置:配置切入点表达式 -->
68     <aop:config>
69         <aop:pointcut expression="execution(* com.shore.dao.impl.*.*(..))" id="pt"/>
70         <aop:advisor advice-ref="transactionAdvice" pointcut-ref="pt"/>
71     </aop:config>
72 </beans>

3.9、SpringMVC核心配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xmlns:tx="http://www.springframework.org/schema/tx"
 6     xmlns:context="http://www.springframework.org/schema/context"
 7     xsi:schemaLocation="
 8        http://www.springframework.org/schema/beans
 9        http://www.springframework.org/schema/beans/spring-beans.xsd
10        http://www.springframework.org/schema/mvc
11        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
12        http://www.springframework.org/schema/context
13        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
14     
15     <!-- 1、映射器(可选) -->
16     <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
17     
18     <!-- 2、适配器(可选) -->
19     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>
20     
21     <!-- 3、控制器 -->
22     <context:component-scan base-package="com.shore.action"/>
23     
24     <!-- 4、视图解析器(可选,如果写了视图逻辑名,就必须要配置) -->
25     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
26         <property name="prefix" value="/"></property>
27         <property name="suffix" value=".jsp"></property>
28     </bean>
29 </beans>

3.10、前端页面
index.jsp

1 <body>
2     <jsp:forward page="login.jsp"></jsp:forward>
3 </body>

success.jsp 和 error.jsp 内容一样

1 <body>
2     ${message}
3 </body>

login.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'login.jsp' starting page</title>
13     
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22 
23   </head>
24   <style> 
25        table tr th{ border:1px solid #C1C1C1; font-size: 16px;}
26        table,table tr td { border:1px solid #C1C1C1; }
27        table {  30%; min-height: 25px; line-height: 25px; border-collapse: collapse; padding:2px; margin:auto;}
28        a{text-decoration: none;font-weight: bold;}
29   </style>
30    
31   <body>
32        <form action="userAction/login.action" method="post">
33         <table>
34             <tr>
35                 <td align="center">账号</td>
36                 <td><input type="text" name="account" value="" style=" 60%"/></td>
37             </tr>
38                <tr>
39                 <td align="center">密码</td>
40                 <td><input type="password" name="password" value="" style=" 60%"/></td>
41             </tr>
42                <tr>
43                 <td colspan="2" align="center">
44                     <input type="submit" name="submit" value="登录"/>&nbsp;&nbsp;
45                     <input type="reset" name="reset" value="取消"/>
46                 </td>
47             </tr>
48         </table>
49      </form>
50   </body>
51 </html>

到此已完结!有任何问题,可留言。

 附录 

dao层,测试类代码(UserDaoTest)

 1 package test;
 2 
 3 import java.util.List;
 4 
 5 import org.junit.Test;
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.context.support.ClassPathXmlApplicationContext;
 8 
 9 import com.shore.dao.IDepartmentDao;
10 import com.shore.dao.IRoleDao;
11 import com.shore.dao.IUserDao;
12 import com.shore.entity.Department;
13 import com.shore.entity.Role;
14 import com.shore.entity.User;
15 
16 /**
17  * @author DSHORE/2020-3-27
18  *
19  */
20 public class UserDaoTest {
21     ApplicationContext context = new ClassPathXmlApplicationContext("conf/beans.xml");
22     IUserDao userDao = (IUserDao) context.getBean("userDao");
23     IRoleDao roleDao = (IRoleDao) context.getBean("roleDao");
24     IDepartmentDao departmentDao = (IDepartmentDao) context.getBean("departmentDao");
25     
26     @Test //根据账号查询
27     public void testFindByAccount() {
28         System.out.println(userDao.findByAccount("lisi"));
29         /* 返回值:
30          * User [id=2, name=李四, sex=0, account=lisi, password=123456, email=12345678, telphone=12345678@qq.com, flag=0, department=null, roles=[]]
31          * 这里只需要查询该账号是否存在,后面的department=null, roles=[],没有值,不再做处理,为空也没关系。
32          * */
33     }
34     
35     @Test //查询所有用户(含关联表的数据)
36     public void testListAllUser() {
37         List<User> users = userDao.listAll();
38         for (User user : users) {
39             System.out.println(user);
40             /* 返回值:
41              * User [id=2, name=李四, sex=0, account=lisi, password=123456, email=12345678, telphone=12345678@qq.com, flag=0, department=Department [id=3, name=软件开发部, description=软件开发, users=null], roles=[Role [id=3, name=普通管理员, privilege_id=1, users=null], Role [id=2, name=财务部管理员, privilege_id=3, users=null], Role [id=1, name=超级管理员, privilege_id=2, users=null]]]
42              * User [id=3, name=王五, sex=1, account=wangwu, password=123456, email=12345678, telphone=12345678@qq.com, flag=1, department=Department [id=2, name=财务部, description=财务, users=null], roles=[Role [id=3, name=普通管理员, privilege_id=1, users=null], Role [id=2, name=财务部管理员, privilege_id=3, users=null], Role [id=1, name=超级管理员, privilege_id=2, users=null]]]
43              * User [id=4, name=赵六, sex=1, account=zhaoliu, password=123456, email=12345678, telphone=12345678@qq.com, flag=1, department=Department [id=3, name=软件开发部, description=软件开发, users=null], roles=[Role [id=3, name=普通管理员, privilege_id=1, users=null], Role [id=2, name=财务部管理员, privilege_id=3, users=null], Role [id=1, name=超级管理员, privilege_id=2, users=null]]]
44              * */
45         }
46         System.out.println(userDao.listAll().get(0).getDepartment().getName());//返回值:人事部
47         System.out.println(userDao.listAll().get(0).getRoles().get(0).getName());//返回值:普通管理员
48         
49     }
50     
51     @Test //查询所有角色
52     public void testListAllRole() {
53         List<Role> roles = roleDao.listAll();
54         for (Role role : roles) {
55             System.out.println(role);
56             /* 返回值:
57              * Role [id=1, name=超级管理员, privilege_id=2, users=[User [id=1, name=超级管理员, sex=null, account=null, password=null, email=null, telphone=null, flag=null, department=null, roles=null]]]
58              * Role [id=2, name=财务部管理员, privilege_id=3, users=[User [id=2, name=财务部管理员, sex=null, account=null, password=null, email=null, telphone=null, flag=null, department=null, roles=null]]]
59              * Role [id=3, name=普通管理员, privilege_id=1, users=[User [id=3, name=普通管理员, sex=null, account=null, password=null, email=null, telphone=null, flag=null, department=null, roles=null]]]
60              * 
61              * 1、后面users中的id和name都和Role表中的一模一样,是应为他们同名了,到对应的xxxMapper.xml中,对应的sql语句中取个别名即可解决此问题。
62              * 2、users的中值为空,不再做处理,处理方法:看testListAllUser()方法的处理流程
63              * */
64         }
65     }
66     
67     @Test //查询所有角色
68     public void testListAllDepartment() {
69         List<Department> departments = departmentDao.listAll();
70         for (Department department : departments) {
71             System.out.println(department);
72             /* 返回值:
73              * Department [id=1, name=人事部, description=hr, users=[User [id=1, name=人事部, sex=null, account=null, password=null, email=null, telphone=null, flag=null, department=null, roles=null]]]
74              * Department [id=2, name=财务部, description=财务, users=[User [id=2, name=财务部, sex=null, account=null, password=null, email=null, telphone=null, flag=null, department=null, roles=null]]]
75              * Department [id=3, name=软件开发部, description=软件开发, users=[User [id=3, name=软件开发部, sex=null, account=null, password=null, email=null, telphone=null, flag=null, department=null, roles=null]]]
76              *
77              * 1、后面users中的id和name都和Department表中的一模一样,是应为他们同名了,到对应的xxxMapper.xml中,对应的sql语句中取个别名即可解决此问题。
78              * 2、users的中值为空,不再做处理,处理方法:看testListAllUser()方法的处理流程
79              * */
80         }
81     }
82 }

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/12548440.html

版权声明:欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

原文地址:https://www.cnblogs.com/dshore123/p/12548440.html